Selenium:设置元素等待、上传文件、下载文件

前言:在工作和学习selenium自动化过程中记录学习知识点,深化知识点

1. 设置元素等待

元素定位之元素等待--

WebDriver提供了两种类型的等待:显示等待和隐式等待。

1.1 显示等待

显式等待使WebDriver等待某个条件处理时继续执行,否则在达到最大时长时抛弃超时异常(TimeoutException)。


from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC wd = webdriver.Chrome() wd.get('https://www.baidu.com/') a = WebDriverWait(wd,10).until(EC.presence_of_element_located((By.ID,"kw"))) a.send_keys('selenium')

WebDriverWait类是由WebDriver提供的等待方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。

WebDriverWait(driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None)

driver:浏览器驱动
timeout:最长超时时间,默认以秒为单位
poll_frequency:检测的间隔(步长)时间,默认为0.5S
ignored_exceptions:超时后的异常信息,默认情况下抛NoSuchElementException异常

WebDriverWait()一般和until()或until_not()方法配合使用。

until(method, message='')

调用该方法提供的驱动程序作为一个参数,直到返回值为True。

until_not(method, message='')

调用该方法提供的驱动程序作为一个参数,直到返回值为False。

在上面那个例子中,通过as关键字将expected_conditions重命名为EC,并调用presence_of_element_located()方法判断元素是否存在。

expected_conditions类提供的预期条件判断的方法如下所示:

title_is:判断当前页面的标题是否等于预期
title_contains:判断当前页面的标题是否包含预期字符串
presence_of_element_located:判断元素是否被加在 DOM树里,并不代表元素一定可见
visibility_of_element_located:判断元素是否可见(可见代表元素非隐藏,并且元素的宽和高都不等于0)
visibility_of:与上一个方法作用相同,只是上一个方法参数为,该方法接收的参数为定位后的元素
presence_of_all_elements_located:判断是否至少有一个元素存在于DOM树中。例如,在页面中有n个元素的class为“wp”,那么只要有一个存在就返回True
text_to_be_present_in_element:判断某个元素中的text是否包含了预期的字符串
text_to_be_present_in_element_value:判断某个元素的value属性是否包含了预期的字符串
frame_to_be_available_and_switch_to_it:判断该表单是否可用切换进去,如果可用,返回True并且switch进去,否则返回False
invisibility_of_element_located:判断某个元素是否不存在于DOM树或不可见
element_to_be_clickable:判断元素是否可见并且是可以点击的
staleness_of:等到一个元素从DOM树中移除
element_to_be_selected:判断某个元素是否被选中,一般用在下拉列表
element_selection_state_to_be:判断某个元素的选择状态是否符合预期
element_located_selection_state_to_be:与上一个方法作用相同,只是上一个方法参数为单位后的元素,该方法接收的参数为定位
alert_is_present:判断页面上是否存在alert

除expected_conditions所提供的丰富的预期条件判断方法外,还可以使用is_displayed()方法来判断元素是否可见。


from selenium import webdriver from time import sleep,ctime wd = webdriver.Chrome() wd.get('https://www.baidu.com/') print(ctime()) for i in range(10): try: el = wd.find_element_by_id("kw22") if el.is_displayed(): break except:pass sleep(1) else: print("time out") wd.close() print(ctime())

相对来说,这种方式更容易理解,通过for循环10次,每次循环判断元素的is_displayed()状态是否为True。如果为True,则break跳出循环;否则sleep(1)后继续循环判断,直到10次循环结束后,打印“time out”信息。

执行结果如下:

1.2 隐式等待

隐式等待是通过一定的时长等待页面上某元素加载完成。如果超出了设置的时长元素还没有被加载,则抛出NoSuchElementException异常。WebDriver提功力implicitly_wait()方法来实现隐式等待,默认设置为0。它的用法相对来说要简单得多。


