提问者:小点点

多个iframe标签Selenium网络驱动程序


我正在尝试使用selenium将信用卡信息发送到网站上,每个元素都包含在超文本标记语言中单独的iframe标记中。例如,输入信用卡号码的框包含在第一个iframe标记中,持卡人姓名包含在第二个iframe中,依此类推。我能够访问第一个iframe标记,并将信用卡号码发送到框中,但是我无法找到持卡人姓名iframe标记,因此无法发送输入持卡人姓名的密钥。我想知道是否有一种方法可以使用web驱动程序专门搜索第二个(或第一个元素以外的任意数字)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)

这导致以下错误:消息:没有这样的元素:无法找到元素:{"method":"tag name","selector":"iframe"}


共2个答案

匿名用户

您已正确找到第一个iframe标签,其中包含信用卡号字段以输入卡号并发送适当的密钥。向前移动,当您想将适当的密钥发送到持卡人姓名字段时,您需要先在相关帧上。因此,您必须切换回immedediateparent_frame(),其中包含iframe标签,即第一个iframe和第二个iframe,然后尝试切换到第二个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)

注意:根据最佳实践,您不应该通过find_element_by_tag_name("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