Selenium 之显性等待详解

简介: 上次介绍了下 Selenium 元素等待的三种方法,以及每种元素等待方法的优缺点,在使用场景下该如何操作。并写了一些具体使用的简单例子,给大家作为参考。后台看到大家对显性等待比较感兴趣,想详细了解下如何使用,今天就来继续跟大家详细介绍下。

显性等待使用

在使用 WebDriverWait 调用可执行方法,除了可定位的元素,还可以使用 selenium 提供的 expected_conditions 模块中的各种条件,也可以使用 WebElementis_enabled()is_selected()is_displayed() 等等方法,还可以使用自己封装的方法。

这次我们换百度官网测试,首先我先上一段使用显性等待的标准使用方式,这里使用的 LINK_TEXT 查找的元素:

# 导入库
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECS
from selenium.webdriver.common.by import By
import time
# executable_path 用于指定driver存放路径
browser = webdriver.Chrome(executable_path='/Users/xx/python/chromedriver')
# 打开京东官网
browser.get('https://www.baidu.com/')
# 定位要查找的元素
loc = (By.LINK_TEXT, "关于百度")
try:
  # 等待5秒,直到发现元素
    WebDriverWait(driver, 5).until(ECS.presence_of_element_located(loc))
except:
  # 没有发现元素则会打印提示
    print("没有找到对应元素!")
finally:
  # 发现元素则执行下面的方法
    driver.find_element_by_link_text('关于百度').click()
#退出浏览器
browser.quit()

显性等待方式介绍

好了,知道显性等待怎么用了,接下来我们来看下,还有哪些其他常见的使用方式:

  • 先来个简单的,这里通过页面标题来判断
# 元素等待直到标题出现 `百度一下,你就知道` 
WebDriverWait(driver,3).until(ECS.title_is('百度一下,你就知道'))
# 元素等待直到标题出现包含 `百度` 即可
WebDriverWait(driver,3).until(ECS.title_contains('百度'))
  • 通常在网页中并不是所有元素都是可见的,也有的是初始化时不可见,加载完成时则状态又变为可见,所以在元素等待中以下这些方式是经常被用到的。
# 元素等待直到能定位到元素,这里是定位到搜索输入框
# 这里定位时不关心元素是否可见,只要是加载到DOM中能定位到即可
WebDriverWait(driver,3).until(ECS.presence_of_element_located((By.ID,'kw')))
# 元素等待直到能定位到可见的元素,比如这里定位到搜索按钮
# 和上面不同,这里等待的元素除加载DOM中,也必须可见
WebDriverWait(driver,3).until(ECS.visibility_of_element_located((By.ID,'su')))
# 元素等待直到能定位到可见的元素,比如这里定位到搜索框
# 这个方法和上面 `visibility_of_element_located` 使用类似
WebDriverWait(driver,3).until(ECS.visibility_of((By.ID,value='su')))
# 元素等待直到通过 `CSS` 定位到至少有一个元素存在,则结束等待
WebDriverWait(driver,3).until(ECS.presence_of_all_elements_located((By.CSS_SELECTOR,'.uinv')))
# 这和上一个等待方法类似,主要就是需要元素可见才会结束等待
WebDriverWait(driver,3).until(ECS.visibility_of_any_elements_located((By.CSS_SELECTOR,'.uinv')))
# 元素等待直到元素被加载,可以定位到并且元素必须为不可见状态,才会结束等待
WebDriverWait(driver,3).until(ECS.invisibility_of_element_located((By.CSS_SELECTOR,'#nwWrap')))
  • 在平时使用中,也经常会用到等待的元素包含某些内容来判断,而且这种方式能适用很多场景
# 元素等待直到定位到指定的元素,并且元素的属性值中包含指定的字符串
WebDriverWait(driver,3).until(ECS.text_to_be_present_in_element((By.XPATH,"//*[@id='bottom_layer']/div/p[1]/a"),'关于百度'))
# 这种实现跟上面效果差不多
WebDriverWait(driver,3).until(ECS.text_to_be_present_in_element_value((By.CSS_SELECTOR,'#su'),'百度一下'))
  • 下面几种方式主要是针对下拉框类型的等待,还有可点击的组件,如超链接
# 元素等待直到元素被加载,为可见状态,并且是可点击的状态,才会结束等待
WebDriverWait(driver,3).until(ECS.element_to_be_clickable((By.XPATH,"//*[@id='bottom_layer']/div/p[1]/a"))).click()
# 元素等待直到元素被加载,可见状态并且这个元素是被选中的状态
# 这种方式我运用于下拉选择框
WebDriverWait(driver,3).until(ECS.element_to_be_selected((By.XPATH,"//*[@id='sel']/option[2]")))
# 元素等待直到元素被加载后,并且元素选中状态为预期的状态,才会结束等待
WebDriverWait(driver,3).until(ECS.element_selection_state_to_be((By.XPATH,"//*[@id='sel']/option[1]"),False))
  • 以下是比较特殊的几种方式,在某些情况下用处很大
