我有一个奇怪的情况,我无法找到DOM中的所有元素。
通过Firefox /'Inspect Elements'查看DOM时,我清楚地看到一些'div'元素在使用Java / Selenium生成的元素列表中不存在:
List<WebElement> elements = webDriver.findElements(By.xpath("//*"));
我怀疑上面的行不提供任何不可见元素的子元素。
如果我的怀疑不正确,那么有人可以解释一下我所看到的原因吗?
否则,如果情况确实如此,那么绕过它的唯一方法就是遍历所有不可见的元素并使它们可见。
有没有更好的方法来处理这个问题?
如果是的话 - 它是什么?
如果不是 - 如何使所有元素可见(可能使用JavascriptExecutor)?
由于
答案 0 :(得分:1)
另一种选择是元素在一个框架中。在这种情况下,您必须致电webDriver.switchTo().frame(String name)
。不要忘记之后切换回来,最好是使用webDriver.switchTo()。defaultContent()。
我认为Selenium也可以访问隐形元素。我一直在访问一些我自己看不见的元素。但你不能与他们互动。
当然,正如德米特里所说,以这种方式获得所有元素实际上并不是一种可行的方法。
答案 1 :(得分:0)
我建议使用单独的HTML Parser
库,以获取所有html文档节点所需的信息。例如
driver.getPageSource();
这是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()窗口()最大化();