元素等待-强制等待、隐性等待、显性等待

  • 强制等待
  1. 线程休眠一定时间
  2. time.sleep()

    sleep() 不管元素有没有出现,一定要等。

  • 显性等待
  1. 在代码中定义等待条件,当条件发生时才继续执行代码
  2. 'WebDriverWait'配合until()和until_not()方法,根据判断条件进行等待
  3. 程序每隔一段时间(默认0.5秒)进行判断,如果条件成立,则执行下一步,否则继续等待,直到超过设置的最长时间。
  • 隐性等待
  1. 设置一个等待时间,轮询查找(默认0.5秒)元素是否出现,如果没有出现就跑出异常。
  2. self.driver.implicitly_wait(3)
  3. 适用条件:命令执行,元素查找(alert弹窗或者切换可能不生效)
  4. implicitly_wait() 会话开始之后使用隐形等待,之后所有的找元素都会调用隐形等待,等待元素可见,等待命令执行

  5. 设置最长等待时间,在这个时间内加载完成,则可执行下一步,

  6. 整个driver的会话周期内,设置一次即可,全局可用(会话周期:打开浏览器到关闭浏览器。)

  7. 等待时间超时还未出现元素,就会抛出异常timeout。

from selenium import webdriver
#启动谷歌浏览器,开启与浏览器之间的绘话,会话周期:打开浏览器到关闭浏览器。
driver = webdriver.Chrome(service_log_path='E:\柠檬班二\chromedriver_service.log')
#全局等待,隐性等待,如果不加等待,页面弹窗上可能找不到用户名密码这个元素
driver.implicitly_wait(30)
#访问一个网页
driver.get("https://www.baidu.com")
#找到登录点击
driver.find_element_by_xpath('//*[@id="u1"]/a[@class="lb"]').click()
#找到用户名密码登录方式
driver.find_element_by_id('TANGRAM__PSP_10__footerULoginBtn').click()

https://zhuanlan.zhihu.com/p/143357537

2)关于WebDriverWait的使用以及方法介绍(显示等待)

WebDriverWait可以当做元素等待,灵活的设置查找元素时的判断条件,同时由于方法中包含了大量webdriver自带的判断方法,只返回True和False,所以也可以灵活的当做断言来使用。

2.1基础格式(webDriverWait+until+(判断条件)):

这个格式的结构有点像语言中主谓宾的结构,实例的意思是,程序每0.5秒检查,是否满足:标题包含“百度一下”这个条件,检查是否满足条件的最长时间为:15秒,超过15秒仍未满足条件则抛出异常

WebDriverWait(driver, 15, 0.5).until(expected_conditions.title_contains("百度一下"))

2.2导入库

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions

2.3WebDriverWait

满足条件后继续执行,否则在设置时间过后抛出异常

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

  • driver 所创建的浏览器driver
  • timeout 最长时间长度(默认单位:秒)
  • poll_frequency 间隔检测时长(每)默认0.5秒
  • ignored_exceptions 方法调用中忽略的异常,默认只抛出:找不到元素的异常

2.4 until / until_not

直到调用的方法返回值为True

until(method, message='')

  • method:expected_conditions库中定义的方法
  • message :自定义报错信息

直到调用的方法返回值为False

until_not(method, message='')

  • method:expected_conditions库中定义的方法
  • message :自定义报错信息

2.5 expected_conditions库中的方法

判断当前页面标题是否为title

title_is(title)

  • title:期望的页面标题

判断当前页面标题是否包含title

title_contains(title)

  • title:期望的页面标题

判断此定位的元素是否存在

presence_of_element_located(locator)

  • locator:元素的定位信息

判断页面网址中是否包含url

url_contains(url)

  • url:期望的页面网址

判断页面网址是否为url

url_to_be(url)

  • url:期望的页面网址

判断页面网址不是url

url_changes(url)

  • url:期望的页面网址

判断此定位的元素是否可见

visibility_of_element_located(locator)

  • locator:元素的定位信息

判断此元素是否可见

visibility_of(element)

  • element:所获得的元素

判断此定位的一组元素是否至少存在一个

presence_of_all_elements_located(locator)

  • locator:元素的定位信息

判断此定位的一组元素至少有一个可见

visibility_of_any_elements_located(locator)

  • locator:元素的定位信息

判断此定位的一组元素全部可见

visibility_of_all_elements_located(locator)

  • locator:元素的定位信息

判断此定位中是否包含text_的内容

text_to_be_present_in_element(locator, text_)

  • locator:元素的定位信息
  • text_:期望的文本信息

判断此定位中的value属性中是否包含text_的内容

text_to_be_present_in_element_value(locator, text_)

  • locator:元素的定位信息
  • text_:期望的文本信息

判断定位的元素是否为frame,并直接切换到这个frame中

frame_to_be_available_and_switch_to_it(locator)

  • locator:元素的定位信息

判断定位的元素是否不可见

invisibility_of_element_located(locator)

  • locator:元素的定位信息

判断此元素是否不可见

invisibility_of_element(element)

  • element:所获得的元素

判断所定位的元素是否可见且可点击

element_to_be_clickable(locator)

  • locator:元素的定位信息

判断此元素是否不可用

staleness_of(element)

  • element:所获得的元素

判断该元素是否被选中

element_to_be_selected(element)

  • element:所获得的元素

判断定位的元素是否被选中

element_located_to_be_selected(locator)

  • locator:元素的定位信息

判断该元素被选中状态是否和期望状态相同

element_selection_state_to_be(element,Boolean)

  • element:所获得的元素
  • Boolean:期望的状态(True/False)

判断定位的元素被选中状态是否和期望状态相同

element_located_selection_state_to_be(locator,Boolean)

  • locator:元素的定位信息
  • Boolean:期望的状态(True/False)

判断当前浏览器页签数量是否为num

number_of_windows_to_be(num)

  • num:期望的页签数量

判断此handles页签不是唯一打开的页签

new_window_is_opened(handles)

  • handles:页签

判断是否会出现alert窗口警报

alert_is_present()

 

 

 
posted @   hccccch  阅读(368)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示