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

Java Selenium DevTools v127:addScriptToEvaluateOnNewDocument无效求助

问题:Selenium DevTools addScriptToEvaluateOnNewDocument 注入脚本未生效

我正在使用Java结合Selenium开发网页爬虫,需要在网页加载前注入JavaScript代码以重写部分方法。尝试通过DevTools的addScriptToEvaluateOnNewDocument方法实现,但未产生预期效果;不过以下Emulation相关代码可正常运行,因此推测DevTools依赖配置正确:

devTools.send(Emulation.setDeviceMetricsOverride(
                500,  // width
                600,  // height
                50,   // deviceScaleFactor
                true,  // mobile
                Optional.empty(),
                Optional.empty(),
                Optional.empty(),
                Optional.empty(),
                Optional.empty(),
                Optional.empty(),
                Optional.empty(),
                Optional.empty(),
                Optional.empty(),
                Optional.empty()
            ));

完整测试代码如下:

String driverpath = Main.configuration.getString("browser.chromedriver");
            String browserpath = Main.configuration.getString("browser.chromebrowser");

            if(driverpath != null && !driverpath.isBlank()){
                System.setProperty(
                    "webdriver.chrome.driver",
                    driverpath
                );
                System.setProperty(
                "webdriver.gecko.driver",
                driverpath
                );
            }
                
            ChromeOptions options = new ChromeOptions();

            if(headless){
                Main.printf("Chrome headless");
                options.addArguments("--headless");
            }
            options.addArguments("--disable-search-engine-choice-screen");
            options.addArguments("--disable-dev-shm-usage"); // overcome limited resource problems
            options.addArguments("start-maximized"); // open Browser in maximized mode
            options.addArguments("disable-infobars"); // disabling infobars
            options.addArguments("--disable-extensions"); // disabling extensions
            options.addArguments("--disable-gpu"); // applicable to windows os only
            options.addArguments("--no-sandbox"); // Bypass OS security model
            if(browserpath != null && !browserpath.isBlank()){
                options.setBinary(browserpath);
            }

            Main.printf("Start Chromedriver...");
            this.driver = new ChromeDriver(options);


            DevTools devTools = ((HasDevTools) driver).getDevTools();


            devTools.createSession();

            
            devTools.send(Emulation.setDeviceMetricsOverride(
                500,  // width
                600,  // height
                50,   // deviceScaleFactor
                true,  // mobile
                Optional.empty(),
                Optional.empty(),
                Optional.empty(),
                Optional.empty(),
                Optional.empty(),
                Optional.empty(),
                Optional.empty(),
                Optional.empty(),
                Optional.empty(),
                Optional.empty()
            ));
            

            String script = "window.was_here=true; console.log('Script executed');";

            ScriptIdentifier identifier = devTools
                    .send(Page.addScriptToEvaluateOnNewDocument(script, // source
                            Optional.empty(), // worldName
                            Optional.of(false), // includeCommandLineAPI
                            Optional.of(false) // runImmediately
            ));
            System.err.println(String.format(
                    "Method Page.addScriptToEvaluateOnNewDocument result: %s", identifier));

            driver.navigate().to("https://intoli.com/blog/not-possible-to-block-chrome-headless/chrome-headless-test.html");
            try {
                Thread.sleep(100); // nur zum Test, für sichtbare Effekte
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            Object d = getJSExecutor().executeScript("return window.was_here");
            if(d != null){
                boolean data = (Boolean) d;
                Main.printf("Scraper", "DATA:"+(data ? "T" : "F"));
            }else Main.printf("Scraper", "D IS NULL!!");

            devTools.send(Page.removeScriptToEvaluateOnNewDocument(identifier));

            try {
                Thread.sleep(500000); // nur zum Test, für sichtbare Effekte
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            driver.quit();
            System.exit(0);

            Main.printf("Chromedriver started :)");

依赖与版本信息

  • Maven Selenium依赖:
    • selenium-java:4.25.0
    • selenium-devtools-v127:4.25.0
  • Chrome浏览器版本:GoogleChromePortable64_127.0.6533.120_online
  • Chrome Driver版本:v127

测试代码参考自某开源项目,烦请协助排查addScriptToEvaluateOnNewDocument方法未生效的原因。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 21:04:51