【问题标题】:Cannot read properties of null (reading 'ShadowRoot') - Java and Selenium无法读取 null 的属性(读取“ShadowRoot”)-Java 和 Selenium
【发布时间】:2021-12-06 02:41:31
【问题描述】:

我正在尝试使用 Java 和 Selenium 进行网络抓取,但对于我需要进行网络抓取的一部分,它需要我访问一个影子 DOM 元素。我正在使用 Javascript 执行程序来访问它,并且正在输入检索我要查找的内容所需的 querySelector sn-p,但我收到“无法读取 null 的属性(读取 'ShadowRoot')”错误。有谁熟悉这个以及如何解决它?

这是我的代码 sn-p:

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

js 是 JavascriptExectuor 变量。

谢谢!

【问题讨论】:

  • 没有办法用它来判断你做的是对还是错。您已将其描述为好像您已正确完成所有操作。该属性被命名为shadowRoot,而不是ShadowRoot,如果那样的话。
  • 我很抱歉。我刚刚添加了一个代码 sn-p。如果您需要更多信息,请告诉我
  • 尝试将return 放在"document 之间。
  • 不幸的是,这也不起作用

标签: javascript java selenium web-scraping


【解决方案1】:

在使用querySelector() 读取ShadowRoot 时出现此错误消息...

Cannot read properties of null

...表示以下任一情况:


解决方案

在第一种和第二种情况下,您将无法访问ShadowRoot。在第三种情况下,您需要等待某个时间,例如time.sleep(3) 在您尝试访问 ShadowRoot 及其元素之前。

【讨论】:

  • 它是#shadow-root(打开)但不幸的是睡眠延迟仍然不起作用
  • 那么需要先验证你正在执行的脚本。
  • 所以当我将脚本输入到控制台时,它确实返回了我正在寻找的内容,不确定我是否可以通过 cmets 上传图片
【解决方案2】:

在 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 2022-01-12
    • 2021-12-04
    • 2022-01-06
    • 2021-11-14
    • 2021-12-17
    • 2022-01-09
    相关资源
    最近更新 更多