如何使用Xpath选择iframe内的元素?

25

我想创建一个Selenium测试来测试我们的扩展与AOL邮件的兼容性。我已经成功登录到AOL并撰写了一封电子邮件,但我还需要选择编辑器内部的元素,该编辑器位于iframe内部。我检查了一下,即使编辑器已经打开,以下测试也会失败:

self.assertEqual(first=1, second=len(self.driver.find_elements_by_xpath(xpath="//iframe[@name='editor_body']//body[@contenteditable='true']")))

我遇到了错误AssertionError: 1 != 0。如何使用Xpath(或任何其他方法)在Selenium中选择iframe的body和其他元素?


我遇到了错误AssertionError: 1 != 0。如何使用Xpath(或其他Selenium方法)选择iframe的body和其他元素?

1
你尝试过使用.switch_to().frame(element)吗? - Mark Rowlands
@MarkRowlands 谢谢,它有效了!但是需要使用self.driver.switch_to.frame(frame_reference=self.driver.find_element_by_xpath(xpath="//iframe[@name='editor_body']")) - Uri
2个回答

36

在切换至 <iframe> 后才能遍历其中的内容。你的 xPath,

//iframe[@name='editor_body']//body[@contenteditable='true']

无法工作,因为<body>标签在iFrame内,而不在当前上下文中。您需要先切换到它:

driver.switch_to.frame('editor_body')...

5
谢谢,它有效!我使用了 self.driver.switch_to.frame(frame_reference=self.driver.find_element_by_xpath(xpath="//iframe[@name='editor_body']")) - Uri
我该如何使用Selenium节点来完成这个任务? - Jeremy Moritz
无论您是在本地运行还是使用节点,结果都是相同的。 - ddavison
1
实际上,可以通过将xpath的范围设置为iframe的contentDocument属性来避免调用switch_to_frame 如此答案中所解释的 - mMontu

1
如果您在Selenium自动化测试过程中遇到问题,以下信息可以帮助您解决问题:
默认情况下,Selenium可以访问父浏览器驱动程序。为了访问内部的框架(frame),驱动程序的焦点必须从主浏览器窗口转移到iframe(frame)。
因此,如果您需要在iframe中进行断言,然后返回主窗口进行其他交互,则需要根据您的目标更改驱动程序的焦点。
详细信息请参见:https://www.tutorialspoint.com/how-do-i-select-elements-inside-an-iframe-with-xpath

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接