跑 Selenium 脚本的时候,是不是常遇到这种情况?明明元素定位是对的,脚本却报错 “找不到元素”;好不容易点了个按钮,突然弹出个窗口,脚本直接卡住不动;想多跑几次测试,浏览器一个个打开,电脑卡得不行?这些问题其实都有对应的解决办法!今天兔子哥就带大家深入学习 Selenium 的三个核心技巧:页面等待机制、弹窗处理和无头模式,全是实战干货,学会了能让你的脚本稳定性翻倍,效率也提上去。
一、页面等待机制:解决 “元素找不到” 的关键
写脚本最烦的就是 “元素未找到” 报错,明明在浏览器里能看到元素,脚本就是找不到 —— 这大概率是没做好页面等待。
为什么需要页面等待?
网页加载是需要时间的,特别是带图片、动态数据的页面,元素不是一下子就出来的。如果脚本跑得比页面加载快,元素还没出现就去定位,自然会报错。就像你去朋友家串门,人还没到你就敲门,当然没人应啦。
三种等待方式对比(新手必看)
| 等待方式 | 用法难度 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|---|
| 强制等待 | ★☆☆☆☆ | 调试脚本 | 简单,直接写 time.sleep (秒数) | 时间固定,多了浪费,少了还报错 |
| 隐式等待 | ★★☆☆☆ | 简单页面 | 一次设置全局生效,不用重复写 | 等整个页面加载完,不管目标元素 |
| 显式等待 | ★★★☆☆ | 复杂动态页面 | 只等目标元素,灵活高效 | 代码稍多,需要指定等待条件 |
显式等待怎么用?(重点推荐)
显式等待是最实用的,它会盯着目标元素,等元素出现或满足条件再继续,超时才报错。步骤很简单:
- 导入显式等待需要的包:
python
from selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as EC- 设置等待条件和超时时间(比如等登录按钮可点击,最多等 10 秒):
python
# 等待“登录按钮”可点击login_btn = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "loginBtn")))# 找到后再点击login_btn.click()👉 兔子哥建议:新手写脚本优先用显式等待,虽然代码多一点,但能少掉很多坑。强制等待尽量少用,除非调试时看步骤。
二、弹窗处理:遇到弹窗不慌,三步搞定
网页弹窗简直是脚本 “杀手”,突然弹出来不处理,后面的操作全白费。常见的弹窗有三种,处理方法各不同。
1. 最简单的 alert 弹窗(只有确定按钮)
这种弹窗最常见,一般是提示信息,比如 “登录成功”“请输入用户名”。处理步骤:
- 切换到弹窗:
alert = driver.switch_to.alert - 点击确定:
alert.accept() - 如果想看弹窗内容:
print(alert.text)
2. confirm 弹窗(有确定和取消按钮)
比如删除数据时会弹 “确定要删除吗?”,处理时多一步选择:
- 确定:
alert.accept() - 取消:
alert.dismiss()
3. 自定义弹窗(最麻烦但有办法)
有些网站会用 div 做自定义弹窗,长得像弹窗但不是系统弹窗,这时候用上面的方法没用。怎么办?
- 先检查弹窗是不是在 iframe 里(F12 看元素结构),是的话先切换 iframe:
driver.switch_to.frame("弹窗iframe的ID") - 直接定位弹窗里的 “关闭” 按钮点击,和定位普通元素一样:
driver.find_element(By.CLASS_NAME, "close-btn").click() - 关掉后记得切回主页面:
driver.switch_to.default_content()
👉 自问自答:遇到没见过的弹窗该怎么办?先按 F12 看元素类型,系统弹窗在 Elements 里看不到,自定义弹窗能看到具体标签,分清楚类型再下手就不会慌。
三、无头模式:让脚本 “隐形” 运行,速度飞起来
如果你觉得每次跑脚本都要打开浏览器,又占内存又慢,那一定要试试无头模式!
什么是无头模式?
简单说就是 “看不见的浏览器”,脚本在后台运行,不显示界面,速度能快 30% 以上,还能节省电脑资源。特别适合服务器上跑脚本,或者批量执行测试用例的时候。
怎么开启无头模式?(以 Chrome 为例)
只需要在启动浏览器时加几行配置,代码示例:
python
from selenium import webdriverfrom selenium.webdriver.chrome.options import Options# 创建配置对象chrome_options = Options()# 开启无头模式chrome_options.add_argument("--headless=new")# 可选:设置窗口大小(有些网站会根据窗口大小变布局)chrome_options.add_argument("--window-size=1920,1080")# 用带配置的方式启动浏览器driver = webdriver.Chrome(options=chrome_options)# 后面正常操作,脚本会在后台跑driver.get("https://www.baidu.com")print(driver.title) # 能正常输出标题,但看不到浏览器窗口无头模式适合什么时候用?
- 已经调试好的稳定脚本,不需要看运行过程
- 服务器上跑自动化测试(服务器一般没桌面环境)
- 批量爬数据或执行多个测试用例,追求速度和效率
👉 兔子哥提醒:刚写的脚本别一开始就用无头模式,因为看不到运行过程,报错了不好排查。等脚本跑通了再切无头模式,效率更高。
四、实战小贴士:让脚本更稳的 3 个小技巧
- 等待别混用:显式等待和隐式等待别同时用,可能会导致等待时间变长(比如隐式等 10 秒,显式等 10 秒,实际可能等 20 秒)。
- 弹窗处理加等待:点击按钮后弹窗可能不会立刻出来,最好加个显式等待,等弹窗出现再处理,比如:
python
# 等alert弹窗出现WebDriverWait(driver, 5).until(EC.alert_is_present())- 无头模式也能截图:虽然看不到界面,但可以截图排查问题:
driver.save_screenshot("错误截图.png"),出问题时一看截图就知道哪错了。
其实 Selenium 的这些技巧,核心都是让脚本 “更懂网页”—— 知道等页面加载,会处理突发弹窗,还能悄悄高效运行。新手刚开始可能觉得复杂,多练几个场景就熟了。兔子哥建议大家拿实际网站练手,比如电商网站的登录弹窗、新闻网站的动态加载列表,遇到问题先自己排查,解决不了就搜搜别人的经验。记住,自动化脚本的稳定性不是一蹴而就的,多调多改,你写的脚本会越来越顺!希望这篇教程能帮到你,动手试试这些技巧吧!
标签: selenium
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~