1 强制等待
import time
from selenium.webdriver import Chrome
br = Chrome()
br.get('https://www.baidu.com/')
br.find_element_by_xpath('//*[@id="kw"]').send_keys('大西瓜')
time.sleep(2) # 强制等待2秒
br.quit()
2 隐式等待 比强制等待更加智能,设置一次对浏览器对象的整个生命周期生效;
默默等待元素出现,出现即继续往下执行;如超过设置时间还是未找到则会报超时错误
import time
from selenium.webdriver import Chrome
br = Chrome()
br.implicitly_wait(3) # 隐式等待,每次等待至多3秒
br.get('https://www.baidu.com/')
br.find_element_by_xpath('//*[@id="kw"]').send_keys('大西瓜')
time.sleep(2)
br.quit()
3 显示等待 指定条件进行等待
等待元素被加载
等待元素可见
等待元素可点击
import time
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By # 通过xx方式去查找元素
from selenium.webdriver.support.wait import WebDriverWait # 等待机制,传入三个参数 浏览器对象、最长等待时间、轮巡时间;
# until()等待方法,需传入一个期望的等待条件;必须传入一个格式如(By.XPATH, '//*[@id="kw"]')的元组
from selenium.webdriver.support import expected_conditions as EC # 期望等待条件
br = Chrome()
br.get('https://www.baidu.com/')
br.find_element(By.XPATH, '//*[@id="kw"]').send_keys('大西瓜')
# 等待(By.XPATH, '//*[@id="kw"]')这个元素加载到页面上再继续下一步操作
WebDriverWait(br, 3, 0.5).until(EC.presence_of_element_located((By.XPATH, '//*[@id="kw"]')))
# 等待(By.XPATH, '//*[@id="kw"]')这个元素在页面可见再继续下一步操作
WebDriverWait(br, 3, 0.5).until(EC.visibility_of_element_located((By.XPATH, '//*[@id="kw"]')))
# 等待(By.XPATH, '//*[@id="kw"]')这个元素可点击状态再继续下一步操作
WebDriverWait(br, 3, 0.5).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="kw"]')))
time.sleep(2)
br.quit()
等待新窗口出现
import time
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.webdriver import WebDriver # 声明br类型
br = Chrome()
br.get('https://www.baidu.com/')
# br: WebDriver 声明br类型
def open_window(br: WebDriver, url='https://www.sohu.com/'):
# 打开新窗口之前获取当前所有的窗口句柄
s_windows = br.window_handles
# 使用js代码打开新窗口,打开的窗口进行参数化
js = 'window.open(arguments[0]);'
br.execute_script(js, url)
# new_window_is_opened(s_windows) 等待新窗口出现
WebDriverWait(br,5,0.5).until(EC.new_window_is_opened(s_windows))
# 切换到新窗口
e_windows = br.window_handles
br.switch_to.window(e_windows[-1])
# 操作新窗口的元素 br: WebDriver 必填 否则报错
def handler_sohu(br: WebDriver):
ele1 = br.find_element(By.XPATH, '//span[text()="选品牌"]')
ele1.location_once_scrolled_into_view
ele1.click()
time.sleep(5)
open_window(br)
handler_sohu(br)
time.sleep(3)
br.quit()