You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法处理Shadow Element:嵌套Shadow元素文本打印失败求助

问题描述

使用Selenium执行JavaScript代码获取嵌套Shadow DOM元素的文本时,代码运行后无预期输出,但将相同JavaScript代码在浏览器控制台执行却能正常拿到文本内容。页面存在多层嵌套的Shadow DOM结构,目标元素位于深层Shadow Root内部。

原因分析

  1. 你调用js.executeScript()时,仅执行了获取innerText的表达式,但未通过return返回该值,同时Java代码也没有接收并打印结果,因此程序运行后看不到输出;而浏览器控制台会自动输出表达式执行结果,所以能显示预期文本。
  2. System.setProperty("webdriver.chrome.driver", "chromedriver.exe")位置错误,该配置应在初始化ChromeDriver前设置,否则不会生效(此为代码规范问题,非文本无法输出的直接原因)。

解决方案

  1. 在JavaScript脚本开头添加return,让执行器返回目标元素的文本值;
  2. 在Java代码中接收executeScript()的返回结果并打印;
  3. 调整System.setProperty到浏览器初始化步骤之前。

修改后的完整代码:

import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

public class ShadowRoot {
    public static void main(String[] args) throws InterruptedException {
        // 先设置驱动路径,再初始化浏览器实例
        System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
        
        WebDriver driver;
        ChromeOptions chromeOptions = new ChromeOptions();
        chromeOptions.addArguments("--remote-allow-origins=*", "ignore-certificate-errors");
        driver = new ChromeDriver(chromeOptions);

        String url = "http://watir.com/examples/shadow_dom.html";
        driver.get(url);
        JavascriptExecutor js = (JavascriptExecutor) driver;
        
        // 执行JS并返回文本值,接收后打印输出
        String nestedText = (String) js.executeScript(
            "return document.querySelector('#shadow_host').shadowRoot.querySelector('#nested_shadow_host').shadowRoot.querySelector('#nested_shadow_content > div').innerText"
        );
        System.out.println("嵌套Shadow元素文本:" + nestedText);

        Thread.sleep(10000);
        driver.close();
    }
}

内容的提问来源于stack exchange,提问作者SeleniumUser

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 03:32:26