You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python的Selenium抓取iframe内数据?切换iframe失败求助

问题描述

尝试抓取目标网站数据,目标页面包含iframe,待抓取URL为 https://quickfix.repairq.io/analytics/dashboard?dashboard=daily_snapshot&location=1,页面截图如下:
目标页面截图

需要点击iframe内的按钮执行后续操作,但使用Selenium无法定位到iframe,无法完成操作。

尝试的代码

try:
  driver = webdriver.Chrome()
  wait = WebDriverWait(driver, 10)

  driver.get(url)
#   log_in_link.click()
  name_input_field = driver.switch_to.active_element
  name_input_field.send_keys(username)
  password_input_field = wait.until(EC.element_to_be_clickable((By.ID, 'UserLoginForm_password')))
  password_input_field.send_keys(password)
  login_button = wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'btn-new')))
  login_button.click()

  actions = ActionChains(driver)
  reports_link = wait.until(EC.element_to_be_clickable((By.LINK_TEXT, 'Reports')))
  actions.move_to_element(reports_link).perform()
  analytics_link = wait.until(EC.element_to_be_clickable((By.LINK_TEXT, 'Analytics')))
  analytics_link.click()
  wait.until(EC.frame_to_be_available_and_switch_to_it((By.TAG_NAME, 'iframe')))
  print("searched")
  wait.until(EC.element_to_be_clickable((By.TAG_NAME, 'button')))
  open_folders_button = wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'ButtonBase__ButtonOuter-sc-1bpio6j-0.cmTxkd.IconButton-sc-n9jti8-0.iYFfNL')))
  print("open_folders_button_element:" + open_folders_button)
  open_folders_button.click()
  driver.switch_to.default_content()

except Exception as e:
  print(e)

time.sleep(5)

page_title = driver.title
print(f"The title of the page is: {page_title}")

driver.quit()

运行错误信息

DevTools listening on ws://127.0.0.1:59967/devtools/browser/d1059c6f-12c0-40be-8c1b-7cce894fac8b
错误信息:找不到元素:无法定位元素:{"method":"tag name","selector":"iframe"}
  (会话信息:chrome=121.0.6167.87);有关此错误的文档,请访问:https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#no-such-element-exception
调用栈:
        GetHandleVerifier [0x00007FF6474E5E42+3538674]
        (无符号) [0x00007FF647104C02]
        (无符号) [0x00007FF646FB5AEB]
        (无符号) [0x00007FF646FFBF4E]
        (无符号) [0x00007FF646FFC0CC]
        (无符号) [0x00007FF64703E477]
        (无符号) [0x00007FF64701F0EF]
        (无符号) [0x00007FF64703BDE3]
        (无符号) [0x00007FF64701EE53]
        (无符号) [0x00007FF646FEF514]
        (无符号) [0x00007FF646FF0631]
        GetHandleVerifier [0x00007FF647516CAD+3738973]
        GetHandleVerifier [0x00007FF64756C506+4089270]
        GetHandleVerifier [0x00007FF647564823+4057299]
        GetHandleVerifier [0x00007FF647235C49+720121]
        (无符号) [0x00007FF64711126F]
        (无符号) [0x00007FF64710C304]
        (无符号) [0x00007FF64710C432]
        (无符号) [0x00007FF6470FBD04]
        BaseThreadInitThunk [0x00007FF8997B7034+20]
        RtlUserThreadStart [0x00007FF89B702651+33]

页面标题为:Reports Overview / RepairQ

解决思路

  1. 精准定位iframe:仅通过标签名iframe定位可能不准确,页面可能存在多个iframe。打开浏览器开发者工具,查看目标iframe的专属属性(如id、name、src),改用更精准的定位方式:

    • 按id定位:wait.until(EC.frame_to_be_available_and_switch_to_it((By.ID, '目标iframe的id')))
    • 按name定位:wait.until(EC.frame_to_be_available_and_switch_to_it((By.NAME, '目标iframe的name')))
    • 按src属性匹配:wait.until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR, 'iframe[src*="analytics"]')))
  2. 等待页面加载完成:点击Analytics后,页面可能仍在跳转加载,需先等待页面URL变化或核心元素出现,再去定位iframe。可添加:

    wait.until(EC.url_contains('analytics'))
    
  3. 替换动态class定位按钮:代码中使用的ButtonBase__ButtonOuter-sc-1bpio6j-0.cmTxkd.IconButton-sc-n9jti8-0.iYFfNL是前端框架动态生成的class,刷新页面后大概率会失效。建议改用按钮的文本、aria标签或父元素结构定位,例如:

    open_folders_button = wait.until(EC.element_to_be_clickable((By.XPATH, '//button[contains(@aria-label, "打开文件夹")]')))
    
  4. 检查嵌套iframe情况:目标按钮所在的iframe可能嵌套在其他iframe内,需先切换到外层iframe,再切换到内层iframe。

  5. 修复元素打印错误:代码中print("open_folders_button_element:" + open_folders_button)会报错,元素无法直接与字符串拼接,可改为打印元素的HTML结构或属性:

    print("open_folders_button_element:" + open_folders_button.get_attribute('outerHTML'))
    

内容的提问来源于stack exchange,提问作者ARTEM DIACHUK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 20:10:04