【问题标题】:How to Disable Javascript in Chrome (-headless) using PHP Webdriver如何使用 PHP Webdriver 在 Chrome (-headless) 中禁用 Javascript
【发布时间】:2018-04-14 11:08:59
【问题描述】:

我正在无头使用 Chrome。

我尝试设置--disable-javascript 命令行参数。

我尝试使用实验选项:

        $options->setExperimentalOption('prefs', [
            'profile.managed_default_content_settings.javascript' => 2//this does not work
            //,'profile.default_content_setting_values.javascript' => 2//this does not work, too
        ]);

        $capabilities = DesiredCapabilities::chrome();
        $capabilities->setCapability(ChromeOptions::CAPABILITY, $options);

到目前为止,这两个都不起作用。

如何使用 Facebook PHP Webdriver 在 Chrome 中禁用 javascript?

这是一个检查 JavaScript 是否启用的测试:

        $this->driver->get('https://www.whatismybrowser.com/detect/is-javascript-enabled');
        return [
            $this->driver->getTitle(),
            $this->driver->findElement(WebDriverBy::cssSelector('.detected_result'))->getText()
        ];

【问题讨论】:

  • 我用首选项尝试了您的示例,并且 javascript 按预期禁用(Win10、Chromium 62、驱动程序 2.33)。另一个是'profile.content_settings.exceptions.javascript.*.setting' => 2。确保您没有任何政策 (chrome://policy/) 覆盖您的偏好。
  • 感谢@FlorentB。在 Windows 上检查它。很高兴知道它有效。自从我开始使用 Firefox 已经快一个月了。我目前只有一个 Seelenium 设置(Ubuntu 16.04 Vagrant box)。稍后我将使用 GUI 启动一些 Ubuntu 16.04 以检查默认的chrome://policy/。是否有可能在全新的 Chrome 安装中有一些默认的 proxy 策略设置?我的意思是......这是一个全新的非 X11 安装,全新的 Chrome 安装,无头运行浏览器......并且这些设置都不起作用。我只能尝试* 一个。以后再写……
  • @Boris D. Teoharov,当前不支持在 Chrome 无头启动时禁用 JavaScript。根据这张票,它不会加载首选项:bugs.chromium.org/p/chromium/issues/detail?id=775911#c7
  • @FlorentB。看来这回答了我的问题。请在下面添加答案,以便我给你赏金。

标签: javascript php google-chrome selenium ubuntu-16.04


【解决方案1】:

这简直是不可能的。阅读这里http://yizeng.me/2014/01/08/disable-javascript-using-selenium-webdriver/

警告:不支持在没有 JavaScript 的情况下运行,这可能会破坏 ChromeDriver 的大部分功能。我怀疑除了导航到一个页面之外,您将能够做的更多。这不是一个受支持的用例,我们也不会支持它。 将其作为 WontFix 关闭 - ChromeDriver(以及我知道的所有其他 WebDriver 实现)需要 JavaScript 才能运行。

【讨论】:

  • 这件事有没有更新的信息?
  • 恐怕信息还是准确的。我搜索了 Chromedriver 文档,没有关于如何禁用 JS 的参考。我还检查了 chrome 标志,但没有通过命令行禁用 JS 的选项了。
  • 此信息不再准确。可以在页面中禁用 JavaScript 的情况下使用 Selenium 驱动 Chrome。由 selenium 注入的脚本(原子)仍然有效,也可以使用 execute_script 运行您自己的脚本。但是,headless 模式目前不支持它。
【解决方案2】:

可以通过设置以下首选项之一来禁用 Javascript 的执行:

"webkit.webprefs.javascript_enabled": false
"profile.content_settings.exceptions.javascript.*.setting": 2
"profile.default_content_setting_values.javascript": 2
"profile.managed_default_content_settings.javascript": 2

但它目前不支持 headless,因为此模式 doesn't load the preferences 并且没有与此功能相关的 command switch

请注意,禁用 JavaScript 会破坏 Selenium,因为大多数命令都是注入页面的原子脚本。现在已经不是这样了。所有命令都可以运行。但是我注意到返回的文本不包括来自 <noscript> 元素的文本(仅在禁用 JavaScript 时显示的文本)。一种解决方法是使用execute_scriptget_attribute 读取innerText 属性。

【讨论】:

    【解决方案3】:

    正如其他人所指出的,在无头时仍然无法在 Chrome 中禁用 JavaScript。

    但是,为了将来参考,这是您的操作方式(当您不使用 --headless 参数时):

            $options = new ChromeOptions();
    
            $options->setExperimentalOption('prefs', [
                'profile.managed_default_content_settings.javascript' => 2,
            ]);
    
            $result = DesiredCapabilities::chrome();
    
            $result->setCapability(
                ChromeOptions::CAPABILITY_W3C,
                // There is a bug in php-webdriver, so ->toArray() is needed!
                $options->toArray()
            );
    

    【讨论】:

      猜你喜欢
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      • 2019-11-24
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 2018-01-03
      • 2021-02-22
      相关资源
      最近更新 更多