【问题标题】:How do I access a dynamically added iframe using Selenium WebDriver?如何使用 Selenium WebDriver 访问动态添加的 iframe?
【发布时间】:2013-07-26 01:24:01
【问题描述】:

我有一个页面开始时没有 iframe,然后通过 JavaScript 在单击锚点后添加一个 iframe。

我遇到的问题是,当切换到带有driver.switch_to_frame(x) 的框架时,我仍然可以找到我的任何内容。

我尝试循环遍历使用driver.find_elements_by_tag_name('iframe') 找到的帧,并检查每个帧以查找我希望找到的类,但没有这样的运气。

driver.switch_to_active_element() 也没有给我正确的 iframe。

我不确定是否由于 JS DOM 更改未反映在 Selenium 从驱动程序中看到的内容中而无法访问 iframe 内容。我已经为其他 iframe 完成了相同的过程,没有任何问题,但这个只是不会合作。以下是我正在处理的简化版本。

在 JS 之前:

<html>
    <body>
      <a onclick="jsmagic">load iframe</a>
    </body>
</html>

JS之后:

<html>
    <body>
      <iframe><div class='modal'>Message</div></iframe>
      <a onclick="jsmagic">load iframe</a>
    </body>
</html>

Python WebDriver 尝试:

driver.switch_to_frame(0)
driver.find_elements_by_class_name('modal')
driver.switch_to_default_content()

我也尝试过类似的变体:

frame = driver.find_elements_by_tag_name('iframe')[0]
driver.switch_to_frame(frame)
driver.find_elements_by_class_name('modal')

我曾尝试使用driver.execute_script 获取对象,但获取内容超出了我的范围。有效的 Firefox 控制台命令不能通过 Selenium 运行。

【问题讨论】:

  • 如何使用driver.page_source,将其写入文件,并查看它是否包含您期望的内容。这不会解决问题,但它可能会在调试过程中帮助您。如果它确实包含您想要的div,而 Selenium 仍然不配合,您可以使用其他工具解析页面源。
  • 您的源 HTML 看起来是否与您在上面发布的几乎完全相同,或者您是否为了简洁而删减了它?框架也可见吗?你看到文字“消息”了吗?
  • @ChrisP 我目前正在使用 frame.parent.page_source 来查找链接文本,它可以工作。不应该,因为我希望框架包含文本,而不是父级。
  • @nilesh 为了简洁起见,我剪掉了它。显示消息。我的实际问题涉及更多,但我相当确定我已将问题简化为我所描述的。
  • @Belrog,你能验证 HTML 吗?是否有可能未关闭的标签或其他东西会绊倒 Selenium?

标签: javascript python iframe selenium webdriver


【解决方案1】:

这似乎是一个时间问题,我最终得到了以下几点:

def modal_must_show(self, string):
  for _ in range(12):
    for frame in self.driver.find_elements_by_tag_name('iframe'):
      try:
        if not frame.is_displayed():
          continue
        if frame.parent.page_source.find(string):
          return
      except:
        pass
  assert False, 'Modal missing string'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-09
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    相关资源
    最近更新 更多