Selenium - 元素等待(2) - 显式等待/EC等待
Selenium - 元素等待
显式等待
-
显式等待是一种灵活的等待方式,需要声明等待的结束条件,当满足条件时会自动结束等待;
-
需要引入
WebDriverWait
包以及exception_conditions
,wait
方法配合ec的until
或者until_not
; -
可以实现针对于某一个元素等待,每经过多少秒就查看一次元素是否可见;
-
如果可见就停止等待;
-
如果不可见就继续等待直到超过规定的时间后,报超时异常;
-
-
-
WebDriverWait
:声明需要等待的条件,可以设置为元素显示后; -
until()
:直到条件成立返回为真,等待结束。如果超时,抛出TimeoutException,将message传入异常。 -
until_not()
:直到条件不成立返回为真,是当某元素消失或什么条件不成立则继续执行,等待结束。如果超时,抛出TimeoutException,将message传入异常。 -
expected_conditions
:是selenium的一个模块,其中包含一系列可用于判断的条件方法。
# 导入显示等待函数 from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() driver.get('http://www.baidu.com') driver.find_element_by_id('kw').send_keys('python') driver.find_element_by_id('su').click() # 设置等待15秒,等待浏览器标题为python_百度搜索,结束等待,继续运行; WebDriverWait(driver, 15).until(EC.title_is('python_百度搜索')) # 设置等待8秒,等待浏览器标题不为selenium后,结束等待,继续运行; WebDriverWait(driver, 8).until_bot(EC.title_is('selenium')) print(driver.title) driver.quit()
EC等待场景
介绍
-
EC 全称为
expected_conditions
;-
是Selenium的一个子模块 ——
selenium.webdriver.support.expected_conditions
; -
可以对网页上元素是否存在,可点击等等进行判断,一般用于断言或与WebDriverWait配合使用;
-
-
引用模块
from selenium.webdriver.support import expected_conditions as EC
网页信息
# 判断当前页面的titlt完全等于(==)预期字符(区分大小写); # 若等于则返回True,不等于返回False; EC.title_is(value) # 判断当前页面的titlt包含预期字符(区分大小写); # 若包含则返回True,不包含返回False; EC.title_contains(value) # 判断网页是否为特定网页(必须完全符合), # 是则返回True,否则返回False EC.url_to_be(url) # 判断网页地址完全等于(==)预期字符(区分大小写), # 若等于则返回True,不等于返回False; EC.url_changes(url) # 判断网址地址是否包含特定文本(区分大小写); # 若包含则返回True,不包含返回False; EC.url_contains(url) # 判断网址是否符合特定格式, # 符合则返回True,不符合则返回False pattern = r'(https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?' #使用正则表达式,规定网址格式(格使要求以https开头) EC.url_matches(pattern)
文本判断
# 判断给定文本是否出现在特定元素中; # 若存在则返回True,不存在返回False; ## locator:定位所有class="wd"的元素 from selenium.webdriver.common.by import BY locator = (By.CLASS_NAME, "wd") EC.text_to_be_present_in_element(locator, value) # 判断某文本是否是存在于特定元素的value值中, # 存在则返回True,不存在则返回False, ## 对于查看没有value值的元素,也会返回False EC.text_to_be_present_in_element_value(locator, value)
窗口信息
# 判断alert弹窗是否存在; # 若存在则返回True,不存在返回False; EC.alert_is_present() # 判断某个frame是否可以切换过去, # 若可以则切换到该frame,否则返回False ## locator:XPATH="html/body/iframe"的元素 from selenium.webdriver.common.by import BY locator = (By.XPATH, "html/body/iframe") EC.frame_to_be_available_and_switch_to_it(locator) # 通过是否增加了句柄数量判断是否打开新窗口, # 有新窗口则返回True,没有新窗口返回False current_handles = driver.window_handles EC.new_window_is_opened(current_handles) # 判断窗口数量是否是特定数值, # 是该数值则返回True,否则返回False EC.number_of_windows_to_be(num_windows)
元素状态
# 判断某元祖是否被选中; # 选中则返回True,未选则返回False; ## locator:定位所有class="wd"的元素 from selenium.webdriver.common.by import BY locator = (By.CLASS_NAME, "wd") EC.element_located_to_be_selected(locator) # 判断某元祖是否与预期相同, # 相同则返回True,不同则返回False EC.element_located_selection_state_to_be(locator, BOOLE) # 判断某元素是否被选中; # 选中则返回True,未选则返回False; element = driver.find_element_by_id('kw') EC.element_to_be_selected(element) # 判断某元素的选中状态是否与预期相同; # 相同则返回True,不同则返回False; EC.element_selection_state_to_be(element, BOOLE) # 判断某元祖是否可访问并且可启用,比如能够点击; # 若可以则返回元素本身,否则返回False from selenium.webdriver.common.by import BY locator = (By.CLASS_NAME, "wd") EC.element_to_be_clickable(locator) # 判断某个元祖是不是不可访问或者不存在在DOM树中; # 不存在则返回True,存在则返回False EC.invisibility_of_element_located(locator)
元素可见
# 判断一个元素存在于页面DOM树中; # 存在则返回元素本身,不存在则报错。 ## locator:定位所有class="wd"的元素 from selenium.webdriver.common.by import BY locator = (By.CLASS_NAME, "wd") EC.presence_of_element_located(locator) # 判断定位的元素范围内,至少有一个元素存在于页面当中 # 存在则以list形式返回元素本身,不存在则报错; EC.presence_of_all_elements_located(locator) # ============================================================= # 判断特定元素是否存在于DOM树中并且可见,可见意为元素的高和宽都大于0; # 元素存在返回元素本身,否则返回False; element = driver.find_element_by_id('kw') EC.visibility_of(element) # 判断特定元素是否存在于DOM树中并且可见,可见意为元素的高和宽都大于0; # 元素存在返回元素本身,否则返回False; EC.visibility_of_element_located(locator) # 判断locator定位的所有元素都存在于DOM树中并且可见,可见意为元素高和宽都大于0; # 存在则以list形式返回元素,否则返回False; EC.visibility_of_all_elements_located(loccator) # 判断locator定位的所有元素中,至少有一个存在于DOM树中并且可见,可见意为元素高和宽都大于0; # 存在则以list形式返回存在的元素,一个元素都不存在的情况下返回空list; EC.visibility_of_any_elements_located(locator)
注:
presence
和visibility
有点相像,区别在于:
presence
强调元素存在于DOM树中,可见不可见无所谓;(性能上会稍微快一点点)
visibility
要求必须高和宽必须都大于0;
分类:
Selenium
标签:
Python-自动化测试
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架