无法读取null的属性(阅读“ShadowRoot”)- Java和Selenium

k2arahey  于 2023-01-07  发布在  Java
关注(0)|答案(3)|浏览(515)

我正在尝试使用Java和Selenium进行网页抓取,但对于网页抓取所需的一部分,它需要我访问一个影子DOM元素。我正在使用Javascript执行器访问它,我正在输入检索我正在寻找的内容所需的querySelector片段,但我得到了一个"无法读取null的属性(读取'ShadowRoot')"错误。有人熟悉这个错误以及如何解决它吗?
下面是我的代码片段:

String pagePdfUrl = (String) js.executeScript("document.querySelector('pdf-viewer').shadowRoot.getElementById('content').querySelector('embed').getAttribute('original-url')");

js是Javascript执行程序变量。
谢谢大家!

jfgube3f

jfgube3f1#

当使用 querySelector() 读取ShadowRoot时,此错误消息...

Cannot read properties of null

.意味着下列情况之一:

  • 这是一个 #影子根(关闭)
  • 它是 #影子根(用户代理)
  • #shadow-root(open) 中的内容不可用。

溶液
在第一种和第二种情况下,您将无法访问 ShadowRoot。在第三种情况下,您需要等待一段时间,例如time.sleep(3),然后才能尝试访问 ShadowRoot 及其元素。

nbewdwxp

nbewdwxp2#

线程休眠(10);对我来说很好。
我仍然看到另一个阴影元素出现同样的错误
有时影子DOM查询选择器(“q2-input”);可能改变了它的位置。
因此,如果错误仍然存在,请检查完美的JSPath并在控制台中进行验证

fjnneemd

fjnneemd3#

在Selenium 4.0中,对于Chromium 96以上版本,您可以使用getShadowRoot()方法并完全避免JavaScript。
工作示例:

driver.get("http://watir.com/examples/shadow_dom.html");
WebElement shadowHost = driver.findElement(By.cssSelector("#shadow_host"));
SearchContext shadowRoot = shadowHost.getShadowRoot();
WebElement shadowContent = shadowRoot.findElement(By.cssSelector("#shadow_content"));

来源:https://titusfortner.com/2021/11/22/shadow-dom-selenium.html

相关问题