页面等待--强制等待、隐式等待和显式等待

1、强制等待

 

from selenium import webdriver
from selenium.webdriver.common.by import By
import time


driver = webdriver.Chrome()
driver.get('https://mail.qq.com/')

# 强制等待
time.sleep(5)

driver.switch_to.frame('login_frame')    # 切换iframe
driver.find_element(by=By.XPATH, value="//a[text()='帐号密码登录']").click()

driver.quit()

2、隐式等待

from selenium import webdriver
from selenium.webdriver.common.by import By


driver = webdriver.Chrome()
driver.get('https://mail.qq.com/')

# 隐式等待:设置查找节点的时候,最大的等待时间
driver.implicitly_wait(30)  # 后续执行到定位节点代码时,自动最多等待30s

driver.switch_to.frame('login_frame')  # 切换iframe
driver.find_element(by=By.XPATH, value="//a[text()='帐号密码登录']").click()

driver.quit()

3、显式等待

import time
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By


driver = webdriver.Chrome()
driver.get('https://www.baidu.com')

# 显式等待:
# wait = WebDriverWait(driver, 30, 0.5)
# located = (By.XPATH, "//a[text()='新闻']")
# conditions = EC.visibility_of_element_located(located)
# wait.until(conditions)

# 工作中显式等待的写法:(本例表示:最多等30s,每隔0.5s检查一下,直到目标节点符合预期条件--可见)
WebDriverWait(driver, 30, 0.5).until(
    EC.visibility_of_element_located((By.XPATH, "//a[text()='新闻']")))

# 显示等待语句后面可以直接跟操作。如:
WebDriverWait(driver, 30, 0.5).until(
    EC.visibility_of_element_located((By.XPATH, "//a[text()='新闻']"))).click()

time.sleep(5)
driver.quit()

 显示等待的常用预期条件:

element_to_be_clickable:等待元素处于可点击的状态

visibility_of_element_located:等待元素处于可见状态

presence_of_element_located:等待元素被加载(html中能找到这个元素)

 

不同的预期条件后能够传入的参数类型也有不同,可查看其源码知晓如何传参

如element_to_be_clickable()中可以传已经定位好的元素,也可以传入定位过程:

 

# 定位到“百度一下”按钮,等待其可点击
# 写法一:
btn = driver.find_element(By.ID, 'su')  # 先定位到元素
WebDriverWait(driver, 5, 0.5).until(EC.element_to_be_clickable(btn))  # 传入元素
# 写法二:(注意:按定位方式传参时,要加上括号)
WebDriverWait(driver, 5, 0.5).until(EC.element_to_be_clickable((By.ID, 'su')))  # 直接传定位方式

 

又如,像visibility_of_element_located()后就只能传定位方式:

# 定位到“百度一下”按钮,等待元素可见
btn = driver.find_element(By.ID, 'su')
WebDriverWait(driver, 5, 0.5).until(EC.visibility_of_element_located((By.ID, 'su')))

 

 

注:隐式等待:等待的是元素能够被找到(html中能找到这个元素)

 

posted @ 2022-01-04 15:52  2orange  阅读(107)  评论(0编辑  收藏  举报