• 2
  • 2
分享
  • 加载页面信息,刷不出来心态都崩了
  • 曼倩诙谐 2020-09-18 10:55:27 字数 4199 阅读 1060 收藏 2

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

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

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

  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 webdriver
  import unittest
  class 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()

  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 webdriver
  from selenium.webdriver.common.by import By
  from selenium.webdriver.support.ui import WebDriverWait
  #定义了变量EC表示expected_conditions
  from selenium.webdriver.support import expected_conditions as EC
  import unittest
  class 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带有多种预期条件:

Y5.png

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

  (1)element_to_be_clickable(element locator) 

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

  示例代码:

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

Y7.png

  (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]'),"常联系"))

Y8.png

  (3)title_is()

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

  示例代码:

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

 Y9.png

  隐式等待 VS 显式等待

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

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

Y10.png

  总结

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


作者:罗狮小钉

来源:51Testing软件测试网原创

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 8月16日消息,谷歌面向 Pixel 手机推出 Android 13 正式版。此次 Android 更新进一步增强 Android 12 中引入的 Material You 主题,改进了现有的隐私控制,并引入了在支持的 Android 设备复制和粘贴的功能。通过个性化,谷歌引入了自定义非 Google 应用程序以匹配已设置的主题和颜色的功能,使用户设计的 Material 在智能手机中更具凝聚力。它还包含基于每个应用程序语言设置的更新,并提供更新的媒体播放器和就寝模式。出于隐私考虑,谷歌添加了更精细的权限设置,允许用户仅共享特定的照片和视频,而不是授予对媒体库的完全访问权限。Android 1...
            0 0 837
            分享
          • 1、引言性能这块,虽然是小鱼一直不想去触碰的地方,但是,身在江湖漂,哪能不带刀!!小屌丝:鱼哥,最近你得注意身体啊小鱼:昂… 怎么突然关心起我来了?小屌丝:还用我说嘛,最近你博文更新的慢,不是在耍妹子,就是在去耍妹子的路上。小鱼:( ‵o′)凸…我这是在忙工作的事情小屌丝:我差点信了!!小鱼:…算了,我不替自己解释了, 我替IO解释吧!小屌丝:难道,今天要整IO? 那赶紧!在认识IO之前,我们要先了解 一下磁盘。然后在慢慢的认识IO2、 硬盘知识2.1 磁盘原理1、定义①盘片以每分钟数千转到上万转的速度在高速旋转,15K 10k 7.5k 5.2k RPM②磁头就能对盘片上的指定位置进行数据的...
            1 0 3298
            分享
          • 混迹于测试行业这么长时间了,一直想写一篇关于软件测试的经验分享的文章,但苦于工作原因迟迟未下笔。最近终于有了些闲余时间,遂决定把自己的心路历程及所感所想记录下来,与各位同行共勉。软件测试究竟是做什么的呢?软件测试是为了发现错误而执行程序的过程。或者说,软件测试是根据软件开发各阶段的规格说明和程序的内部结构而精心设计一批测试用例(即输入数据及其预期的输出结果),并利用这些测试用例去运行程序,以发现程序错误的过程。简而言之就是证明程序的正确性,检察系统是否满足用户需求,发现bug,证明程序有错。(划重点:找bug不是改bug哦~)软件测试前景又如何?软件测试工程师行业前景好、职业寿命长:根据相关招...
            0 0 826
            分享
          • 读者提问:APP 注册功能,用例怎么写 ?阿常回答:假定该注册为手机号发送验证码的注册方式,注册界面存在 3个输入框(手机号,密码,验证码), 2个按钮(发送验证码,注册),和 1个同意用户协议勾选框☑️。校验规则:手机号为 11位数字,密码为 8~20位大小写字母和数字,1小时内发送验证码上限为 5次。一、正常注册流程正常注册流程 case前置条件    应用安装成功,网络连接正常    输入数据    手机号18957440009,密码 Aa123456,验证码 20342测试步骤1、输入手...
            0 0 1700
            分享
          •   前言  我从来没有好好的写过一个测试用例,之前做开发虽然写单元测试和流程测试,基本上都是基于自己的代码,而且单元测试和流程测试的框和规范已经非常完善,你只需要填空就行,后来转做自动化测试,但我的做事的方法和思维还停留在开发层面,用例基本上是从手工业务功能测试集抽取,我只要按照这个子集给转换成脚本代码去运行就好了,并没有系统地完完整整的根据业务需求去手工写个一个用例。闲暇的时候,我们也会聊什么才算是一个好的测试用例,在深入了解这个之前,我去系统的看了下测试的基础。 测试也是有很多方法的。从网上也能搜到这方面的很多资料,我也是总结前辈的知识。  测试的方法  作为测试,我们的主要目标就是保证系...
            0 0 427
            分享
      • 51testing软件测试圈微信