Selenium 里「明明页面上有,脚本却找不到」通常不是选择器写错一个字符,而是当时根本不在那个文档里。
页面还没准备好
DOM 没画完就 find_element,会 NoSuchElementException。硬 sleep 能碰运气,更稳的是显式等待:等到元素可点、可看见再往下走。
点开了新窗口,还在旧窗口上找
链接常会新开标签。眼睛看着新页,driver 仍停在旧页。
python
handles = browser.window_handles
browser.switch_to.window(handles[-1])不要写死 window_handles[2]。开了几个窗,下标就会变。记下点击前的 handle,点完在 window_handles 里找那个新出现的,再切过去。
元素在 iframe 里
先把当前文档的 HTML 打出来核对:
python
print(browser.execute_script("return document.documentElement.outerHTML"))页面上看得到、这份 HTML 里没有,多半在 iframe 里。用 id 或 name 切进去:
python
browser.switch_to.frame("main")嵌套 iframe 必须一层层进到那一层,F12 底部的路径能看出层级。在 iframe 里操作完,要回主文档再点外面的东西:
python
browser.switch_to.default_content()忘了切回来,主文档上的按钮会全部「消失」。
xpath 中间某一段会变
绝对路径里某个 div[6] 有时是 div[5]、div[4]。如果它始终是这一层的最后一个节点,可以用 last():
text
/html/body/div[last()]/div[1]/div[1]/ul/li更稳的是少依赖整段绝对路径,改用稳定的 id、name,或「相对当前已定位节点」的短 xpath。多个候选选择器叠 try/except 能救急,但优先把定位写稳,而不是堆异常分支。