【问题标题】:Multiple iframe tags Selenium webdriver多个 iframe 标签 Selenium webdriver
【发布时间】:2018-07-10 00:40:23
【问题描述】:

我正在尝试使用 selenium 将信用卡信息发送到网站,并且每个元素都包含在 HTML 中的单独 iframe 标记中。例如,输入信用卡号的框包含在第一个 iframe 标记中,持卡人姓名包含在第二个 iframe 中,以此类推。我能够访问第一个 iframe 标签,并将信用卡号发送到框中,但是我无法找到持卡人姓名 iframe 标签,因此无法发送输入持卡人姓名的密钥。我想知道是否有一种方法可以使用 webdriver 专门搜索第二个(或第一个元素以外的任意数字)iframe 标记。

这是我使用的代码:

driver.switch_to.frame(driver.find_element_by_tag_name("iframe"))
cc = driver.find_element_by_id("number")
cc.send_keys(credit_card_number)

这正确地找到了包含输入卡号字段的第一个 iframe 标记,并发送了相应的密钥

driver.switch_to.frame(driver.find_element_by_tag_name("iframe"))
driver.find_element_by_id("name").send_keys(cc_name)

这导致了以下错误:消息:没有这样的元素:无法找到元素:{“方法”:“标签名称”,“选择器”:“iframe”}

【问题讨论】:

  • 您需要获取特定的定位器来定位所有框架,如 xpath、id、name。在默认帧后切换到特定帧

标签: python selenium iframe webdriver


【解决方案1】:

您已正确找到第一个 iframe 标记,其中包含 信用卡号 字段以输入卡号并发送相应的密钥。继续前进,当您想要将适当的密钥发送到 持卡人姓名 字段时,您需要首先位于相关的框架 上。因此,您必须切换回包含 iframe 标签first iframesecond iframe 的即时parent_frame(),然后尝试切换到 第二个 iframe 以找到 持卡人姓名 字段,如下所示:

# as there are multiple frames so find_element_by_tag_name("iframe") will not suffice and have to use unique css/xpath
driver.switch_to.frame(driver.find_element_by_xpath("xpath_of_iframe1"))
cc = driver.find_element_by_id("number")
cc.send_keys(credit_card_number)
driver.switch_to.default_content() #incase iframe1 and iframe2 are immediate child of the Top Level Content
driver.switch_to.frame(driver.find_element_by_xpath("xpath_of_iframe2"))
cc = driver.find_element_by_id("name")
cc.send_keys(cc_name)

注意:根据最佳实践,您不应通过网页上的多个<iframe> 标签的find_element_by_tag_name("iframe") 检测帧。最好的方法是使用 Frame NameFrame IDFrame Index。您可以在How can I select a html element no matter what frame it is in in selenium?找到详细讨论。

【讨论】:

  • 您好,感谢您的回复。您显然比我更了解硒,但是按照您的示例,我无法使我的代码正常工作。通过编辑首先切换到 xpath 找到的 iframe,我无法找到该元素。我也尝试过使用 CSS,所以这不是 xpath 的问题。我更新了我的帖子以包含页面 html 的图像,其中包含 iframe 和用于在正文中输入信用卡号的元素。 iframe 和 body 样式对于其他字段是相同的,所以我假设修复应该是通用的。如果你能帮我修复这个 id 真的很感激。
  • 我最终用您在底部链接的帖子修复了我的错误。非常感谢您的帮助,非常感谢。
【解决方案2】:

切换到第一个 iframe 后,您必须切换回默认上下文(您的主页包含多个 iframe)然后切换到下一个 iframe。

所以你的伪代码应该看起来像

driver.switch_to.frame(driver.find_element_by_tag_name("iframe_1"))
driver.switch_to.defaultContent()
driver.switch_to.frame(driver.find_element_by_tag_name("iframe_2"))
driver.switch_to.defaultContent()
& so on

【讨论】:

    猜你喜欢
    • 2017-12-06
    • 2018-03-29
    • 2017-05-30
    • 1970-01-01
    • 2015-04-09
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 2013-06-04
    相关资源
    最近更新 更多