Java Selenium无法使用By.xpath(“// *”)查找DOM中的所有元素

时间:2013-12-23 22:30:34

标签: java selenium selenium-webdriver

我有一个奇怪的情况,我无法找到DOM中的所有元素。

通过Firefox /'Inspect Elements'查看DOM时,我清楚地看到一些'div'元素在使用Java / Selenium生成的元素列表中不存在:

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

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

如果我的怀疑不正确,那么有人可以解释一下我所看到的原因吗?

否则,如果情况确实如此,那么绕过它的唯一方法就是遍历所有不可见的元素并使它们可见。

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

如果是的话 - 它是什么?

如果不是 - 如何使所有元素可见(可能使用JavascriptExecutor)?

由于

3 个答案:

答案 0 :(得分:1)

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

我认为Selenium也可以访问隐形元素。我一直在访问一些我自己看不见的元素。但你不能与他们互动。

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

答案 1 :(得分:0)

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

  1. 使用driver.getPageSource();
  2. 获取整页来源
  3. 使用http://jsoup.org或任何其他解析器来解析文档并提取所需数据
  4. 这是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 - 以便在所有文档节点上执行操作。

答案 2 :(得分:0)

发现问题:

当我通过Firefox / Inspect Element查看网页时,窗口已最大化。

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

在我正在处理的特定网页中,一旦窗口达到一定大小,就会添加一些元素(主要是广告)(变为“非隐藏”)(客户端可能运行了一些javascript代码,负责此事。)

目前的问题不在Selenium内。

为了解决这个问题,我们只需要添加以下行:

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