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

posted @ 2021-09-06 13:59  东北小酱  阅读(434)  评论(0)    收藏  举报