深入selenium三种等待方式使用

处理由于网络延迟造成没法找到网页元素

方法一

time模块不推荐使用

用time模块中的time.sleep来完成等待

  1. from selenium import webdriver
  2. import time
  3. browser = webdriver.Chrome()
  4. response = browser.get('https://www.12306.cn/index/')
  5. #找到登入按钮点击
  6. login_button_xpath = '//*[@id="J-header-login"]/a[1]'
  7. login_button = browser.find_element_by_xpath(login_button_xpath)
  8. while not login_button:
  9. login_button = browser.find_element_by_xpath(login_button_xpath)
  10. time.sleep(10)
  11. login_button.click()

方法二

implicitly_wait(隐式等待)

  • 隐式等待实际是设置了一个最长等待时间

  • 如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间结束,然后执行下一步。

  • 注意点我们都知道js一般都是放在我们的body的最后进行加载,实际这是页面上的元素都已经加载完毕,我们却还在等带全部页面加载结束。

  • 隐式等待对整个driver周期都起作用,在最开始设置一次就可以了。不要当做固定等待使用,到那都来一下隐式等待。

  1. #隐式等待,失败概率高,可不用
  2. browser.implicitly_wait(10)
  3. #在10秒内,如果网页全部加载完成(包含js),则执行下一步,否则一直等到10秒结束后,在执行下一步

方法三

WebDriverWait(显示等待)(推荐使用)

from selenium.webdriver.support.wait import WebDriverWait

参数

  • driver: 传入WebDriver实例,即我们上例中的driver
  • timeout: 超时时间,等待的最长时间
  • poll_frequency: 调用until或until_not中的方法的间隔时间,默认是0.5秒
  • ignored_exceptions: 忽略的异常,如果在调用until或until_not的过程中抛出这个元组中的异常,则不中断码,继续等待,如果抛出的是这个元组外的异常,则中断代码,抛出异常。默认只有NoSuchElementException。

until与until_not

  • until:当某元素出现或什么条件成立则继续执行
  • nutil_not:当某元素消失或什么条件不成立则继续执行

until与until_not里面的两个参数

  • method: 在等待期间,每隔一段时间调用这个传入的方法,直到返回值不是False
  • message: 如果超时,抛出TimeoutException,将message传入异常

method的设置

必须是含有__call__的可执行方法。所以我们引用selenium提供的一个模块

from selenium.webdriver.support import expected_conditions as EC

