【问题标题】:Java Selenium fails to find all elements in the DOM using By.xpath("//*")Java Selenium 无法使用 By.xpath("//*") 找到 DOM 中的所有元素
【发布时间】:2014-01-12 04:19:48
【问题描述】:

我有一个奇怪的场景,我无法在 DOM 中找到所有元素。

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

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

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

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

否则,如果确实如此,那么唯一的解决方法就是遍历所有不可见的元素并使其可见。

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

如果是 - 它是什么?

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

谢谢

【问题讨论】:

    标签: java selenium selenium-webdriver


    【解决方案1】:

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

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

    当然,正如 Dmitry 所建议的那样,以这种方式获取所有元素确实不是一种可行的方式。

    【讨论】:

    • 谢谢。但是,这里不是“iframe”。请参阅“picmonkey.com”。如果您在整个页面上执行“检查元素”,您将看到 html / body / div(homepage_main_view) / div / div(content_wrapper) / div(ad-homepage-top-wrapper) / div / div(ad21)。 Selenium 看不到最后一个“div”中的所有内容。再看一遍,可能是“样式”属性以外的其他东西导致了这个问题(可能是元素的深度)。
    【解决方案2】:

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

    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 - 以便在所有文档节点上执行操作。

    【讨论】:

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

    发现问题:

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

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

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

    当前的问题不在 Selenium 中。

    为了解决它,只需添加以下行:

    webDriver.manage().window().maximize();

    【讨论】:

    • 恭喜您解决了这个问题。是的,现代应用程序使用负责任的布局和框架来支持它,比如 twitter bootstrap。浏览器窗口大小不同,这样的框架可能会动态构建不同的html代码
    猜你喜欢
    • 2017-11-30
    • 2013-09-03
    • 1970-01-01
    • 2021-08-19
    • 2021-05-18
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    相关资源
    最近更新 更多