首页 > 解决方案 > 无法使用 selenium webdriver 访问 iframe 元素

问题描述

我正在尝试访问mail.com同意页面上的按钮元素。

该页面的 URL 可以在这里看到https://www.mail.com/consentpage

如果您已经访问过该站点,则可以在隐身选项卡中查看同意页面。

抱歉,我不确定是否应该在此处发布链接或完整的 html。

我正在尝试使用以下标签访问按钮

<button id="onetrust-accept-btn-handler" tabindex="0">Agree and continue</button>

链接:https ://ibb.co/R9bFdws

我尝试访问的按钮上方似乎有多个 iframe 帖子

链接:https ://ibb.co/cyptbNr

到目前为止我的代码:

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.keys import Keys
from time import sleep

driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get("http:mail.com")
sleep(3)
try: 
  iframe = driver.find_elements_by_tag_name('iframe')[o]
  driver.switch_to.frame(iframe)
  button = iframe.find_element_by_id('onetrust-accept-btn-handler')
  #driver.switch_to_default_content()
  driver.quit()

except:
  print('error')
  driver.quit()

访问 iframe 似乎可以工作,但之后我无法访问按钮元素。

我已经按照其他帖子的建议提出了这个问题,但不幸的是似乎无法让它发挥作用。谢谢你的帮助!

标签: pythonseleniumxpathiframecss-selectors

解决方案


你遇到了一个棘手的问题。

你有iframes within iframes 由 javascript 加载。您需要打几个电话,并且需要等待元素可用。您还粘贴了需要解决的代码错误。

解决您的所有问题-这对我有用...

添加更多导入:

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

然后运行这个:

#updated your URL as your pasted URL wasn't valid
driver.get("https://www.mail.com/consentpage")

#Get iframe 1 - this updates DRIVER to be within that iframe
WebDriverWait(driver, 30).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR, ".permission-core-iframe")))

#get iframe 2 - this can only be found when driver is inside the first iframe
WebDriverWait(driver, 30).until(EC.frame_to_be_available_and_switch_to_it((By.TAG_NAME, "iframe")))

#Wait for the button to fully load 
button = WebDriverWait(driver, 30).until(EC.element_to_be_clickable((By.ID, "onetrust-accept-btn-handler")))

#click it
button.click()

继续前进 - 对您的提示是调试代码。如果它没有按预期工作,则需要捕获并公开完整错误,或者更简单地删除try. 您的try输出只是说“错误”-隐藏了实际出错的任何内容。它产生的实际错误消息会告诉您问题所在。


推荐阅读