出品 | 51Testing软件测试网

只要访问过网页的地球人都知道,很多时候页面内容的加载并非与你的访问操作实时同步显现。是什么原因导致的呢?这是由于大多数Web应用程序都结合Ajax/Javascript技术开发,当浏览器进行页面信息加载时,页面中的元素会在不同的时间间隙内陆续完成加载,比较常见的场景诸如:跟随你的滚动条下滑,逐步呈现当前图文信息;鼠标悬停某文本框,自动出现提示文本等。

对于Web自动化测试而言,页面元素呈现的时间差异会让元素识别变得相对困难,在未能找到指定元素的情况下,还会引发各种异常报错,如“Element not found”等。所幸的是Selenium WebDriver提供了不同的等待类型,助我们较好地解决此类难题。

Selenium WebDriver为用户提供了“隐式等待”& “显式等待”两种等待方式,用于处理重复的页面加载,页面元素加载,窗口显示,弹窗,错误消息及Web元素在网页上的呈现形式,下面我们就这两种等待形式逐一详解。

01

WebDriver隐式等待

Selenium中的隐式等待用于通知WebDriver在抛出类似“Element not found”之前要等待一定的时间,默认设置为0。一旦设置了时间,WebDriver将在该时间内等待该元素,超过等待时间后,如还未找到该元素,则触发相应的异常。

隐式等待服务于当前的整个测试脚本, 即:提供整个测试脚本中每个连续测试步骤/命令之间的默认等待时间(例如自行设置默认等待时间为20秒)。因此,仅当在执行前一个测试步骤/命令后经过20秒时才能执行后续测试步骤。

如下Selenium - Python示例中声明了一个隐式等待,其时间范围为10秒。这意味着,如果该元素不在10秒内出现在页面上,就会引发异常。

隐式等待语法(时间以秒为单位):

selenium.webdriver.driver.implicitly_wait(time in seconds)

场景一:仅获取当前页面标题

from selenium import webdriverimport unittestclass Wait_demo1(unittest.TestCase):    def setUp(self):        self.driver = webdriver.Chrome()        self.driver.get("https://mail.qq.com/")        self.driver.maximize_window()        self.driver.implicitly_wait(10)    def test_title(self):        t = self.driver.title        if(t=="登录QQ邮箱"):            print("\nPASS")        else:            print("\nFAIL")    def tearDown(self):        self.driver.quit()

02

WebDriver显式等待

Selenium中的显式等待用于通知WebDriver在引发类似“Element not found”异常之前,需要先在设置的最大延迟时间内等待某些期望条件的出现,这是一种比较聪明的等待方式,但是它只能应用于指定的元素。与隐式等待相比,显式等待提供了更好的选择,因为它可以用来等待动态加载的Ajax元素,针对性和灵活度更强。

如下示例中,我们实现以下操作:

(1)登录QQ邮箱基础版;

(2)然后创建显式等待;

(3)等待页面元素“收件箱”的出现,并且给出的最大时间范围为20秒;

(4)若元素成功出现,获取元素文本信息,并点击该元素。

显式等待语法(时间以秒为单位):

from selenium.webdriver.support.ui import WebDriverWait

WebDriverWait(driver,time).until(expected_conditions.设置等待条件)

场景二:成功登录后,获取收件箱元素文本信息,点击收件箱