from selenium import webdriver from selenium.common.exceptions import NoSuchElementException from time import ctime wd = webdriver.Chrome() #设置隐式等待为10秒 wd.implicitly_wait(10) wd.get('https://www.baidu.com/') try: print(ctime()) wd.find_element_by_id("kw22").send_keys('selenium') except NoSuchElementException as e: print(e) finally: print(ctime())

Implicitly_wait()默认参数的单位为秒,本例中设置等待时长为10秒。首先这10秒并非一个固定的等待时间。它并不影响脚本的执行速度。其次,它并不针对页面上的某一个元素进行等待。当脚本执行到某个元素定位时,如果元素可以定位,则继续执行;如果元素定位不到,则它将以循环查询的方式不断地判断元素是否被定位到。假设在第3秒定位到了元素,则继续执行,若知道超出设置时长(10秒)还没有定位到元素,则抛出异常。

在上面的例子中,显然百度输入框的定位id=kw22是有误的,通过打印的两次时间可以看出,当执行对百度输入框的操作时,超过了10秒的等

1.3 sleep休眠方法

在前面我们就使用过sleep方法了,只不过没有详细的介绍,现在就把这个归入到这个大标题中来介绍下。

有时候我们希望脚本在执行到某一个位置时做固定时间的休眠,尤其是在脚本调试中。这时可以使用sleep()方法,需要说明的是,sleep()方法由python的time模块提供。


from selenium import webdriver from time import sleep wd = webdriver.Chrome() wd.get('https://www.baidu.com/') sleep(2) wd.find_element_by_id("kw").send_keys("selenium") wd.find_element_by_id("su").click() sleep(5) wd.quit()

当执行到sleep()方法时会固定休眠一定的时长,然后再继续执行。sleep()方法默认参数以秒为单位,如果设置时长小于1秒,则可以用小数表示,如果sleep(0.5)表示休眠0.5秒。

2. 上传文件

上传文件是比较常见的Web功能之一,但WebDriver并没有提供专门用于上传的方法,如何实现上传操作关键在于上传文件的思路。

一般Web页面的上传功能的操作需要点击“上传”按钮后打开本地的Window窗口,从窗口中选择本地文件进行上传。而WebDriver是无法操作Windows控件的,所以,对于初学者来说,一般思路会卡在如何识别Window控件这个问题上。

对于Web页面的上传功能实现一般有一下两种方式。

普通上传:普通的附件上传是将本地文件的路径作为一个值放在input标签中,通过form表单将这个值提交给服务器。
插件上传:一般是指基于Flash、JavaScript或Ajax等技术所实现的上传功能。

插件上传不适合放在自动化里面讲解,可能会放在python高级编程里面讲解。对于通过input标签实现的上传功能,可以将其看作是一个输入框,通过send_keys()指定本地文件路径的方式实现文件上传。

html代码:


<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <div class="row-fluid"> file:<input type="file" name="file" /> </div> </body> </html>

通过浏览器打开,效果如下图所示:


from selenium import webdriver wd = webdriver.Chrome() wd.get('http://127.0.0.1:8020/day01/index.html') #定位上传按钮,添加本地文件 wd.find_element_by_name("file").send_keys('E:\1.png')

通过这种方法上传,就避免了操作Windows控件的步骤。如果能找到上传的input标签,那么基本上就可以通过send_keys()方法向其输入一个文件地址来实现上传。

3. 下载文件

WebDriver允许我们设置默认的文件下载路径,也就是说,文件会自动下载并且存放到设置的目录中。下面以谷歌浏览器为例,执行文件的下载。


