Python自动化测试学习(七)— 元素等待的三种方式

一、为什么设置元素等待

目前大多数Web应用程序都是使用AJAX技术,当浏览器在加载页面时,页面内的元素可能并不是同时被加载完成的。因此当我们在网页上定位元素时,有可能网页已经打开但是元素未加载出来,定位不到元素就会抛出异常。

二、隐式等待

  • 通过一定时长等待页面所有元素加载完成,如果超过设置的时长元素还没有被加载出来则抛出NoSuchElementException异常
  • 隐式等待是设置全局等待,默认等待时间是0s,所以只要设置一次。
  • 在规定时间范围内,浏览器不停的刷新页面,直到找到相关元素结束
from selenium import webdriver
from time import sleep
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("https://www.taobao.com/")
# 隐式等待10s
driver.implicitly_wait(10)
driver.maximize_window()
# 定位淘宝网页首页轮播图
driver.find_element_by_xpath("//div[@class='mod'][1]/ins/a").click()
print("成功")
driver.quit()

三、显示等待

  • 在设置的时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间后仍检测不到元素则抛出异常。
  • 针对某个特定的元素设置等待时间,在设置的时间内,默认每隔一段时间检测一次当前某个元素是否存在,如果找到元素则立即执行,如果超时则抛出NoSuchElementException
from selenium import webdriver
from time import sleep
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("https://www.taobao.com/")
driver.maximize_window()
# 显示等待,EC是expected_condition的别名
element = WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located((By.XPATH, "//div[@class='mod'][1]/ins/a")))
print("成功")
driver.quit()

WebDriverWait()

  由webdriver提供的等待方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。格式如下:

  WebDriverWait(self,driver,timeout,poll_frequency=POLL_FREQUENCY,ignored_exceptions=None)

参数:

    • driver:              webdriver的驱动程序
    • timeout:             设置超时时间,默认以秒为单位
    • poll_frequency:        休眠时间(步长)的间隔,默认为0.5秒
    • ignored_exceptions:    超时后的异常信息,默认情况下抛 “NoSuchElementException". 

until()

WebDriverWait()一般由until或until_not配合使用
until(method,message=’ ’) 调用该方法提供的驱动程序做为一个参数,直到返回值为True

expected_conditions提供一些预期条件的实现

四、强制等待

  1. 设置固定的休眠时间。脚本执行sleep()后线程休眠,另外两种不休眠
  2. 缺点:如果指定的时间过长,即使元素已被加载出来了,但还是要继续等,这样会浪费很多时间

sleep(5): 休眠5s

原文地址:https://www.cnblogs.com/liho/p/14470251.html