判断元素 from selenium.webdriver.support import expected_conditions as EC之 expected_conditions(期望条件)
前言
1、 expected_conditions 是Selenium工具中的一个模块,主要用于对页面元素的加载进行判断,包括元素是否存在,可点击等等。
2、 expected_conditions 模块的使用场景一般有两种:
- 直接在断言中使用 。
- 与WebDriverWait配合使用,显示等待页面上元素出现或者消失。
3、一般情况下,我们在使用 expected_conditions 模块时,都会对其进行重命名,通过as关键字对其重命名为EC。
from selenium.webdriver.support import expected_conditions as EC
4、在做UI自动化的时候,有时候会需要判断元素在页面上是否存在,iframe是否存在,以及一些弹出框是否存在,selenium工具中单独封装了一个库中有关于元素判断的方法。
常用方法
方法详细介绍说明
1、title_is(text) 方法:用于判断网页title是否是特定文本(英文区分大小写),若完全相同则返回True,否则返回False。
也可以使用 driver.title 打印当前页面的标题进行断言。
代码实例:
from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome(executable_path='/home/test/MyCode/Common/driver/chromedriver_102') driver.set_window_size(480, 600) driver.get('https://www.baidu.com') # 判断当前页面的标题是否符合预期 title = WebDriverWait(driver, 5).until(EC.title_is('百度一下,你就知道')) # 返回的类型是True或False print(title) if EC.title_is('百度一下,你就知道'): print(True) print(driver.title) driver.quit()
2、title_contains(text) 方法:用于判断网页title是否包含特定文本(英文区分大小写),若包含则返回True,不包含返回False。
3、presence_of_element_located(locator) 方法(重点,常用):用于判断一个元素是否存在于页面DOM树中,存在则返回元素本身,不存在则报错。
注意:元素存在于页面DOM树中,并不代表该元素在页面上可见。
传入的参数是tuple类型,第一个元素是定位方式,第二个元素是value。如果元素存在则返回元素位置,不存在则抛出异常( NoSuchElementException )。
代码实例:
from selenium import webdriver from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() driver.set_window_size(480, 600) driver.get('https://www.baidu.com') r = EC.presence_of_element_located(('id', 'kw'))
print(r(driver))
4、presence_of_all_elements_located(locator) 方法:用于判断定位的元素范围内,至少有一个元素存在于页面当中,存在则以列表形式返回元素本身,不存在则报错。
5、visibility_of_element_located(locator) 方法:用于判断特定元素是否存在于DOM树中并且页面上可见,页面上可见意为元素的高和宽都大于0,元素存在返回元素本身,否则返回False。
注意:判断元素是否可见(可见代表元素非隐藏,并且元素的宽和高都不等于0):如果元素存在且可见,就返回元素本身,如果存在但不可见则返回false。
和 presence_of_element_located() 方法类似,区别是 presence_of_element_located() 方法只强调元素存在于DOM树中,可见不可见无所谓。
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome(executable_path='/home/test/MyCode/Common/driver/chromedriver_102') driver.set_window_size(480, 600) driver.get('https://www.baidu.com') locate = WebDriverWait(driver, 5).until(EC.visibility_of_element_located(locator=(By.ID, 'kw'))) print(locate) locate.send_keys('selenium') driver.quit()
6、visibility_of(element) 方法: visibility_of(element) 同上面 visibility_of_element_located(locator) 作用相同;区别是传参不同, visibility_of() 方法接收的参数是定位后的元素。
from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome(executable_path='/home/test/MyCode/Common/driver/chromedriver_102') driver.set_window_size(480, 600) driver.get('https://www.baidu.com') element = driver.find_element(by='id', value='kw') locate = WebDriverWait(driver, 5).until(EC.visibility_of(element)) print(locate) locate.send_keys('selenium') driver.quit()
7、invisibility_of_element_located(locator) 方法:判断元素是否隐藏。
8、text_to_be_present_in_element(locator, text) 方法:判断某个元素中的text文本是否包含了预期的字符串,若包含则返回True,不包含返回False。
注意:使用该方法的前提是某页面元素具有text文本值,value属性定义的元素text值无法使用该方法。from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome(executable_path='/home/test/MyCode/Common/driver/chromedriver_102') driver.set_window_size(480, 600) driver.get('https://www.baidu.com') r = WebDriverWait(driver, 5).until(EC.text_to_be_present_in_element(('xpath', "//span[text()='谭乔自曝或面临牢狱之灾']"), '谭乔')) print(r)
9、text_to_be_present_in_element_value(locator, text) 方法:判断某文本是否是存在于特定元素的value值中,存在则返回True,不存在则返回False,对于查看没有value值的元素,也会返回False。
与8区分
from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome(executable_path='/home/test/MyCode/Common/driver/chromedriver_102') driver.set_window_size(480, 600) driver.get('https://www.baidu.com') # 判断某个元素的value属性值是否符合预期字符串 r = WebDriverWait(driver, 5).until(EC.text_to_be_present_in_element_value(('id', 'su'), '百度一下')) print(r)
10、frame_to_be_available_and_switch_to_it(locator) 方法:判断某个frame是否可以切换过去:若可以则切换到该frame并返回True,否则返回False 。
from selenium import webdriver from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait def find_element(located): if isinstance(located, tuple): return WebDriverWait(driver, 5).until(EC.presence_of_element_located(located)) else: return '方法入参必须是元组类型' driver = webdriver.Chrome(executable_path='/home/test/MyCode/Common/driver/chromedriver_102') driver.set_window_size(600, 800) driver.get('https://mail.qq.com/') # 判断iframe是否可以切换进去,返回布尔值 is_switch = WebDriverWait(driver, 5).until(EC.frame_to_be_available_and_switch_to_it(('id', 'login_frame'))) print(is_switch) # 点击【帐号密码登录】 WebDriverWait(driver, 5).until(EC.presence_of_element_located(('id', 'login_button'))).click() # 定位元素:账号输入框、密码输入框、登录按钮 user_element = find_element(('id', 'u')) password_element = find_element(('id', 'p')) login_element = find_element(('id', 'login_button')) # 输入账号、密码、点击登录 user_element.send_keys('xxxxx@qq.com') password_element.send_keys('password') login_element.click() driver.quit()
11、element_to_be_clickable(locator) 方法:判断某元素是否可访问并且可启用,比如能够点击,若可以则返回元素本身,否则返回False。
判断元素是否可见并是可以点击的,如果元素存在且可点击,则返回元素;如果元素存在但不可点击,则返回False。
from selenium import webdriver from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome(executable_path='/home/test/MyCode/Common/driver/chromedriver_102') driver.set_window_size(480, 600) driver.get('https://www.baidu.com') # 百度页该元素不可点击,返回False a = EC.element_to_be_clickable(('xpath', "//div[@class='s-p-top']")) print(a) print(a(driver))
12、staleness_of(element) 方法:判断某个元素是否不再附加于于DOM树中,不再附加的话返回True,依旧存在返回False。可以用于判断页面是否已经刷新。
等待一个元素从DOM树中移除,传入element元素,如果元素已经不存在返回True,可以判断页面已经刷新。
13、alert_is_present 方法:判断alert是否存在,若存在则切换到alert,若不存在则返回False。
14、element_to_be_selected(element) 方法:判断某元素是否被选中。一般用在下拉列表,入参为element元素定位。
15、element_located_to_be_selected(locator) 方法:判断某元素是否被选中,入参locator为一个(by, path)元祖。
16、element_selection_state_to_be (element, is_selected) 方法:判断某元素的选中状态是否与预期相同,相同则返回True,不同则返回False。
17、element_located_selection_state_to_be(locator, is_selected) 方法: 判断某元素是否与预期相同,相同则返回True,不同则返回False,locator为一个(by, path)元祖。
总结
EC模块的这些方法与 WebDriverWait类 中的 until() 、 until_not() 方法组合能使用,够实现很多判断功能,如果能自己灵活封装,将会大大提高脚本的稳定性。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!