页面等待--强制等待、隐式等待和显式等待
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中能找到这个元素)