# 元素等待直到页面加载出现 `alert`,出现自己切换过去并将提示内容返回
WebDriverWait(driver,3).until(ECS.alert_is_present())
# 其他都是等待加载元素并操作,这种是等待元素被从Dom中移除时,才会触发结束等待
WebDriverWait(driver,3).until(ECS.staleness_of(driver.find_element(By.ID,'su')))
# 这种是页面有多个Frame时,等待页面加载直到 `frame1` 可以切换进去,这时就会自动切换到 `frame1` ,然后结束等待
WebDriverWait(driver,3).until(ECS.frame_to_be_available_and_switch_to_it(frame1))

除了上面这些,还有很多其他的方式,这里就不再一一列举了,大家有兴趣可以自己去研究一下,然后写些小例子实际使用下。

对了,有小伙伴问如果隐性等待和显性等待都使用了,那它会按哪种方式等待呢?在这里说下,它会按等待时间较长的设置为最终等待时间。

总结

好了,今天我们又介绍了下 Selenium 显性等待元素加载的方式,详细介绍并列举了一些常见场景使用的例子,给大家学习参考,后续还会为大家介绍更多。OK,今天就聊这些,如果你喜欢记得点 在看

相关实践学习
2分钟自动化部署人生模拟器
本场景将带你借助云效流水线Flow实现人生模拟器小游戏的自动化部署
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
6月前
|
Web App开发 前端开发 测试技术
探索自动化测试工具:Selenium的威力与应用
探索自动化测试工具:Selenium的威力与应用
探索自动化测试工具:Selenium的威力与应用
|
2月前
|
数据采集 Web App开发 测试技术
使用Selenium与WebDriver实现跨浏览器自动化数据抓取
在网络爬虫领域,Selenium与WebDriver是实现跨浏览器自动化数据抓取的利器。本文详细介绍了如何利用Selenium和WebDriver结合代理IP技术提升数据抓取的稳定性和效率。通过设置user-agent和cookie来模拟真实用户行为,避免被网站检测和阻止。文章提供了具体的代码示例,展示了如何配置代理IP、设置user-agent和cookie,并实现了跨浏览器的数据抓取。合理的参数配置能有效减少爬虫被封禁的风险,提高数据抓取效率。
280 6
使用Selenium与WebDriver实现跨浏览器自动化数据抓取
|
3月前
|
JavaScript 测试技术 API
|
3月前
|
Web App开发 敏捷开发 测试技术
自动化测试之美:使用Selenium WebDriver进行网页功能验证
【8月更文挑战第29天】在数字时代,软件质量是企业竞争力的关键。本文将深入探讨如何通过Selenium WebDriver实现自动化测试,确保网页应用的可靠性和性能。我们将从基础设置到编写测试用例,逐步引导读者掌握这一强大的测试工具,同时分享实战经验,让测试不再是开发的负担,而是质量保证的利器。
|
6月前
|
XML 人工智能 前端开发
软件测试/人工智能|selenium元素定位方式大全
软件测试/人工智能|selenium元素定位方式大全
|
数据采集 Web App开发 安全
别去送死了。Selenium 与 Puppeteer 能被网站探测的几十个特征
别去送死了。Selenium 与 Puppeteer 能被网站探测的几十个特征
314 0
|
数据采集 Web App开发 IDE
玫瑰花变蚊子血,自动化无痕浏览器对比测试,新贵PlayWright Vs 老牌Selenium,基于Python3.10
Selenium一直都是Python开源自动化浏览器工具的王者,但这两年微软开源的PlayWright异军突起,后来者居上,隐隐然有撼动Selenium江湖地位之势,本次我们来对比PlayWright与Selenium之间的差异,看看曾经的玫瑰花Selenium是否会变成蚊子血。
玫瑰花变蚊子血,自动化无痕浏览器对比测试,新贵PlayWright Vs 老牌Selenium,基于Python3.10
selenium 4.0学习(二)常用定位和函数方法
selenium 4.0学习(二)常用定位和函数方法
selenium 4.0学习(二)常用定位和函数方法
|
Web App开发 测试技术 网络安全
怎么利用 ChromeDriver 和 Selenium对 CEF应用进行自动化测试-python实现
怎么利用 ChromeDriver 和 Selenium对 CEF应用进行自动化测试-python实现
506 0