2013-12-23 81 views
1

我有一个奇怪的场景,其中无法找到DOM中的所有元素。Java Selenium无法使用By.xpath查找DOM中的所有元素(“// *”)

当通过火狐浏览的DOM /“检查元素”,我很清楚地看到一些“DIV”元素中不存在于与Java /硒产生的元件列表:

List<WebElement> elements = webDriver.findElements(By.xpath("//*")); 

我怀疑是上面的行不提供任何元素是不可见元素的子元素。

如果我怀疑是不正确的,那么任何人都可以解释我所看到的原因吗?否则,如果确实如此,那么绕过它的唯一方法是查看所有不可见元素并使其可见。

有没有更好的方法来处理这个问题?

如果是 - 它是什么?

如果否 - 我如何使所有元素可见(也许使用JavascriptExecutor)?

感谢

回答

0

问题:

当我通过火狐/浏览的网页检查元素,窗口最大化。

当我用Java/Selenium抓取网页时,窗口没有最大化。

在我正在处理的特定网页中,一旦窗口达到一定大小(可能有一些JavaScript代码在客户端运行,则会添加一些元素(主要是广告)(变成“未隐藏”),这对此负责)。

当前的问题不在Selenium内。

为了解决它,一个仅需要添加下列行:。

webDriver.manage()窗口()最大化();

+0

恭喜您解决问题。是的,现代应用程序使用负责任的布局和框架来支持它,如twitter引导。对于浏览器窗口的不同大小,这样的框架可以动态地构建不同的html代码 –

0

我建议,以获取所有的HTML文档节点所需的信息,使用一个单独的HTML Parser库。例如

  1. 获得完整的页面源代码,使用driver.getPageSource();
  2. 使用http://jsoup.org或任何其他解析器解析文档和提取所需的数据

这里是一个example

String html = "<p>An <a href='http://example.com/'><b>example</b></a> link.</p>"; 
    Document doc = Jsoup.parse(html); 
    Element link = doc.select("a").first(); 

    String text = doc.body().text(); // "An example link" 
    String linkHref = link.attr("href"); // "http://example.com/" 
    String linkText = link.text(); // "example"" 

    String linkOuterH = link.outerHtml(); 
    // "<a href="http://example.com"><b>example</b></a>" 
    String linkInnerH = link.html(); // "<b>example</b>" 

我想补充说,通过WebDriver查询所有元素是非常慢的操作。我在我的宠物项目Page Recorder中遇到过这个问题。
解决方案是使用HtmlAgilityPack-.NET HTML Parser - 以便在所有文档节点上执行操作。

+0

谢谢。但是,我不通过WebDriver查询所有元素。在注意到我无法找到特定元素后,我开始通过搜索所有元素来调查它。但事实是,我只是在寻找一个特定的元素,通过Firefox清晰可见,但由于某种原因Selenium无法看到。 –

1

另一种选择是元素在一个框架中。在这种情况下,您必须致电webDriver.switchTo().frame(String name)。不要忘记之后切换回来,最好使用webDriver.switchTo()。defaultContent()。

我认为Selenium也可以访问隐形元素。我一直在访问一些我自己隐身的元素。尽管如此,你仍然无法与他们互动。

当然,正如德米特里所说,以这种方式获取所有元素并不是一种可行的方法。发现

+0

谢谢。但是,'iframe'在这里不是这种情况。请参阅'http://www.picmonkey.com/'。如果您在整个页面上执行“检查元素”,您将看到html/body/div(homepage_main_view)/ div/div(content_wrapper)/ div(ad-homepage-top-wrapper)/ div/div(ad21)。 Selenium不会看到最后'div'中的所有内容。再来看看它,它可能是除导致此问题的“style”属性之外的其他内容(可能是元素的深度)。 –

相关问题