3、强制等待、隐式等待、显示等待
什么是元素等待:WebDriver定位页面元素时如果未找到,为了保证脚本运行的稳定性,需要脚本中添加等待时间
为什么设置元素等待:网络速度、电脑配置、服务器chul请求
等待方式分为:强制等待、隐式等待、显示等待
1、强制等待:强制等待固定的时长
适用场景:脚本调试、倒计时页面
使用方法:
import time
time.sleep(5) 以秒为单位
from selenium import webdriver
import time
class Login():
def __init__(self):
self.driver = webdriver.Chrome()
def login(self):
self.driver.get("http://rip-stage-test3.msxfcloud.test/login")
self.driver.maximize_window()
self.driver.find_element_by_xpath('//*[@id="app"]/div/div/div[1]/div/div[2]/form/div[1]/div/div/input').send_keys("admin")
self.driver.find_element_by_xpath('//*[@id="app"]/div/div/div[1]/div/div[2]/form/div[2]/div/div/input').send_keys("admin@12345")
self.driver.find_element_by_xpath('//*[@id="app"]/div/div/div[1]/div/div[2]/form/div[3]/div/div/input').send_keys("123456")
self.driver.find_element_by_xpath('//*[@id="app"]/div/div/div[1]/div/div[2]/form/div[4]/div/button').click()
time.sleep(5) #强制等待
self.driver.quit()
2、隐式等待:
隐式等待是通过一定的时长等待页面上元素加载完成。如果超出了设置的时长元素还没有被加载,则抛出NoSuchElementException异常。它的作用范围就是WebDriver对象实例的整个生命周期。
等待方法:implicitly_wait()来实现,默认单位为秒
适用场景:需要验证页面上所有元素加载完成的时间时,可以使用隐式等待
作用范围:当前页面 整个页面上的所有元素,隐式等待对整个WebDriver的周期都起作用,所以只要设置一次即可
我们把元素更改为一个找不到,看下报错异常提示:
from selenium import webdriver
from time import ctime #ctime导入后作为一个时间戳判断一下
class Login():
def __init__(self):
self.driver = webdriver.Chrome()
def login(self):
self.driver.get("http://rip-stage-test3.msxfcloud.test/login")
self.driver.implicitly_wait(5) # 隐式等待,等待5秒加载不出来就会抛出异常,5秒内加载出来正常返回
self.driver.maximize_window()
try:
print(ctime()) #打印时间
self.driver.find_element_by_xpath('//*[@id="app"]/div/div/div[1]/div/div[2]/form/div[1]/div/div/input').send_keys("admin")
self.driver.find_element_by_xpath('//*[@id="app"]/div/div/div[1]/div/div[2]/form/div[2]/div/div/input').send_keys("admin@12345")
self.driver.find_element_by_xpath('//*[@id="app"]/div/div/div[1]/div/div[2]/form/div[3]/div/div/input').send_keys("123456")
self.driver.find_element_by_xpath('//*[@id="app"]/div/div/div[1]/div/div[2]/form/div[4]/div/button1').click() #正确的是button
except Exception as msg:
print(msg)
finally:
print(ctime()) #最后打印时间

一共等待了5秒,5秒找不到就报异常
3、显示等待
在设定的时间内针对某一个元素默认每隔一段时间检测该元素是否存在,如果超出设定时间检测不到抛出异常。until表示如果找到,则继续下一步,否则抛出异常NoSuchElementException/TimeOut异常;Until_Not()与Until相反。默认时间是以秒为单位。
缺点:应用上来说,相对于其他两种等待更为复杂
优点:精确对某个特定条件进行等待,不会浪费多余的任何时间在等待上,如果条件成立,立即进入下一步,如果不成立则抛出异常
使用方法:WebDriverWait(driver,timeout,poll_frequency=0.5)
driver--浏览器
timeout--最大等待时间
poll_frequency--轮询时间
WebDriverWait(driver实例, 超时时长, 调用频率, 忽略的异常).until(要调用的 方法, 超时时返回的信息)
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait #显示等待
from selenium.webdriver.common.by import By #元素定位
from selenium.webdriver.support import expected_conditions as EC #判断元素是否存在
class Login():
def __init__(self):
self.driver = webdriver.Chrome()
def login(self):
self.driver.get("http://rip-stage-test3.msxfcloud.test/login")
self.driver.maximize_window()
try:
WebDriverWait(self.driver,10,0.5).until(EC.visibility_of_element_located((By.XPATH,'//*[@id="app"]/div/div/div[1]/div/div[2]/form/div[1]/div/div/input'))).send_keys("admin")
WebDriverWait(self.driver,10,0.5).until(EC.visibility_of_element_located((By.XPATH,'//*[@id="app"]/div/div/div[1]/div/div[2]/form/div[2]/div/div/input'))).send_keys("admin@12345")
WebDriverWait(self.driver,10,0.5).until(EC.visibility_of_element_located((By.XPATH,'//*[@id="app"]/div/div/div[1]/div/div[2]/form/div[3]/div/div/input'))).send_keys("123456")
WebDriverWait(self.driver,10,0.5).until(EC.visibility_of_element_located((By.XPATH,'//*[@id="app"]/div/div/div[1]/div/div[2]/form/div[4]/div/button'))).click()
except Exception as msg:
print(msg)
# self.driver.quit()
if __name__ == '__main__':
aa = Login()
bb = aa.login()
注解:1、

2、 visibility_of_element_located(locator) 判断某个locator元素是否可见。
可见代表非隐藏、可显示,并且元素的宽和高都大于0
如果定位到就返回WebElement,找不到元素 报错Message: no such element: Unable to locate element

浙公网安备 33010602011771号