from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWait#定义了变量EC表示expected_conditionsfrom selenium.webdriver.support import expected_conditions as ECimport unittestclass ECwait_Demo1(unittest.TestCase):    def setUp(self):        self.driver = webdriver.Chrome()        self.driver.get("https://mail.qq.com/")        self.driver.maximize_window()    def test_login_mail(self):        # 定位到“基本版”,并点击        self.driver.find_element(By.LINK_TEXT,"基本版").click()        # 输入用户名和密码        self.driver.find_element(By.ID,"u").send_keys("有效账号")        self.driver.find_element(By.ID,"p").send_keys("有效密码")        # 点击登录按钮        self.driver.find_element(By.ID,"go").click()        # 显式等待 20 秒, 等待“收件箱”的出现        element = WebDriverWait(self.driver,20)        element.until(EC.visibility_of_element_located((By.XPATH,'//*[@id="ct"]/div/div[3]/div[1]/div[1]')))        # 获取“收件箱”元素中的文本        mail_box = self.driver.find_element(By.XPATH,'/html/body/div/section[1]/div/ul/li[1]/a/span[2]/span[1]')        # 打印文本        print(mail_box.text)        # 点击收件箱        mail_box.click()    def tearDown(self):        self.driver.quit()

以上场景中,设定在规定时间内(20秒)等待“收件箱”元素的出现,这里的条件设置“ExpectedConditions”为“visibility_of_element_located”。

显式等待之所以灵活,还有一个原因是Selenium给我们提供的各类预期条件,除了上面的“visibility_of_element_located”还有(在pycharm中可以通过智能下拉列表来找到当前你需要的那个“预置条件”):

ExpectedConditions带有多种预期条件:

基于ExpectedCondition预期条件种类较多,下面我们简单介绍几个常用的方面,其余以此类推,供大家有兴趣自行尝试:

(1)element_to_be_clickable(element locator)

预期条件:等待直到该元素可单击,即该元素应在屏幕上显示/可见/可操作;

示例代码:

element = WebDriverWait(self.driver, 20)element.until(EC.element_to_be_clickable((By.ID,"qqLoginTab")))

(2)textToBePresentInElement(element locator,string txt)

预期条件:等待含有指定字符串的元素;

示例代码:

element = WebDriverWait(self.driver, 20)element.until(EC.text_to_be_present_in_element((By.XPATH,'/html/body/div/div[2]/div[2]/div[2]/div[2]/p[1]'),"常联系"))

(3)title_is()

预期条件:等待带有指定标题的页面

示例代码:

element = WebDriverWait(self.driver, 20)element.until(EC.title_is("登录QQ邮箱"))

03

隐式等待 VS 显式等待

如果在测试中存在必须同时使用隐式和显式等待的情况, 假定隐式等待时间设置为20秒,显式等待时间设置为10秒。

显式等待中试图找到一个具有“ ExpectedConditions”条件等待的元素,如果该元素不在显式等待(10秒)定义的时间范围内,那么将使用隐式wait( 20秒)之后,如还未出现再抛出“ElementNotFound”之类的异常。

04

总结

以上基于Selenium WebDriver中的两类等待进行深入解析,隐式和显式这两种等待各有其优势,大家在Web自动化测试脚本编写过程中,需要根据实际情况,恰当地使用隐式和显式等待。

END

思考:只针对findelement方法生效的等待方式是哪一个?欢迎小伙伴们在评论区畅所欲言,友好交流~

推荐阅读

点击阅读☞WebDriver和浏览器间的竞争关系,Selenium竟然能解决!

点击阅读☞如何在Python上进行Selenium的弹框操作?

点击阅读☞想知道Selenium自动化会遇到哪些常见问题?你算来对了!

点击阅读☞从零到设计Python+Selenium自动化测试框架,如何开始?

点击阅读☞不可不知的Selenium 8种元素定位方法!

