Selenium Python完成Google Recaptcha后如何获取原网页源码及元素?
问题解决:手动验证reCAPTCHA后Selenium无法定位原页面元素
核心原因
Google reCAPTCHA是嵌入在独立iframe中的,手动完成验证后,Selenium驱动的焦点仍停留在这个iframe上下文里,导致page_source返回的是iframe的源码,自然无法定位原页面的表单和提交按钮。
解决方案
在手动完成reCAPTCHA验证后,将驱动焦点切回主页面上下文,再进行元素定位:
修改后的关键代码片段
# 手动完成reCAPTCHA验证后,添加这行代码切回主页面 p_driver.switch_to.default_content() # 等待主页面元素加载(替换原有的time.sleep,更可靠) from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 等待表单元素出现,超时10秒 WebDriverWait(p_driver, 10).until( EC.presence_of_element_located(("xpath", "//form[@name='form']")) ) # 后续提交表单的代码不变 print(p_driver.page_source) form_element = findOneByXPath(p_driver, "//form[@name='form']", 2) if form_element is not None: form_element.submit() else: submit_element = findOneByXPath(p_driver, "//input[@type='submit']", 2) if submit_element is not None: ScrollToElement(p_driver, submit_element) JavascriptClick(p_driver, submit_element) else: submit_element = findOneByXPath(p_driver, "//input[@name='submit']", 2) if submit_element is not None: ScrollToElement(p_driver, submit_element) JavascriptClick(p_driver, submit_element)
关键说明
p_driver.switch_to.default_content():强制驱动离开所有嵌套的iframe,回到原页面的顶级上下文,此时page_source会恢复为原页面的源码。- 用
WebDriverWait替代time.sleep:更可靠地等待元素加载,避免因网络或页面渲染延迟导致的定位失败。
内容的提问来源于stack exchange,提问作者Gauthier Buttez
相关产品推荐
相关产品推荐