EC相关汇总

  1. '''隐式等待和显示等待都存在时,超时时间取二者中较大的'''
  2. locator = (By.ID,'kw')
  3. driver.get(base_url)
  4. WebDriverWait(driver,10).until(EC.title_is(u"百度一下,你就知道"))
  5. '''判断title,返回布尔值'''
  6. WebDriverWait(driver,10).until(EC.title_contains(u"百度一下"))
  7. '''判断title,返回布尔值'''
  8. WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,'kw')))
  9. '''判断某个元素是否被加到了dom树里,并不代表该元素一定可见,如果定位到就返回WebElement'''
  10. WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.ID,'su')))
  11. '''判断某个元素是否被添加到了dom里并且可见,可见代表元素可显示且宽和高都大于0'''
  12. WebDriverWait(driver,10).until(EC.visibility_of(driver.find_element(by=By.ID,value='kw')))
  13. '''判断元素是否可见,如果可见就返回这个元素'''
  14. WebDriverWait(driver,10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,'.mnav')))
  15. '''判断是否至少有1个元素存在于dom树中,如果定位到就返回列表'''
  16. WebDriverWait(driver,10).until(EC.visibility_of_any_elements_located((By.CSS_SELECTOR,'.mnav')))
  17. '''判断是否至少有一个元素在页面中可见,如果定位到就返回列表'''
  18. WebDriverWait(driver,10).until(EC.text_to_be_present_in_element((By.XPATH,"//*[@id='u1']/a[8]"),u'设置'))
  19. '''判断指定的元素中是否包含了预期的字符串,返回布尔值'''
  20. WebDriverWait(driver,10).until(EC.text_to_be_present_in_element_value((By.CSS_SELECTOR,'#su'),u'百度一下'))
  21. '''判断指定元素的属性值中是否包含了预期的字符串,返回布尔值'''
  22. #WebDriverWait(driver,10).until(EC.frame_to_be_available_and_switch_to_it(locator))
  23. '''判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去,否则返回False'''
  24. #注意这里并没有一个frame可以切换进去
  25. WebDriverWait(driver,10).until(EC.invisibility_of_element_located((By.CSS_SELECTOR,'#swfEveryCookieWrap')))
  26. '''判断某个元素在是否存在于dom或不可见,如果可见返回False,不可见返回这个元素'''
  27. #注意#swfEveryCookieWrap在此页面中是一个隐藏的元素
  28. WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//*[@id='u1']/a[8]"))).click()
  29. '''判断某个元素中是否可见并且是enable的,代表可点击'''
  30. driver.find_element_by_xpath("//*[@id='wrapper']/div[6]/a[1]").click()
  31. #WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//*[@id='wrapper']/div[6]/a[1]"))).click()
  32. #WebDriverWait(driver,10).until(EC.staleness_of(driver.find_element(By.ID,'su')))
  33. '''等待某个元素从dom树中移除'''
  34. #这里没有找到合适的例子
  35. WebDriverWait(driver,10).until(EC.element_to_be_selected(driver.find_element(By.XPATH,"//*[@id='nr']/option[1]")))
  36. '''判断某个元素是否被选中了,一般用在下拉列表'''
  37. WebDriverWait(driver,10).until(EC.element_selection_state_to_be(driver.find_element(By.XPATH,"//*[@id='nr']/option[1]"),True))
  38. '''判断某个元素的选中状态是否符合预期'''
  39. WebDriverWait(driver,10).until(EC.element_located_selection_state_to_be((By.XPATH,"//*[@id='nr']/option[1]"),True))
  40. '''判断某个元素的选中状态是否符合预期'''
  41. driver.find_element_by_xpath(".//*[@id='gxszButton']/a[1]").click()
  42. instance = WebDriverWait(driver,10).until(EC.alert_is_present())
  43. '''判断页面上是否存在alert,如果有就切换到alert并返回alert的内容'''

By的相关汇总

from selenium.webdriver.common.by import By

BY对于的内容

  1. ID = "id"
  2. XPATH = "xpath"
  3. LINK_TEXT = "link text"
  4. PARTIAL_LINK_TEXT = "partial link text"
  5. NAME = "name"
  6. TAG_NAME = "tag name"
  7. CLASS_NAME = "class name"
  8. CSS_SELECTOR = "css selector"

自定义expected_conditions

  1. class current_url(object):
  2. def __init__(self,current_url):
  3. self.current_url = current_url
  4. def __call__(self, driver):
  5. return self.current_url == driver.current_url

使用举例

  1. from selenium import webdriver
  2. from selenium.webdriver.support import expected_conditions as EC
  3. from selenium.webdriver.common.by import By
  4. browser = webdriver.Chrome()
  5. response = browser.get('https://www.12306.cn/index/')
  6. login_button_xpath = '//*[@id="J-header-login"]/a[1]'
  7. print(time.time())
  8. #每1秒扫描一次,直到60秒超时后,停止
  9. a=WebDriverWait(browser,60,1).until(EC.presence_of_element_located((By.XPATH,login_button_xpath)))
  10. login_button = browser.find_element_by_xpath(login_button_xpath)
  11. print(time.time())
  12. login_button.click()

参考文档:http://www.imdsx.cn/index.php/2017/07/27/ec/

