『心善渊』Selenium3.0基础 — 24、Selenium的expected_conditions模块详细介绍
提示:下文中
expected_conditions
模块有时简称为EC
模块。
1、EC
模块介绍
expected_conditions
是Selenium的一个模块,主要用于对页面元素的加载进行判断,包括元素是否存在,可点击等等。expected_conditions
模块的使用场景一般有两种:- 直接在断言中使用 。
- 与
WebDriverWait
配合使用,显示等待页面上元素出现或者消失。
- 一般情况下,我们在使用
expected_conditions
模块时,都会对其进行重命名,通过as
关键字对其重命名为EC
。from selenium.webdriver.support import expected_conditions as EC
2、EC
模块常用类
title_is(title)
方法:用于判断网页title
是否是特定文本(英文区分大小写),若完全相同则返回True,否则返回False。title_contains(title)
方法:用于判断网页title
是否包含特定文本(英文区分大小写),若包含则返回True,不包含返回False。presence_of_element_located(locator)
方法(重点,常用):用于判断一个元素存在于页面DOM树中,存在则返回元素本身,不存在则报错。
locator
为一个(by, path)
元祖,这个(by, path)
的by
是Selenium的一个类selenium.webdriver.common.by.By
,包括CLASS_NAME
,CSS_SELECTOR
,ID
,LINK_TEXT,NAME
,PARTIAL_LINK_TEXT
,TAG_NAME
和XPATH
,和我们8种基本元素定位中使用的方法相同。presence_of_all_elements_located(locator)
方法:用于判断定位的元素范围内,至少有一个元素存在于页面当中,存在则以list形式返回元素本身,不存在则报错。visibility_of_element_located(locator)
方法:用于判断特定元素是否存在于DOM树中并且可见,可见意为元素的高和宽都大于0,元素存在返回元素本身,否则返回False。
这个类和presence_of_element_located(locator)
有点像,但后者只强调元素存在于DOM树中,可见不可见无所谓,而前者要求必须高和宽必须都大于0,因此后者在性能上会稍微快一点点。visibility_of(element)
方法:visibility_of(element)
同上面visibility_of_element_located(locator)
,不过参数从locator
的元组变为元素。invisibility_of_element_located(locator)
方法:判断元素是否隐藏。text_to_be_present_in_element(locator,text)
方法:判断给定文本是否出现在特定元素中,若存在则返回True,不存在返回False。text_to_be_present_in_element_value(locator,text)
方法:判断某文本是否是存在于特定元素的value
值中,存在则返回True,不存在则返回False,对于查看没有value
值的元素,也会返回False。frame_to_be_available_and_switch_to_it(locator)
方法:判断某个frame
是否可以切换过去,若可以则切换到该frame
,否则返回False 。element_to_be_clickable(locator)
方法:判断某元素是否可访问并且可启用,比如能够点击,若可以则返回元素本身,否则返回False。staleness_of(element)
方法:判断某个元素是否不再附加于于DOM树中,不再附加的话返回True,依旧存在返回False。可以用于判断页面是否刷新了。alert_is_present
方法:判断alert
是否存在,若存在则切换到alert
,若不存在则返回False。element_to_be_selected(element)
方法:判断某元素是否被选中。element_located_to_be_selected(locator)
方法:判断某元素是否被选,locator
为一个(by, path)
元祖。element_selection_state_to_be (element, is_selected)
方法:判断某元素的选中状态是否与预期相同,相同则返回True,不同则返回False。element_located_selection_state_to_be(locator, is_selected)
方法: 判断某元素是否与预期相同,相同则返回True,不同则返回False,locator
为一个(by, path)
元祖。
总结:这些方法与
WebDriverWait
类和until()
、until_not()
方法组合能使用,够实现很多判断功能,如果能自己灵活封装,将会大大提高脚本的稳定性。
3、EC
模块的使用
我们练习expected_conditions
模块中两个功能,其他功能参照即可。
# 1.导入selenium
from selenium import webdriver
from time import sleep
from selenium.webdriver.support import expected_conditions as EC
# 2.打开Chrome浏览器
driver = webdriver.Chrome()
# 3.打开注册A页面
url = "https://www.baidu.com"
driver.get(url)
sleep(3)
# 4.EC模块的使用
"""
1.EC模块单独使用的语法
EC.方法(参数)(driver) 或 EC.方法(参数).__call__(driver)
2.说明
我们可以查看title_is()源码
class title_is(object):
def __init__(self, title):
self.title = title
def __call__(self, driver):
return self.title == driver.title
我们可以看到,直接使用EC模块,就需要调用__call__()方法
而__call__()方法是魔法方法,调用方式,就是上面1所说的两种方式。
"""
# 4.1 EC模块中title_is()的使用
# 判断网页title是否是特定文本
# 正确匹配
title_is_result_True = EC.title_is("百度一下,你就知道")(driver)
print("title_is结果 =", title_is_result_True)
# 错误匹配
title_is_result_False = EC.title_is("百度一下,你就知道1").__call__(driver)
print(f"title_is结果 = {title_is_result_False}")
# 4.2 EC模块中presence_of_element_located(locator)的使用
# presence_of_all_elements_located(locator)同理
# 定位元素单数
# 定位百度首页输入框
# 4.2.1编写locator(定位器)
# 正确定位
input_locator_True = ("id", "kw")
# 错误定位
input_locator_False = ("id", "kw1")
# 4.2.2 执行EC模块方法
element_located_True = EC.presence_of_element_located(input_locator_True).__call__(driver)
print("element_located结果 =", element_located_True)
# 定位不到会报错
# element_located_False = EC.presence_of_element_located(input_locator_False)(driver)
# 5.关闭浏览器
sleep(2)
driver.quit()
4、EC
模块综合使用
WebDriverWait
类和until()
方法和EC
模块这种组合的使用方法练习。
(1)title_is(title)示例
这个title_is(title)
例子很简单,作为一个入门示例。
"""
1.学习目标
掌握EC模块中title_is的使用
2.操作步骤(语法)
2.1 EC模块通用使用方法
EC模块通常和WebDriverWait配合使用
WebDriverWait(driver,timeout).until(EC.方法)
2.2 title_is(指定的标题)
判断页面标题是否和指定的标题一致,如果一致返回True,不一致返回Palse
result=WebDriverWait(driver,timeout).until(EC.title_is(指定的标题))
print(result)
3.需求
使用title_is判断百度首页的标题title
"""
# 1.导入selenium
from selenium import webdriver
from time import sleep
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
# 2.打开谷歌浏览器
driver = webdriver.Chrome()
# 3.输入网址
url = "https://www.baidu.com"
driver.get(url)
sleep(3)
# 4.验证页面标题
result = WebDriverWait(driver, 5).until(EC.title_is("百度一下,你就知道"))
print("result =", result)
# 5.关闭浏览器
sleep(2)
driver.quit()
"""
输出结果:
result = True
"""
(2)presence_of_element_located(locator)示例(常用)
这两个方法比较常用:
presence_of_element_located(locator)
: 单个元素定位presence_of_all_elements_located(locator)
:定位一组元素,复数形式
以presence_of_element_located(locator)
为例:
"""
1.学习目标:
必须掌握EC模块中元素定位方法presence_of_element_located(locator)
2.语法
2.1 presence_of_element_located(locator) 单个元素定位
2.2 presence_of_all_elements_located(locator) 定位一组元素,复数形式
其实是将find_element()方法做二次封装
find_element_by_id("id属性值")
2.3 locator--定位器是一个数据类型元组
("元素定位方式","方式对应的值")
("id","id属性值")
("class name","class属性值")
("xpath","xpath表达式")
("partial link text","连接部分文本")
("name","name属性值")
具体可以看selenium.webdriver.common.by.By这个类
第一个参数可写形式
By.ID = "id",也就是(By.ID ,"id属性值")
By.XPATH = "xpath", (By.XPATH,"xpath表达式")
2.3 总结:
EC模块中的方法一般和显示等待配合使用
EC模块使用步骤:
1.编写定位器locator
2.配合webdriverWait一起使用
3.需求
使用EC模块中元素定位方法presence_of_element_located(locator)
定位百度首页搜索框
"""
# 1.导入selenium
from selenium import webdriver
from time import sleep
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
# 2.打开Chrome浏览器
driver = webdriver.Chrome()
# 3.打开页面
url = "https://www.baidu.com"
driver.get(url)
sleep(3)
# 4.EC模块的使用
# 4.1 定位单个元素
# 4.1.1 编写locator(定位器)
# 定位百度首页输入框
input_locator = ("id", "kw")
# 定位百度首页"百度一下"
button_loator = ("id", "su")
# 4.1.2 定位元素
# 结合显式等待和EC模块实现元素定位
bd_input = WebDriverWait(driver, 5).until(EC.presence_of_element_located(input_locator))
bd_button = WebDriverWait(driver, 5).until(EC.presence_of_element_located(button_loator))
# 5.操作元素
bd_input.send_keys("『心善渊』Selenium3.0基础")
sleep(2)
bd_button.click()
# 6.关闭浏览器
sleep(5)
driver.quit()
(3)text_to_be_present_in_element(locator,text)示例
巩固练习:
"""
1.学习目标:
必须掌握EC模块中元素定位方法
text_to_be_present_in_element(locator,text)
2.语法
2.1 text_to_be_present_in_element(locator,text)
判断文本是否在元素中,如果存在返回true,如果不存在返回false
2.2 text_to_be_present_in_element_value(locator,text)
判断文本是否存在于元素的value属性值中,如果存在返回true,如果不存在返回false
"""
# 1.导入selenium
from selenium import webdriver
from time import sleep
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
# 2.打开谷歌浏览器
driver = webdriver.Chrome()
# 3.输入网址
url = "https://www.baidu.com"
driver.get(url)
sleep(2)
# 4.EC模块的使用
# 4.1 判断text是否存在于文本中
# 4.1.1 编写定位器locator
link_loc = ("link text", "hao123")
# 4.1.2 定义期望值
text_link = "hao123"
# 4.1.3 判断文本是否在元素中,如果存在返回true,如果不存在返回false
result = WebDriverWait(driver, 5).until(EC.text_to_be_present_in_element(link_loc, text_link))
print("present_in_element判定结果:", result)
# 4.2 判断text是否存在于元素的value属性中
# 判断百度首页的"百度一下"
# 4.2.1 编写定位器locator
button_loc = ("id", "su")
# 4.2.2 定义期望值
text_button = "百度一下"
# 4.2.3 判断文本是否存在于元素的value属性值中,如果存在返回true,如果不存在返回false
result_val = WebDriverWait(driver, 5).until(EC.text_to_be_present_in_element_value(button_loc, text_button))
print("present_in_element_value判定结果:", result_val)
# 5.关闭浏览器
sleep(2)
driver.quit()
"""
输出结果:
present_in_element判定结果: True
present_in_element_value判定结果: True
"""
(4)注意:(重要)
上面所有的练习,都必须正确找到需求的定位元素,否则会抛TimeoutException
异常。
因为WebDriverWait
类和until()
方法和EC
模块这种组合的使用方法
WebDriverWait(driver, 5).until(EC.presence_of_element_located(input_locator))
如果没有定位到元素,会返回until()
方法的返回结果,until()
方法的返回结果是,在规定时间内没有找到需要定位的元素,就会抛出selenium.common.exceptions.TimeoutException: Message:
异常。
所以我们上边写的例子就是让自己熟悉WebDriverWait
类和until()
方法和EC
模块这组合的用法,以后我们会进行异常处理和封装,让我们的代码更加可读,可复用。
『心善渊』Selenium3.0基础 — 24、Selenium的expected_conditions模块详细介绍的更多相关文章
- 『心善渊』Selenium3.0基础 — 11、Selenium对元素常用操作
目录 1.Selenium对元素常用操作 2.Selenium对元素的其他操作 1.Selenium对元素常用操作 操作 说明 click() 单击元素 send_keys() 模拟输入 clear( ...
- 『心善渊』Selenium3.0基础 — 12、Selenium操作鼠标和键盘事件
目录 (一)对鼠标的操作 1.鼠标事件介绍 2.ActionChains 类鼠标操作的常用方法 3.perform()方法 4.鼠标事件操作步骤 5.示例 (1)右键单击.左键双击 (2)鼠标拖拽动作 ...
- 『心善渊』Selenium3.0基础 — 1、Selenium自动化测试框架介绍
目录 1.Selenium介绍 2.Selenium的特点 3.Selenium版本说明 4.拓展:WebDriver与Selenium RC的区别 5.Webdriver工作原理 1.Seleniu ...
- 『心善渊』Selenium3.0基础 — 29、使用HTMLTestRunner生成unittest的HTML报告
目录 1.HTMLTestRunner介绍 2.HTMLTestRunner的使用 3.测试报告示例 4.封装成模块 1.HTMLTestRunner介绍 HTMLTestRunner是一个基于uni ...
- 『心善渊』Selenium3.0基础 — 2、Selenium测试框架环境搭建(Windows)
目录 1.浏览器安装 2.浏览器驱动下载 (1)ChromeDriver for Chrome (2)Geckodriver for Firefox (3)IEDriverServer for IE ...
- 『心善渊』Selenium3.0基础 — 3、使用Selenium操作浏览器对象的基础API
目录 1.导入Selenium库 2.创建浏览器对象 3.浏览器窗口大小设置 4.浏览器位置设置 5.请求访问网址 6.浏览器页面前进.后退和刷新 7.关闭浏览器 相比于高大上的各种Selenium进 ...
- 『心善渊』Selenium3.0基础 — 4、Selenium基础元素定位详解
目录 1.什么是元素定位 2.Selenium元素定位常用API (1)By_id 定位 (2)by_name 定位 (3)by_class_name 定位 (4)by_tag_name 定位 (5) ...
- 『心善渊』Selenium3.0基础 — 19、使用Selenium操作文件的上传和下载
目录 1.Selenium实现文件上传 (1)页面中的文件上传说明 (2)文件上传示例 (3)总结 2.Selenium实现文件下载 (1)Firefox浏览器文件下载 1)操作步骤: 2)文件下载示 ...
- 『心善渊』Selenium3.0基础 — 20、Selenium对Cookie的操作
目录 1.Cookie介绍 2.Session介绍 3.Cookie工作原理图解 4.Cookie内容参数说明 5.Selenium操作Cookie的API 6.Selenium操作Cookie的示例 ...
随机推荐
- 一次线上事故,让我对MySql的时间戳存char(10)还是int(10)有了全新的认识
美好的周五 周五的早晨,一切都是那么美好. 然鹅,10点多的时候,运营小哥哥突然告诉我后台打不开了,我怀着一颗"有什么大不了的,估计又是(S)(B)不会连wifi"的心情,自信的打 ...
- Jenkins 基础篇-凭证配置
我们在正式开始使用 Jenkins 之前还要先配置一些凭证,这些凭证的作用主要是用于认证,例如我们要从代码仓库拉取代码,就需要用到代码仓库的账号密码或者密钥:我们要登录远程服务器也需要用户名密码或者密 ...
- Django Admin后台管理功能使用
前言 用过Django框架的童鞋肯定都知道,在创建完Django项目后,每个app下,都会有一个urls.py文件,里边会有如下几行: 1 2 3 4 5 from django.contrib im ...
- Mysql索引的创建与删除
1. 创建索引 1.1 使用Alter创建索引 1 添加主键索引 特点:数据列不允许重复,不能为null,一张表只能有一个主键:Mysql主动将该字段进行排序 ALTER TABLE 表名 ADD P ...
- Sqlflow 之隐私政策(Privacy plolicy)介绍
在大数据技术流行的今天,SQLFlow 可以通过分析各种数据库对象的定义给开发和管理者带来很大的助力.能够让您在大数据时代应对自如,如虎添翼. 在之前的文章中我们已经详细介绍过SQLFlow是什么.能 ...
- Go语言网络通信---string与int互转,int64与[]byte互转,int直接互转,string与[]byte互转
string与int互转 #string到int int,err:=strconv.Atoi(string) #string到int64 int64, err := strconv.ParseInt( ...
- js动态加载HTML元素时出现的无效的点击事件
项目中列表数据中隐藏着详情数据, 图一: 详情数据是:根据当前行的数据作为参数,通过ajax请求到后台返回的数据,再根据返回的结果动态生成HTML页面 图二: js文件中的这些js的点击事件无效: j ...
- 利用NVIDIA-NGC中的MATLAB容器加速语义分割
利用NVIDIA-NGC中的MATLAB容器加速语义分割 Speeding Up Semantic Segmentation Using MATLAB Container from NVIDIA NG ...
- 关于switch语句的使用方法---正在苦学java代码的新手之菜鸟日记
输入月份与年份,判断所输入的月份有多少天. switch支持和不支持的类型 支持的类型 int 类型 short 类型 byte 类型 char 类型 enum (枚举)类型 (java5.0 之后支 ...
- 十五、.net core(.NET 6)搭建RabbitMQ消息队列生产者和消费者的简单方法
搭建RabbitMQ简单通用的直连方法 如果还没有MQ环境,可以参考上一篇的博客,在windows系统上的rabbitmq环境搭建.如果使用docker环境,可以直接百度一下,应该就一个语句就可以搞定 ...