实战技巧
掌握三种元素等待方式与最佳实践
能处理弹窗、鼠标、键盘等特殊操作
了解自动化脚本的稳定性优化技巧
核心讲解
(1)元素等待页面加载慢、网络延迟时,元素还没出现就操作会报错,需要等待。
表格
等待方式 | 语法 | 特点 | 适用场景 |
|---|---|---|---|
强制等待 |
| 固定等 n 秒,简单粗暴 | 调试、短时间等待 |
隐式等待 |
| 全局生效,等元素出现 | 整个脚本通用等待 |
显式等待 |
| 针对单个元素,条件满足就继续 | 关键元素精准等待 |
最佳实践:全局设置隐式等待,关键元素用显式等待,尽量少用 sleep。
(2)弹窗处理Alert/Confirm/Prompt:JS 原生弹窗,用
driver.switch_to.alert处理.text:获取弹窗文字.accept():确定.dismiss():取消.send_keys():输入内容
模拟复杂鼠标行为:悬停、右键、双击、拖拽。 常用方法:move_to_element()悬停、context_click()右键、double_click()双击、drag_and_drop()拖拽。
模拟键盘按键、组合键,比如回车、Ctrl+C、删除等。
代码示例
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.Chrome()
driver.maximize_window()
# 全局隐式等待10秒
driver.implicitly_wait(10)
driver.get("https://www.baidu.com")
# ===== 显式等待 =====
# 等待搜索框出现,最多等10秒
wait = WebDriverWait(driver, 10)
input_box = wait.until(EC.presence_of_element_located((By.ID, "kw")))
# 输入内容按回车
input_box.send_keys("Python", Keys.ENTER)
# ===== 鼠标悬停 =====
setting = driver.find_element(By.ID, "s-usersetting-top")
ActionChains(driver).move_to_element(setting).perform()
time.sleep(1)
# 点击下拉里的选项
driver.find_element(By.LINK_TEXT, "搜索设置").click()
time.sleep(1)
# ===== JS弹窗处理 =====
# 触发弹窗后
# alert = driver.switch_to.alert
# print(alert.text)
# alert.accept()
# ===== 拖拽示例 =====
# 滑块元素
# slider = driver.find_element(By.ID, "slider")
# target = driver.find_element(By.ID, "target")
# ActionChains(driver).drag_and_drop(slider, target).perform()
driver.quit()
常见误区
到处用 sleep:脚本又慢又不稳定,网络波动就失败,尽量用智能等待
隐式和显式混用:会导致等待时间计算混乱,不要叠加使用
鼠标操作忘记 perform ():ActionChains 的方法最后必须加
.perform()才会执行弹窗不处理:JS 弹窗出现后,不处理的话后续所有操作都会报错
课后练习
实现鼠标悬停导航菜单,点击二级菜单的操作
用显式等待实现:等待元素可点击后再点击
模拟 Ctrl+A 全选输入框内容,然后删除