深入selenium三种等待方式使用的更多相关文章

  1. python selenium 三种等待方式详解[转]

    python selenium 三种等待方式详解   引言: 当你觉得你的定位没有问题,但是却直接报了元素不可见,那你就可以考虑是不是因为程序运行太快或者页面加载太慢造成了元素不可见,那就必须要加等待 ...

  2. Python selenium 三种等待方式详解

    1. 强制等待第一种也是最简单粗暴的一种办法就是强制等待sleep(xx),强制让闪电侠等xx时间,不管凹凸曼能不能跟上速度,还是已经提前到了,都必须等xx时间.看代码: # -*- coding: ...

  3. Python selenium 三种等待方式详解(必会)

    很多人在群里问,这个下拉框定位不到.那个弹出框定位不到…各种定位不到,其实大多数情况下就是两种问题:1 有frame,2 没有加等待.殊不知,你的代码运行速度是什么量级的,而浏览器加载渲染速度又是什么 ...

  4. Python selenium 三种等待方式解读

    1. 强制等待第一种也是最简单粗暴的一种办法就是强制等待sleep(xx),强制让闪电侠等xx时间,不管凹凸曼能不能跟上速度,还是已经提前到了,都必须等xx时间.看代码: # -*- coding: ...

  5. Python+Selenium - 三种等待方式

    元素:存在 > 可见 > 可用 需要判断元素状态 等待方式1:强制等待  -- 辅助 设置等待几秒,就必须等待几秒 示例: from time import sleepsleep(3) 强 ...

  6. Selenium 三种等待方式详解

    我们在做WEB自动化时,一般要等待页面元素加载完成后,才能执行操作,否则会报找不到元素的错误,这样就要求我们在有些场景下加等待时间. 我们平常用到的有三种等待方式: 强制等待 隐式等待 显示等待 一. ...

  7. 关于selenium中的三种等待方式与EC模块的知识

    1. 强制等待 第一种也是最简单粗暴的一种办法就是强制等待sleep(xx),强制让闪电侠等xx时间,不管凹凸曼能不能跟上速度,还是已经提前到了,都必须等xx时间. 看代码: 1 2 3 4 5 6 ...

  8. Selenium三种等待的使用方式

    在UI自动化测试中,必然会遇到环境不稳定,网络慢的情况,这时如果你不做任何处理的话,代码会由于没有找到元素,而报错.这时我们就要用到wait(等待),而在Selenium中,我们可以用到一共三种等待, ...

  9. Selenium学习之==>三种等待方式

    在UI自动化测试中,必然会遇到环境不稳定,网络慢的情况,这时如果你不做任何处理的话,代码会由于没有找到元素,而报错.这时我们就要用到wait(等待),而在Selenium中,我们可以用到一共三种等待, ...

随机推荐

  1. c语言入门到精通怎么能少了这7本书籍?

    C语言作为学编程最好的入门语言,对一个初进程序大门的小白来说是很有帮助的,学习编程能培养一个人的逻辑思维,而C语言则是公认的最符合人们对程序的认知的一款计算机语言,很多大学都选择了使用C语言作为大学生 ...

  2. Glide只播放一次Gif以及监听播放完成的实现方案

    需求: 近段时间正好有一个需求,是要实现Gif图只加载播放一次,并且要在Gif播放完毕后回调给系统的需求. 因为Glide 3系列的API与4系列还是有很大差距的,这里我们针对Glide 3.x和Gl ...

  3. MySQL Event历史记录

    需求 SQL Server的作业历史(Job)记录是保存在msdb库中的,很方便就查询相关的Job定义,计划和历史记录,而MySQL的event却没有历史记录.为方便查看event是否正常执行以及执行 ...

  4. IT兄弟连 HTML5教程 CSS3属性特效 渐变1

    渐变背景一直以来在Web页面中都是一种常见的视觉元素.但一直以来,Web设计师都是通过图形软件设计这些渐变效果,然后以图片形式或者背景图片的形式运用到页面中.Web页面上实现的效果,仅从页面的视觉效果 ...

  5. Python中通过csv的writerow输出的内容有多余的空行两种方法

    第一种方法 如下生成的csv文件会有多个空行 import csv #python2可以用file替代open with open("test.csv","w" ...

  6. inux CPU监控分析

    一.vmstat 可对操作系统的虚拟内存.进程.CPU活动进行监控 Procs(进程) r: 运行队列中进程数量,这个值也可以判断是否需要增加CPU.(长期大于1) b: 等待IO的进程数量. Mem ...

  7. axios统一接口管理及优化

    之前我写了一篇文章,分享了自己的项目中对于接口管理的方法.总结下来就是:定义接口文件--withAxios导出--调用接口方法.这样实现了接口的统一管理和调用接口的语义化与简单化. 根据在项目的使用, ...

  8. C++ map insert 另一个map的子集

    C++map中 会有insert操作,举个例子 存在map A,我们截取一部分到map B中,void insert (InputIterator first, InputIterator last) ...

  9. swiper手滑导航圆点不同步

    // 滚动图 var mySwiper = new Swiper('.swiper-container', { // 如果需要分页器 pagination: { el: '.swiper-pagina ...

  10. thinkphp6安装报错,composer install tp6 报错 Parse error: syntax error

    composer install thinkphp6 报错 Parse error: syntax error, unexpected ':', expecting '{' in vendor\top ...