隐式等待
定位元素时,如果能定位到元素则直接返回该元素,不触发等待; 如果不能定位到该元素,则间隔一段时间后再去定位元素;如果在达到最大时长时还没有找到指定元素,则抛出元素不存在的异常 NoSuchElementException;
方法:driver.implicitly_wait(timeout) ???????????(timeout: 为等待最大时长, 单位: 秒) 说明:隐式等待为全局设置(只需要设置一次, 就会作用于所有元素)
# 需求: 打开注册A页面, 完成以下操作
# 1).使用隐式等待定位用户名输入框, 如果元素存在, 就输入admin
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
# 设置隐式等待10s
driver.implicitly_wait(10)
driver.get("D:\python\web自动化\显式、隐式等待\注册A.html")
sleep(2)
# 给一个错误的id,不能找到元素,如果直接抛出异常说明等待失效,如果在设置的指定时长抛出异常,说明等待生效
driver.find_element_by_css_selector("user").send_keys("admin")
sleep(2)
driver.quit()
显示等待
定位指定元素时,如果能定位到元素则直接返回该元素,不触发等待;如果不能定位到该元素,则间隔一段时间后再去定位元素;如果在达到最大时长时还没有找到指定元素,则抛出超时异常TimeoutException
注:在Selenium中把显式等待的相关方法封装在WebDriverWait类中
实现方式
1. 导包 等待类 --> from selenium.webdriver.support.wait import WebDriverWait 2. WebDriverWait(driver, timeout, poll_frequency=0.5) ????????1). driver: 浏览器驱动对象 ????????2). timeout:超时的时长,单位:秒 ????????3). poll_frequency:检测间隔时间,默认为0.5秒 3. 调用方法 until(method): 直到...时 ????????1). method:函数名称,该函数用来实现对元素的定位 ????????2). 一般使用匿名函数来实现:lambda x: x.find_element_by_id("userA") 4. element = WebDriverWait(driver, 10, 1).until(lambda x: x.find_element_by_id("userA"))
匿名函数参考:https://blog.csdn.net/weixin_43790276/article/details/90730797?
# 需求: 打开注册A页面, 完成以下操作
# 1).使用显式等待定位用户名输入框, 如果元素存在, 就输入admin
from time import sleep
from selenium import webdriver
# 导包
from selenium.webdriver.support.wait import WebDriverWait
driver = webdriver.Chrome()
driver.get("D:\python\web自动化\显式、隐式等待\注册A.html")
# 实例化WebDriverWait()并调用until方法
element = WebDriverWait(driver, 10, 1).until(lambda x: x.find_element_by_id("userA"))
element.send_keys("admin")
sleep(3)
driver.quit()
显式等待与隐式等待的区别
1. 作用域: 隐式为全局元素, 显式等待为单个元素有效 2. 使用方法: 隐式等待直接通过驱动对象调用, 而显式等待方法封装在WebDriverWait类中 3. 达到最大超时时长后抛出的异常不同:隐式为NoSuchElementException, 显式等待为TimeoutException
注:隐式等待和显示等待都存在时,超时时间取二者中较大的
拓展:
隐式等待 隐式等待是设置的全局等待 1、页面加载超时等待; 2、页面元素加载超时; 3、异步脚本超时。 如果是页面元素超时,设置等待时间,是对页面中的所有元素设置加载时间。
页面加载超时时间设置为5s
driver.manage().timeouts().pageLoadTimeout(5,TimeUnit.SECONDS);
driver.get("https://www.baidu.com/");
定位对象时给10s的时间, 如果10s内还定位不到则抛出异常
driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS);
driver.findElement(By.id("kw")).sendKeys("隐式等待");
异步脚本的超时时间设置成3s
driver.manage().timeouts().setScriptTimeout(3,TimeUnit.SECONDS);
|