【问题标题】:error switching to iframe selenium python错误切换到 iframe selenium python
【发布时间】:2018-07-22 16:55:14
【问题描述】:

目前我正在尝试切换到 iframe/fancybox,但出现以下错误:

line 237, in check_response raise exception_class
(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: 
Message: unknown error: missing 'ELEMENT'

这就是我定位 iframe 的方式:

_iframe_ = {"by": By.XPATH, "value": "//iframe[@class='fancybox-iframe' and starts-with(@id,'fancybox-frame') and contains(@src,'/reminder/add/relation/')]"}


 def __init__(self, driver):
        super(BasePage, self).__init__()
        self.driver = drive
        self.driver.switch_to.frame(self._iframe_)

iframe 名称是:

fancybox-frame1518441842751" 

html:

  <iframe id="fancybox-frame1518443041369" name="fancybox-frame1518443041369" class="fancybox-iframe" frameborder="0" vspace="0" hspace="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen="" scrolling="auto" src="/reminder/add/relation/58048" kwframeid="1"></iframe>

【问题讨论】:

  • 可以分享&lt;iframe&gt;标签的相关HTML吗?
  • 检查已编辑的帖子。
  • 试试self.driver.switch_to.frame(self._iframe_["value"]) 或self.driver.switch_to.frame(self._find(self._iframe_))
  • 这会导致 NoSuchFrameException。消息:没有这样的框架
  • 在这种情况下您可能需要实现 ExplicitWait,例如expected_conditions.frame_to_be_available_and_switch_to_it(self._iframe_["value"])。无论如何,“没有这样的框架”是另一个问题

标签: python selenium selenium-webdriver iframe element


【解决方案1】:

id 和 name 属性看起来是动态的(代码和 html 中的数字不匹配)。您可以尝试通过部分定位id/name

_iframe_ = {"by": By.CSS_SELECTOR, "value": "[id*='fancybox-frame']"}
# "[name*='fancybox-frame']"

附带说明,frame() 可以接收 id/name 作为参数

self.driver.switch_to.frame('fancybox-frame1518441842751')

会起作用的(当然动态问题除外)。

【讨论】:

  • 这是正确的。我在选择器中故意打错字,打开框架后,硒给了我一个错误。在 switch 语句之后,虽然 selenium 似乎无法在框架内找到元素。
  • 没有。 iframe 窗口打开后,它会等待几秒钟,然后我得到一个 no such element 错误。
  • @adbSOeh 你有什么例外?您还应该检查您正在切换到正确的框架,并且没有嵌套框架。
  • 以下错误:第 80 行,在 untilraise TimeoutException(message, screen, stacktrace) selenium.common.exceptions.TimeoutException: Message:
  • 我也尝试过隐式等待,并且在框架打开后控制台不会返回此类元素。
【解决方案2】:

要正确识别&lt;iframe&gt;,您必须按如下方式更改Locator Strategy:

_iframe_ = {"by": By.XPATH, "value": "//iframe[@class='fancybox-iframe' and starts-with(@id,'fancybox-frame') and contains(@src,'/reminder/add/relation/')]"}

 def __init__(self, driver):
    super(BasePage, self).__init__()
    self.driver = driver
    WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((self._iframe_)))

【讨论】:

  • 抱歉这里没有看到你的回复。我已经更新了最初的问题。当我在一个方法中切换到 iframe 时,我尝试做一些不同的事情。
  • 我已经把状态改回来了。并给出了最佳答案。
  • 我得到的错误是:TimeoutException(message, screen, stacktrace) selenium.common.exceptions.TimeoutException: Message:
猜你喜欢
  • 2014-06-11
  • 2021-11-05
  • 2017-12-03
  • 2020-10-06
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多