中jsp加载不出来layui_加载页面信息,刷不出来心态都崩了相关推荐

  1. aspx ttf文件加载不出来_加载页面信息,刷不出来心态都崩了

    出品 | 51Testing软件测试网 只要访问过网页的地球人都知道,很多时候页面内容的加载并非与你的访问操作实时同步显现.是什么原因导致的呢?这是由于大多数Web应用程序都结合Ajax/Javasc ...

  2. 让Spring 3中jsp的数据对象使用懒加载(FetchType.LAZY)与Controller的JSR 303并存

    本文出处:http://blog.csdn.net/chaijunkun/article/details/9083171,转载请注明.由于本人不定期会整理相关博文,会对相应内容作出完善.因此强烈建议在 ...

  3. 更改eclipse中jsp默认编码格式为UTF-8

    近段时间一直在学java三大框架,遇到了一个问题:eclipse中jsp默认编码格式不是UTF-8,导致页面显示中文出现乱码,每次单独修改过于麻烦. 解决方案:window--Preferences- ...

  4. (转)web.xml 中的listener、 filter、servlet 加载顺序及其详解

    转: https://www.cnblogs.com/Jeely/p/10762152.html web.xml 中的listener. filter.servlet 加载顺序及其详解 一.概述 1. ...

  5. 解决Chrome中UEditor插入图片的选择框加载过慢问题

    解决Chrome中UEditor插入图片的选择框加载过慢问题 ../resources/plugins/ueditor/ueditor.all.js 中line24489/24498中的 accept ...

  6. MATLAB实战系列(十五)-在matlab中如何实现Octave工具包的全自动加载?

    前言 俗话说,"工欲善其事必先利其器".想要高效地使用Octave,做好前期工作是相当有必要的.有的工具包安装后并不能被Octave自动使用,需要先加载才能使用.那么问题来了,要怎 ...

  7. composer php中如何执行,php中composer如何实现类的自动加载(示例讲解)

    本篇文章给大家带来的内容是关于php中composer如何实现类的自动加载(示例讲解),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 我们在开发项目中会经常用到第三方的类库插件,但是 ...

  8. jQuery Mobile 手动显示ajax加载器,提示加载中...

    在使用jQuery Mobile开发时,有时候我们需要在请求ajax期间,显示加载提示框(例如:一个旋转图片+一个提示:加载中...).这个时候,我们可以手动显示jQuery Mobile的加载器,大 ...

  9. java中class文件如何加载的_jvm如何加载class文件

    编译期: javac是JDK自带的编译器, 可以将java文件编译为class字节码文件, javap是JDK自带的反编译器,将.class字节码反编译为.java文件,javap -help是jav ...

最新文章

  1. 使用nGraph的Intel®Xeon®上的高性能TensorFlow
  2. Linux 操作系统原理 — 内存 — 内存分配算法
  3. Python-IDLE实现清屏
  4. python3的socket_python2 与 python3 socket编程的一点小区别
  5. java知识点--基础篇(5)
  6. pollard_rho大数分解Java版
  7. PCF上的Spring Cloud合同和Spring Cloud Services
  8. java读取文件夹,如何从Java读取文件夹中的所有文件?
  9. 诗与远方:无题(八十九)
  10. windows server 2008 R2 服务器关机总结
  11. Spring MVC url提交参数和获取参数
  12. 韩国央行行长李柱烈:加密货币的波动给金融稳定带来风险
  13. html5在线裁剪,HTML5 Canvas裁剪clip
  14. mac上安装webpack报错解决方法Hit error EACCES: permission denied, mkdir ‘/usr/local/lib/node_modules/webpack
  15. 简单php文件编写语法
  16. 机器人技术创新与实践旧版本大纲
  17. 使用SPSS 进行两组独立样本的t检验、F检验、显著性差异、计算p值
  18. Arm开发板上使用ldd命令
  19. ASIC开发流程介绍
  20. gmx一定要在linux下运行么,gmx_mmpbsa使用说明

热门文章

  1. idea中使用git直接提交本地写好的代码
  2. 【Drools一】值得打工人学习的规则引擎Drools
  3. 百度 图片文字识别 Python版本
  4. link标签的几个用法,帮助提高页面性能
  5. nodejs集成sqlite
  6. 浏览器滚动的详细解释 Vue 固定滚动位置的实现
  7. jquery代码小片段
  8. sendRedirec forward
  9. vs2008生成lib文件
  10. 程序员需培养企业家式的能力