Selenium自动化测试中的等待

自动化测试过程当中的等待我习惯分为两种固定等待和动态等待。javascript

1、固定等待html

  固定等待就是直接采用sleep的方式让代码等待固定时间。
  这是比较简单的等待方式,是一种不推荐使用可是在某些特定条件下最快可以解决问题的等待方式。不推荐使用是由于,固定等待过多使用的状况下会极大程度的下降代码的执行效率。
  UI自动化测试的执行速度在很大程度上取决于页面的响应速度,网速以及电脑的配置,这个时候固定时间的等待为了可以提升代码经过率,会把等待时间设置为最长时间的等待,这就形成了大量时间的浪费。可是在没有找到合适的动态等待方式时,固定时间的等待是保证代码可以正常经过的最有效最快速的解决方案。
  我在调试代码时常用添加固定等待的方式来确认代码失败的缘由是否由于等待时间不够。
 
2、动态等待
  1. 隐士等待
  最早接触到的动态等待是selenium的隐示等待。
  这种等待方式的优势显而易见,设定一个最长等待时间,在设定的时间内会一直查找元素,直到最长等待时间超时。可是这种等待方式在不少地方也是不被推荐的。
  隐式等待是针对drive的全局设置,在全部findElement(s)方法处生效(也仅在findElement方法生效),若是自己想要查找的元素就是不但愿存在的,那么他也会等待到最长等待时间。
  
  2. 使用ExpectedConditions进行动态等待
  除了selenium的隐示等待,selenium自己还提供了driverwait和ExpectedConditions及其子类,提供了不少动态等待的方式,例如element_to_be_clickable(), text_to_be_present_in_element_value()
  基于python的Selenium源码能够在如下路径下找到Python27\Lib\site-packages\selenium\webdriver\support\expected_conditions.py
  
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

driver = webdriver.Firefox();
driver.get("http://www.baidu.com")
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.ID,'kw')))

  并且咱们能够参考ExpectedCondition中方式实现本身的动态等待。java

  
除此以外咱们还能够经过设置计时器的方式来实现动态等待,例如封装动态等待元素出现的方法以下:
 
 
 
接下来咱们讨论在UI自动化测试过程当中的常常须要添加等待的场景:
  1. 等待页面元素出现
  这是最多见的等待,咱们能够封装等待页面元素出现的查找元素,来替代隐示等待所完成的功能,从而避免隐示等待的不足
  如下分别给出使用driverwait和计时器两种方式封装的动态等待的代码(java版本):
  2.等待页面加载(刷新,页面跳转,打开新的窗口等)
  页面加载一般在系统中是最耗时的,若是单纯使用等待页面元素出现的方式,就须要将等待超时时间设置的很长才能保证程序顺利运行。可是若是添加了先等待页面加载完成再等待元素出现就会灵活不少。我目前使用过的等待页面加载的方式有如下几种:
    1)经过document.readyState状态码判断。document.readyState是 javascript中判断页面加载状态的字段,有complete等几个状态,咱们须要的是当状态为complete时判断页面加载完成
 2)经过jquery判断。页面加载为了保证加载的效率多采用Ajax异步加载的方式,这时document.readyState已经为complete了,可是页面中部分list仍是在异步加载过程当中。这时咱们就须要使用jquery来判断异步加载是否已经完成。return jQuery.active == 0
    3)经过页面显示的加载进度条来判断。正规的页面在加载过程当中为了与用户进行交互都会添加进度条或者正在加载的图标,最多见的就是动图的⭕️。这个时候咱们可使用等待加载图标消失来判断页面是否加载完成。
 
固然使用什么方式的等待是须要灵活处理的。这里谈一下我在处理等待页面加载时所遇到的两个坑。
  第一个是在点击登陆按钮后,我选择了使用判断document.readyState的方式进行等待,可是发现页面程序并无按照我指望的方式等待。而是直接完成了等待进入了下一个步骤判断元素是否存在,从而因元素不存在而失败了。研究发现点击login按钮后,后台相应处理了一些其余脚本,并无直接发起页面跳转的request。而这个时候咱们的脚本已经去判断了一次document.readyState的状态,这个时候脚本获取的是login页面的状态,而不是我指望home页面的加载状态。在这里我加入了1s的sleep,而后再判断document.readyState,从而解决了问题。
  第二个是对于loading的动态图片。咱们发如今当前系统加载完成后的html源码中找不到这个图片的img标签,这个标签是动态生成并在加载完成后消失的。因此找到这个标签的locator成为了难点。最后咱们经过在页面加载的时候马上断网的方式来使这个img标签不能正常消失,从而来给咱们时间定位这个元素。
相关文章
相关标签/搜索