如今很多web都在使用AJAX技术,运用这种技术的软件当浏览器加载页面时,页面上的元素可能不会被同步加载完成,如此一来,定位元素时就会出现困难。我们可以通过设置元素等待来改善这类问题导致的测试脚本不稳定。
webdriver提供了三种元素等待方式:
强制等待:
time.sleep(5),单位是s。休眠的意思,就是直接让线程休眠,这几秒啥事也不干。
隐式等待:
在脚本创建driver对象之后,给driver设置一个全局的等待时间,对driver的整个生命周期(创建到关闭)都起效。如果在设置等待时间内,定位到了元素则不再等待,继续执行下面的代码。如果超出了等待时间,则抛出异常。driver.implicity_wait(10)
注意: 在使用隐式等待的时候,实际上浏览器会在你自己设定的时间内部不断的刷新页面去寻找我们需要的元素
import pytest
from selenium import webdriver
import time
driver = webdriver.Chrome(executable_path=r"C:\Users\think\Desktop\chromedriver")
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")
print(driver)
driver.quit()
显示等待:
显示等待,就是明确的要等到某个元素的出现或者是某个元素的可点击条件,等不到,就一直等,除非在规定的时间之内都没找到,那么就抛出Exception。(简而言之,就是直到元素出现才去操作,如果超时则报异常)。
方法:WebDriverWait(driver,timeout,pool_frequency=0.5,ignored_exceptions=None)
until(method,info):直到满足某一个条件,返回结果,等不到就抛错
method---->excepted_conditions.presence_of_element_located(locator):判断某个元素是否定位到了
locator------>By.Id,By.Name
注意:若同时设置了隐式等待,则以隐式等待为第一优先级,也就是说,若隐式等待时间大于显示等待,显示等待时间设置无效,因为driver若找不到元素,会先等待隐式等待的时间。
import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
driver = webdriver.Chrome(executable_path=r"C:\Users\think\Desktop\chromedriver")
driver.get('https://www.baidu.com')
ele = WebDriverWait(driver,10,0.5,ignored_exceptions=None).until(EC.presence_of_element_located((By.ID,'kw')),'找不到')
if ele:
ele.send_keys('selenium')
time.sleep(3)
else:
print(ele)
driver.quit()