在iframe中找不到Selenium元素

时间:2016-01-05 17:18:09

标签: java selenium xpath selenium-webdriver

我正在尝试检索JSON元素,问题是在源代码中它不存在,但我可以通过inspect元素找到它。

我试过

C.driver.findElement(By.id("ticket-parsed"))

并通过XPath

C.driver.findElement(By.xpath("//*[@id=\"ticket_parsed\"]"));

我无法找到它。

另外

C.driver.switchTo().frame("html5-frame"); 
System.out.println(C.driver.findElement(By.id("ticket_parsed"))); 
C.driver.switchTo().defaultContent();

我得到了

[[ChromeDriver: chrome on XP (1f75e50635f9dd5b9535a149a027a447)] -> id: ticket_parsed]  

on

 driver.switchTo().frame(0) or driver.switchTo().frame(1) 

我知道框架不存在

最后我尝试了

 WebElement frame = C.driver.findElement(By.id("html5-frame"));
 C.driver.switchTo().frame(frame.getAttribute("ticket_parsed"));

我得到一个空指针异常

以下是来源的图片

enter image description here

我做错了什么?

2 个答案:

答案 0 :(得分:4)

嘛!

元素#ticket-parsed位于iFrame中。因此,您可以点击它而无需进入iframe。

以下是切换到iFrame的代码

driver.switchTo().frame("frame_name");

driver.switchTo().frame(frame_index);

在您的情况下,

driver.switchTo().frame("html5-frame");

切换到iframe后,您可以使用XPath或CSS单击该元素。

C.driver.findElement(By.id("ticket-parsed"))

注意: 完成iframe内部的操作后,必须使用以下命令再次返回主窗口。

driver.switchTo().defaultContent();

答案 1 :(得分:0)

我没有找到我的切除设置的解决方案,但我确实找到了一个正确获取对象的js命令

 document.getElementById("html5-frame").contentDocument.getElementById("ticket_parsed")

你可以像这样整合js命令

 JavascriptExecutor js=(JavascriptExecutor)driver;  
 js.executeScript(*yourCommandHere*);

如果你想获得命令的输出,只需在你的命令之前添加单词return(在这种特定情况下它不起作用,但在任何其他情况下它都可以)

 *TypeOfData* foo = js.executeScript(return *yourCommandHere*);

最后因为时间有限我不得不使用非正统的方法,比如截取屏幕并比较图像是否完全相同

感谢您的帮助