Selenium 之显性等待详解

开发 开发工具
后台看到大家对显性等待比较感兴趣,想详细了解下如何使用,今天就来继续跟大家详细介绍下。

[[421385]]

本文转载自微信公众号「Python技术」,作者派森酱 。转载本文请联系Python技术公众号。

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

显性等待使用

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

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

  1. # 导入库 
  2. from selenium import webdriver 
  3. from selenium.webdriver.support.ui import WebDriverWait 
  4. from selenium.webdriver.support import expected_conditions as ECS 
  5. from selenium.webdriver.common.by import By 
  6. import time 
  7.  
  8. # executable_path 用于指定driver存放路径 
  9. browser = webdriver.Chrome(executable_path='/Users/xx/python/chromedriver'
  10.  
  11. # 打开京东官网 
  12. browser.get('https://www.baidu.com/'
  13.  
  14. # 定位要查找的元素 
  15. loc = (By.LINK_TEXT, "关于百度"
  16.  
  17. try: 
  18.   # 等待5秒,直到发现元素 
  19.     WebDriverWait(driver, 5).until(ECS.presence_of_element_located(loc)) 
  20. except
  21.   # 没有发现元素则会打印提示 
  22.     print("没有找到对应元素!"
  23. finally: 
  24.   # 发现元素则执行下面的方法 
  25.     driver.find_element_by_link_text('关于百度').click() 
  26.  
  27. #退出浏览器 
  28. browser.quit() 

显性等待方式介绍

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

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

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

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

总结

 

好了,今天我们又介绍了下 Selenium 显性等待元素加载的方式,详细介绍并列举了一些常见场景使用的例子,给大家学习参考,后续还会为大家介绍更多。

 

责任编辑:武晓燕 来源: Python技术
相关推荐

2012-07-09 13:21:51

2016-06-30 13:14:09

php继承开发

2011-05-11 09:49:32

线程等待SQL Server

2010-09-03 11:15:02

CHAPppp

2021-06-18 08:25:42

Java泛型通配符

2022-04-26 13:49:18

大数据个人信息营销

2013-10-22 11:17:30

Google自动搜索

2011-03-02 13:12:37

vsftpd配置

2019-12-03 09:00:59

Oracle数据库等待事件

2011-08-23 13:16:41

SQLEXPLAIN

2011-03-31 09:32:25

EclipseRefactor

2011-08-02 11:07:42

iOS开发 UIWebView

2017-04-26 11:00:34

Spring BootHelloWorld详解

2015-12-24 09:48:40

JavaScriptthis指针深

2023-03-21 15:36:27

Linux编程

2023-09-05 06:52:42

AMD锐龙处理器

2023-03-30 15:07:57

Linux编程开发

2012-05-24 15:21:17

魅族MX

2012-05-10 08:37:54

Linuxxargs

2010-07-26 15:47:02

Ophone系统
点赞
收藏

51CTO技术栈公众号