我用Python写Selenium脚本三年多,踩过的坑比写对的代码还多。今天把最常见的8个坑整理出来,希望能帮你少走弯路。
坑一:元素定位不稳定,脚本动不动就报错
很多人写定位直接复制XPath,换台电脑就跑不动了。页面稍微改个结构,脚本就崩。避坑的办法是优先用ID定位,其次是CSS选择器,最后才考虑XPath。实在要用XPath,避免写绝对路径,多用相对路径比如//[@id='search']/input。这样页面改动不大时还能跑。
坑二:页面没加载完就开始操作元素
新手常犯的错。用find_element时页面还在转菊花,程序直接报NoSuchElementException。正确做法是设置隐式等待,比如driver.implicitly_wait(10)。对特殊元素用WebDriverWait配合expected_conditions,等到元素可见再操作。等页面完全加载需要时间,别心急。
坑三:点击无效,明明元素找到了就是点不中
遇到这个坑先检查元素是否被遮挡。弹窗、广告、固定定位的导航栏都可能挡住按钮。解决办法是用JavaScript直接点击,代码很简单:driver.execute_script('arguments[0].click()', element)。还有一种可能是元素在iframe里,得先切换到iframe:driver.switch_to.frame('iframe_name')。
坑四:浏览器窗口没最大化,元素显示不全
某些页面在窗口缩小时会隐藏部分元素。脚本翻来翻去找不到,急死人。启动浏览器时直接设置窗口大小:driver.set_window_size(1920, 1080)。或者直接用driver.maximize_window()最大化。保证所有元素都显示在视野里。
坑五:页面跳转后,原来操作的元素丢了
点击一个链接跳转到新页面,旧页面的元素引用全部失效。很多人在循环里继续用之前的element变量,结果报StaleElementReferenceException。每次操作前重新获取元素,不要缓存元素引用。特别是翻页、提交表单这类会改变页面状态的操作。
坑六:弹窗处理不当,卡死整个流程
alert弹窗不处理,后续任何操作都无效。网上教程说用switch_to.alert,但要注意异步弹窗。有些弹窗是第三方API触发的,需要等几秒才出现。先判断弹窗是否存在再处理:WebDriverWait(driver, 5).until(EC.alert_is_present())。确认弹窗出现后再accept()或dismiss()。
坑七:日期选择器、下拉菜单这类控件不好弄
网上商城经常用自定义日期控件,HTML结构特别复杂。别硬写定位路径,直接用send_keys()输入文字。比如日期输入框支持手动输入,直接传'2025-01-15'比去点日历快得多。下拉菜单同理,用Select类处理:Select(element).select_by_visible_text('选项')。省事又稳定。
坑八:脚本跑得慢,一个页面要等半天
很多人用time.sleep()解决等待问题,结果页面慢时不够用,快时白等。废除所有固定等待,换成显式等待。对需要频繁刷新的监控类脚本,合理设置页面加载策略:driver.set_page_load_timeout(20)。超出时间直接跳过,别让一个页面崩掉整个任务。
写Selenium脚本就像养孩子,磕磕绊绊是常态。把上面这些坑记住,能省下很多调试时间。刚开始会觉得到处都是问题,写多了自然就顺手了。代码不要求一次完美,能跑起来就是胜利。