【问题标题】:Can't access iframe elements with selenium webdriver [duplicate]无法使用 selenium webdriver 访问 iframe 元素 [重复]
【发布时间】:2021-03-02 08:19:41
【问题描述】:

我正在尝试访问 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 似乎可行,但之后我无法访问按钮元素。

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

【问题讨论】:

  • driver.find_elements_by_tag_name('iframe')[o] o 还是 0?

标签: python selenium xpath iframe css-selectors


【解决方案1】:

你的山羊很棘手。

您已经在 iframes 中通过 javascript 加载了 iframes。您需要打几个电话,并且需要等待元素可用。您还粘贴了需要解决的代码错误。

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

添加更多导入:

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 输出只是说“错误”——它隐藏了任何实际出错的东西。它产生的实际错误消息会告诉您问题所在。

【讨论】:

    【解决方案2】:

    文本为同意并继续的元素位于多个&lt;iframe&gt;元素中,因此您必须:

    • 诱导WebDriverWait 使所需的 框架可用并切换到它

    • 诱导WebDriverWait 使所需的 框架可用并切换到它

    • 诱导WebDriverWait 使所需的元素可点击

    • 您可以使用以下任一Locator Strategies

      • 使用CSS_SELECTOR

        driver.get('https://www.mail.com/consentpage')
        WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe.permission-core-iframe")))
        WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe[src^='https://plus.mail.com/lt']")))
        WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button#onetrust-accept-btn-handler"))).click()
        
      • 使用XPATH

        driver.get('https://www.mail.com/consentpage')
        WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@class='iframe.permission-core-iframe']")))
        WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[starts-with(@src, 'https://plus.mail.com/lt')]")))
        WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@id='onetrust-accept-btn-handler']"))).click()
        
    • 注意:您必须添加以下导入:

      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support import expected_conditions as EC
      
    • 浏览器快照:


    参考

    您可以在以下位置找到一些相关讨论:

    【讨论】:

      猜你喜欢
      • 2021-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      • 2020-03-11
      • 2016-04-05
      相关资源
      最近更新 更多