自动化打开一个网页的时候,内部网页元素加载完全有一点的延迟性,因此在做 Web 端的自动化测试的时候,一般都需要在测试 case 时加入一些等待操作,否则可能会出现页面还未加载完全,导致定位元素的时候出现“no such element”异常。

  我们常用等待操作有3种,分别是:强制等待sleep、隐式等待、显示等待

1、强制等到sleep()

效率最低,不建议使用。其使用简单,一般在调试脚本时使用

2、隐式等待(driver.implicitly_wait(5))

  隐式等待也是设定一个固定的等待时间,对整个生命周期的元素都起作用,所以只要设置一次即可。其设置了一个最长等待时间,程序会一直等待整个页面加载完成,才会执行下一步操作;但有时候页面想要的元素早已经加载完成了,但是因为网页上个别元素还没有加载完成,仍要等到页面全部完成才能执行下一步,使用也不是很灵活,且有失败风险,可能会导致用例执行失败,不太建议使用
  **警告:不要混合使用隐式和显式等待。这样做会导致不可预测的等待时间。例如,将隐式等待设置为10秒,将显式等待设置为15秒,可能会导致在20秒后发生超时。

#初始化浏览器
driver = webdriver.Chrome()
#最大化浏览器
driver.maximize_window()
#隐式等待
driver.implicitly_wait(5)
#打开url
driver.get('http://116.63.181.151')

#获取登录链接
driver.find_element(By.LINK_TEXT, '登录').click()...

  3、显示等待

显式等待 相比隐式等待更灵活,是先设定一个条件函数和一个最长等待时长,轮询判断条件函数的返回值,如果返回 True则开始执行后面的操作,否则会一直等待,直到超时报元素未找到异常
  示例代码
  from selenium import webdriver1
  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://XX.com")
  element =WebDriverWait(driver,18).until(Ec,presence of element located((Bv.ID, "Element"))

显示等待需要用到两个类:WebDriverWait和expected_conditions两个, WebDriverWait指定轮询间隔、超时时间等expected_conditions 指定了很多条件函数(也可以自定义条件函数)。

(1)WebDriverWait(driver,timeout,poll_frequency=0.5,ignored exceptions=None)

  driver:浏览器驱动
  timeout:最长超时时间,默认以秒为单位
  poll_frequency:轮询的间隔步长,默认为0.5

  signored_exceptions:忽略等待时出现的特定类型的异常,默认忽略NoSuchElementExeception异常  

WebDriverWait()中有until(expected_confition)和until not(expected_confition)方法     

(2)expected_confition 等待条件

最常用的两种等待条件:
(1) presence_of_element_located(locator)
判断某个元素是否被加到了dom树里,并不代表该元素一定可见

(2) visibility of_element located(element)
判断某个元素是否可见,可见代表元素非隐藏,并且元素的宽和高都不等于0
locator(定位器)    element(元素)

例子
username = WebDriverWait(driver 10).until(Ec.presence_of_element_located((By.XPATH "//input[contains(@placeholder "用户名')]"))
username.send_keys("admin")
password= WebDriverWait(driver, 10).until(Ec,visibility of_element located(driver.find_element(By.XPATH "//input[contains(@placeholder "密码')]"))
password.send_keys("123456")

 

(3)其他等待条件
title_is(title)
title_contains(title)

posted on 2024-04-28 23:06  WXHNWLJ  阅读(9)  评论(0编辑  收藏  举报