如何用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
解决思路
精准定位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"]')))
- 按id定位:
等待页面加载完成:点击
Analytics后,页面可能仍在跳转加载,需先等待页面URL变化或核心元素出现,再去定位iframe。可添加:wait.until(EC.url_contains('analytics'))替换动态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, "打开文件夹")]')))检查嵌套iframe情况:目标按钮所在的iframe可能嵌套在其他iframe内,需先切换到外层iframe,再切换到内层iframe。
修复元素打印错误:代码中
print("open_folders_button_element:" + open_folders_button)会报错,元素无法直接与字符串拼接,可改为打印元素的HTML结构或属性:print("open_folders_button_element:" + open_folders_button.get_attribute('outerHTML'))
内容的提问来源于stack exchange,提问作者ARTEM DIACHUK