from selenium import webdriver import os options = webdriver.ChromeOptions() prefs = {'profile.default_content_settings.popups':0,'download.default_directory':'E:\'} options.add_experimental_option('prefs',prefs) wd = webdriver.Chrome(executable_path=r'E:webdriverschromedriver.exe',chrome_options=options) wd.get('')#输入要下载的文件所在网页 wd.find_element_by_xpath('').click()#点击文件所在位置的元素

download.default_directory:指定路径
profile.default_content_settings.popups:0 为屏蔽弹窗,1 为开启弹窗

不同的浏览器设置方法也不同,以上例子值针对谷歌浏览器。火狐浏览器的下载设置就是其他类型的方法了。

 最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】


http://www.ppmy.cn/ops/108424.html

相关文章

【Python】数据可视化之核密度

KDEPlot&#xff08;Kernel Density Estimate Plot&#xff0c;核密度估计图&#xff09;是seaborn库中一个用于数据可视化的函数&#xff0c;它基于核密度估计&#xff08;KDE&#xff09;这一非参数统计方法来估计数据的概率密度函数。KDEPlot能够直观地展示数据的分布特征&a…

RestTemplateRibbonOpenFeign

网络模型 OSI七层模型 RestTemplate Ribbon 在微服务中的ribbon 实现负载均衡服务间调用的三种方式 ribbon其他负载均衡策略 OpenFeign 实战

空气质量题数据处理与分析

Python在数学建模中的应用 缺失值检查异常值检查描述性统计(绘制热力图、折线图、季节性图)计算描述性统计(count mean std min 25% 50% 75% max) import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns# 读取CSV文件&#xff0c;尝…

仕考网:事业编面试全流程介绍

1.进入考场 工作人员会检查考生的身份证、准考证以及随身携带物品&#xff0c;可以带食物和水 2.进入候考室 进入候考室&#xff0c;工作人员会再次确认考生信息 3.抽签 考生到齐后&#xff0c;工作人员会组织考生抽签&#xff0c;登记抽签序号、信息确认、发放号码牌 4.…

【区块链 + 基层治理】乐山新型智慧社区 | FISCO BCOS应用案例

疾病预防控制体系是保护人民健康、保障公共卫生安全、维护经济社会稳定的重要保障。当前济南市市中区部分 老旧小区存在居民信息采集困难、易感人群管理困难、外部流动人口活动频繁、缺乏信息化防控手段、信息共享不足等突出问题&#xff0c;无法满足国家对疫情防控的常态化、长…

第九届“创客中国”生成式人工智能(AIGC)中小企业创新创业大赛圆满落幕

9月5日,第九届“创客中国”生成式人工智能(AIGC)中小企业创新创业大赛在南昌降下了帷幕。工业和信息化部网络安全产业发展中心(工业和信息化部信息中心)主任付京波;江西省工业和信息化厅党组成员、副厅长郭启东;南昌市委常委、市委秘书长、办公室主任赵捷;市中小企业局党组书记…

python 解析数据后保存到excel

openpyxl 特点&#xff1a; 支持读写Excel 2010 xlsx/xlsm/xltx/xltm文件格式。可以操作Excel的几乎所有功能&#xff0c;如样式、图表、图片等。适用于复杂的Excel操作&#xff0c;例如公式、数据验证和条件格式。社区支持较好&#xff0c;文档比较完善。 优点&#xff1a; 功…

0.ffmpeg面向对象oopc

因为查rtsp相关问题&#xff0c;接触了下ffmpeg源码&#xff0c;发现它和linux内核一样&#xff0c;虽然都是c写的&#xff0c;但是都是面向对象的思想&#xff0c;c的面向对象称之为oopc。 这让我想起来一件好玩的事&#xff0c;有些搞linux内核驱动的只会c的开发人员不知道l…

打造安心宠物乐园:EasyCVR平台赋能猫咖/宠物店的智能视频监控解决方案

随着宠物经济的蓬勃发展&#xff0c;宠物店与猫咖等场所对顾客体验、宠物安全及健康管理的需求日益提升。然而&#xff0c;如何确保这些场所的安全与秩序&#xff0c;同时提升顾客体验&#xff0c;成为了经营者们关注的焦点。引入高效、智能的视频监控方案&#xff0c;不仅能够…

2005-2020年各省乡村高质量发展指数数据

2005-2020年各省乡村高质量发展指数数据 1、时间&#xff1a;2005-2020年 2、来源&#xff1a;农村年鉴、统计年鉴、人口和就业统计年鉴 2、指标&#xff1a;乡村高质量发展指数、每公顷农业机械动力&#xff08;千瓦/公顷&#xff09;、农田节水灌溉率、人均粮食产量&#…

【小设计】基于宏实现的C++ 可复用setter 和getter设计

前言 最近在开发unity游戏的时候&#xff0c;面对庞大复杂的不同类之间进行数据交换和调用&#xff0c;我们必须做好类数据的信息管理&#xff0c;往往我希望暴露给其他类越少越好&#xff0c;这时候我就利用了C#的一个语言特性 public PlayerStateMachine stateMachine{get;…

TinyWebSever源码逐行注释(六)_ sql_connection.cpp

前言 项目源码地址 项目详细介绍 项目简介&#xff1a; Linux下C轻量级Web服务器&#xff0c;助力初学者快速实践网络编程&#xff0c;搭建属于自己的服务器. 使用 线程池 非阻塞socket epoll(ET和LT均实现) 事件处理(Reactor和模拟Proactor均实现) 的并发模型使用状态机…

C++(一)----C++基础

1.C的发展史 C语言诞生后&#xff0c;很快普及使用&#xff0c;但是随着编程规模增大且越来越复杂&#xff0c;并且需要高度的抽象和建模时&#xff0c;C语言的诸多短板便表现了出来&#xff0c;为了解决软件危机&#xff0c;上世纪八十年代&#xff0c;计算机界提出了oop&…

【正式版】深度技术Win10系统22H2最新版本:免费下载!

今日&#xff0c;系统之家小编给大家分享2024年最新发布的深度技术Win10正式版系统&#xff0c;该版本系统基于微软官方最新Windows10 22H2 19045.4842 64位专业版进行离线制作&#xff0c;确保安全无病毒&#xff0c;且修复了部分系统Bug&#xff0c;整体操作体验感更出色。系…

成功之路:如何获得机器学习和数据科学实习机会

一年内获得两份实习机会的数据科学家的建议和技巧 欢迎来到雲闪世界。在当今竞争激烈的就业市场中&#xff0c;获得数据科学实习机会可以成为您在科技领域取得成功的门票。 但申请者如此之多&#xff0c;你该如何脱颖而出呢&#xff1f; 无论您是学生、应届毕业生还是想要转行…

【DS18B20 简单开发】

DS18B20 是一种数字温度传感器&#xff0c;由 Maxim Integrated 生产。它提供了一个非常简单的方式来将温度测量集成到微控制器系统中。以下是关于 DS18B20 的一些关键特性&#xff1a; 单总线协议&#xff1a;DS18B20 使用单总线&#xff08;1-Wire&#xff09;数字通信协议&…

JS设计模式之“单孑独立” - 单例模式

image.png 引言 在JavaScript开发中&#xff0c;单例模式是一种常见且实用的设计模式一。 单例模式的核心思想是&#xff1a;确保一个类只有一个实例对象&#xff0c;并且该对象可以在应用程序的任何地方被共享和访问。通过使用单例模式&#xff0c;我们可以简化代码、节省资…

如何快速练习键盘盲打

盲打是指在不看键盘的情况下进行打字&#xff0c;这样可以显著提高打字速度和效率。以下是一些练习盲打的方法&#xff1a; 熟悉键盘布局&#xff1a;首先&#xff0c;你需要熟悉键盘上的字母和符号的位置。可以通过键盘图或者键盘贴纸来帮助记忆。 使用在线打字练习工具&…

Reflection 70B 遭质疑基模为 Llama 3;Replit Agent:编程 0 基础适用丨 RTE 开发者日报

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

[SWPUCTF 2022 新生赛]

目录 [SWPUCTF 2022 新生赛]ez_rce 什么是poc&#xff1f; [SWPUCTF 2022 新生赛]where_am_i [SWPUCTF 2022 新生赛]js_sign [SWPUCTF 2022 新生赛]xff ​[SWPUCTF 2022 新生赛]numgame call_user_func()函数 ::双冒号运算符 [SWPUCTF 2022 新生赛]ez_sql [SWPUCTF 2…