注:本文转载http://www.cnblogs.com/mengyu/p/6972968.html

当浏览器在加载页面时,页面上的元素可能并不是同时被加载完成,这给元素的定位增加了困难。如果因为在加载某个元素时延迟而造成ElementNotVisibleException 的情况出现,那么就会降低自动化脚本的稳定性,我们可以设置元素等待时间改善这种问题造成的不稳定性。selenium 主要提供Explicit Waits和Implicit Waits两种模式的等待,但是python time 模块也提供了一种非智能的sleep()等待,这个设置以后必须强制等待设置的时间,只有等待时间结束以后才会继续执行,这种模式我一般会用到观察执行的效果时候,而Explicit Waits和Implicit Waits 这两种我会在实际自动化测试中使用。

WebDriver提供了两种类型的等待,显示等待和隐式等待

1.强制等待

  强制等待属于python time模块的一种等待,使用时需要引入time模块才可以使用,下面我们看一断代码

#-*- coding:utf-8 -*-
import time
from datetime import datetime
print (datetime.now()) #获取当前时间
time.sleep(10) #设置等待时间10s
print(datetime.now()) #再次获取当前时间

代码很简单,主要是获取当前时候后设置了一个等待时间,然后在等待时间后面设置一个事物,这个事物来查看等待时间结束后的当前时间。通过执行结果我们很好的看到只有执行完毕等待以后才会再次执行下一步骤。

2.隐性等待 implicitly_wait()

  什么是隐性的等待呢?所谓的隐性的等待就是我们设置了一个等待时间范围,这个等待的时间是不固定的,最长的等待也莫过于我们设置的最大值。用高考来举个例子,高考的语文是6月7日上午9:00 - 11:30,我们只能在规定的时间内答题交卷,不能超过11:30 交卷,如果我们提前答完卷,那么我们可以提前交卷,那么这里规定的2.5小时是我们设置的最大等待时间,而我们可以再任何时间答完试卷均去交卷,但是我们不能超过11:30交卷,也就是说明最大的答卷时间就是2.5h(正好也是因为此时刚刚高考结束,所以我这边也趁下热度)。

下来我们看段代码

#-*- coding:utf-8 -*-
from selenium import webdriver
from datetime import datetime
print(datetime.now())
driver =webdriver.Firefox()
driver.implicitly_wait(10) #这里设置智能等待10s
driver.get("https://www.baidu.com")
print (driver.title)
print(datetime.now())
driver.quit()

  这里主要采用 implicitly_wait(10)方法来设置等待时间,这里要比time.sleep(10)更加智能一些。

  说明:首先Implicit Waits默认是等待时间是0,同时隐性等待是对driver起作用,所以只要设置一次即可,没有必要到处设置

3.显示的等待 WebDriverWait()

 WebDriverWait()会配合until()和until_not()方法一起使用,根据判断条件而进行灵活进行处理时间等待问题,他会不断的根据你设定的条件去判断,直到超过你设置的等待时间,如果设置的条件满足,然后进行下一步操作,如果没有满足会报一个'selenium.common.exceptions.TimeoutException: Message: '错误,使用WebDriverWait首先需要导入from selenium.webdriver.support.ui import WebDriverWait模块,下面我们看一下实际的代码

#-*- coding:utf-8 -*-
from datetime import datetime
from selenium import webdriver
from selenium.webdriver.common.by import By
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.maximize_window()
try:
#为了更好的对比效果,首先我们设置了一个存在的元素,然后在去找一个不存在的元素,同样设置了10s的等待时间
#kw元素存在时
print(datetime.now()) #
element = WebDriverWait(driver,10).until( #until 也属于WebDriverWait,代表一直等待,直到某元素可见,until_not与其相反,判断某个元素直到不存在
EC.presence_of_element_located((By.ID, "kw")) #presence_of_element_located主要判断页面元素kw在页面中存在。
)
#kw111元素不存在时
print(datetime.now())
element = WebDriverWait(driver,10).until(
EC.presence_of_element_located((By.ID, "kw111"))
) finally:
print(datetime.now())
driver.quit()

通过运行的结果我们可以看到,id为kw和kw111两个元素,均设置了10s等待时间,当id为kw的元素找到的时候很快就去执行下一步,,找id 为'kw111'元素时,发现无法找到一直等待下去,期间会不断的去巡查,直到超过我们设置的连接超时的时间报一个TimeoutException错误。

最新文章

  1. functools模块
  2. 解决sqlite3_key的问题
  3. mysql数据库连接方式(.net)
  4. QuickSort快速排序的多种实现和优化
  5. 自然语言处理2.1——NLTK文本语料库
  6. USACO Section 2.2: Party Lamps
  7. 部署WAR文件到tomcat
  8. UI3_视图切换
  9. C++(MFC)编程一些注意事项
  10. C# string LastIndexOf()
  11. hadoop 分片与分块,map task和reduce task的理解
  12. 干掉Google字体,WordPress速度暴涨
  13. 自己动手写shell之chgrp,chown,chmod
  14. UE标签排列方式
  15. Java protobuf框架使用向导
  16. DICOM医学图像处理:DCMTK在VS2012中的配置
  17. (11.13)Java小知识!
  18. linux僵尸进程
  19. QueryRunner--常见方法
  20. VC显示网页验证码、模拟CSDN网页登录

热门文章

  1. [poj3071]football概率dp
  2. SharePoint 2013 set site mailbox
  3. C#——传值参数(3)
  4. JAVA基础--IO输入输出(File使用)17
  5. Golang : cobra 包简介
  6. 利用外部协议让chrome启动外部应用程序
  7. 洛谷P3264 [JLOI2015]管道连接(斯坦纳树)
  8. Delphi调用C# 编写dll动态库
  9. php输出变量加{}的作用
  10. Unity 关于时间