19

我们有 Cucumber Ruby 自动化框架,在 Jenkins 上的 Docker 中,我们在 Chrome 无头浏览器上运行了一些测试。几天前,我们开始收到错误消息“此版本的 ChromeDriver 仅支持 Chrome 版本 75”,这次我们使用的是 ChromeDriver 2.46 和 google-chrome-unstable 浏览器,使用以下命令:

#Chrome
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
RUN echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list
RUN apt-get update -y
RUN apt-get install -y google-chrome-unstable
RUN apt-get install unzip

# Set up Chromedriver Environment variables
ENV CHROMEDRIVER_VERSION 2.46
ENV CHROMEDRIVER_VERSION 75.0.3770.8
ENV CHROMEDRIVER_DIR /chromedriver
RUN mkdir $CHROMEDRIVER_DIR
# Download and install Chromedriver
RUN wget -q --continue -P $CHROMEDRIVER_DIR "http://chromedriver.storage.googleapis.com/$CHROMEDRIVER_VERSION/chromedriver_linux64.zip"
RUN unzip $CHROMEDRIVER_DIR/chromedriver* -d $CHROMEDRIVER_DIR
ENV PATH $CHROMEDRIVER_DIR:$PATH

我现在已经更新了 chromedriver 版本75.0.3770.8和浏览器google-chrome-beta=75.0.3770.27-1

#Chrome
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
RUN echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list
RUN apt-get update -y
RUN apt-get install -y google-chrome-beta=75.0.3770.27-1
RUN apt-get install unzip

# Set up Chromedriver Environment variables
ENV CHROMEDRIVER_VERSION 75.0.3770.8
ENV CHROMEDRIVER_DIR /chromedriver
RUN mkdir $CHROMEDRIVER_DIR
RUN echo $CHROMEDRIVER_DIR
# Download and install Chromedriver
RUN wget -q --continue -P $CHROMEDRIVER_DIR "http://chromedriver.storage.googleapis.com/$CHROMEDRIVER_VERSION/chromedriver_linux64.zip"
RUN unzip $CHROMEDRIVER_DIR/chromedriver* -d $CHROMEDRIVER_DIR
ENV PATH $CHROMEDRIVER_DIR:$PATH

现在我可以看到错误:

unknown command: Cannot call non W3C standard command while in W3C mode (Selenium::WebDriver::Error::UnknownCommandError)

是否可以禁用 W3C 模式或下载旧版本的 Chrome 浏览器和不使用它的驱动程序?我认为禁用 W3C 检查的可能性很大。

4

8 回答 8

24

您所要做的就是在初始化 webdriver 时禁用 W3C

options = webdriver.ChromeOptions()
options.add_experimental_option('w3c', False)
create_webdriver('Chrome', options=options)

环境:

  • 铬 75
  • 铬驱动程序 75
于 2019-06-07T07:58:06.997 回答
19

此错误消息...

unknown command: Cannot call non W3C standard command while in W3C mode (Selenium::WebDriver::Error::UnknownCommandError)

...意味着ChromeDriver无法在W3C 模式下调用非 W3C 标准命令,同时启动/生成新的WebBrowserChrome 浏览器会话。

这里的主要问题是,当ChromeDriver的客户端请求符合 W3C 的会话但来自ChromeDriver的响应不符合 W3C 规范时,会导致语言 API 出现错误。


分析

根据 W3C 模式下 ChromeDriver 响应中的讨论不符合标准John Chen(所有者 - Google Chrome 的 WebDriver)提到,Simon Stewart(创建者 - WebDriver)已更新:

  • w3c 会话的新会话响应应如下所示:

    {
      "value": {
        "sessionId": "some-uuid",
        "capabilities": {
          "browserName": "chrome",
          ...
        }
      }
    }
    
  • 但是,在chromeOptions 中将w3c选项设置为如下开始新会话时:true

    • 硒/Python:

      from selenium import webdriver
      opt = webdriver.ChromeOptions()
      opt.add_experimental_option('w3c', True)
      driver = webdriver.Chrome(chrome_options=opt)
      
    • 硒/Java:

      {
        "sessionId": "af4656c27fb94485b7872e1fc616923a",
        "status": "ok",
        "value": {
          "browserName": "chrome",
          ...
        }
      }
      
  • 返回的响应如下所示:

    {
      "sessionId": "af4656c27fb94485b7872e1fc616923a",
      "status": "ok",
      "value": {
        "browserName": "chrome",
        ...
      }
    }
    

这既不是 JSON Wire 协议的正确格式响应(其中“状态”将是一个整数),也不是正确格式的 W3C 响应,如果没有正确格式的响应,则无法使用 w3c 兼容。

修订版和此提交解决了此问题。


这个用例

当您使用ChromeDriver v75.xChrome v75.x并且仍然看到相同的错误时,您需要按以下方式独家传递ExperimentalOptionw3ctrue

capabilities = { "chromeOptions" => {'w3c' => true} }

更新

ChromeDriver v74.x 之前ChromeChromDriver组合默认在 w3c 模式下运行,但chromedriver/server/http_handler.cc中存在错误。根据goog:chromeOptions.w3c=false 中的详细信息不适用于空正文的 POST 请求

方法HttpHandler::HandleCommand检查kW3CDefault常量的值而不是会话goog:chromeOptions.w3c值。结果,JSON Wire 协议支持被破坏,允许使用空正文的 POST 请求。displayed在以 w3c 模式恢复端点之前,将需要 JSON Wire 协议。应该注意的是,W3C WebDriver 规范并没有禁止使用“显示”端点,并且此功能在某些 API 中被积极使用。

由于Is Element Displayed命令不是 W3C 规范的一部分,但仍被某些 API 使用,其功能可能难以在这些 API 中复制。此更改列表[修订提交] 在 W3C 模式下重新启用此命令,以轻松过渡到 W3C 模式。

@John已经确认我们预计明天将更新ChromeDriver v75.0并进行修复。


这是解决方案

正如 John Chen [所有者 - Google Chrome 的 WebDriver] 所承诺的,ChromeDriver版本75.0.3770.9076.0.3809.25已经发布,现在可以在ChromeDriver 下载站点上获得。这些版本包括对ChromeDriver 7576以前版本的以下错误修复:

  • 修复 OSS 模式下错误拒绝正文为空的 POST 请求的问题
  • 添加了用于检索 Chrome 日志的新端点

此外,版本76.0.3809.25还包括以下更改:

  • 在 W3C 模式下为 Is Displayed 命令添加了端点

快照

75_76

于 2019-06-05T08:21:32.313 回答
10

如果您使用 rails + rspec + capybara + selenium 遇到此错误,则通过选项禁用 W3C 的方法如下:

Capybara.register_driver :chrome do |app|
  capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(
    chromeOptions: {'w3c' => false}
  )
  Capybara::Selenium::Driver.new(app, :browser => :chrome, desired_capabilities: capabilities)
end
于 2019-06-11T02:14:37.900 回答
1

只需在最后添加 w3c: false ,如下例所示:

  capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(chromeOptions: { args: ["window-size=#{DEFAULT_X_RES},#{DEFAULT_Y_RES}"], w3c: false })
于 2019-07-02T08:22:24.753 回答
1

给我在互联网深处搜索的PHP朋友们...
PHPUnit_Extensions_Selenium2TestCase的最新版本

目前这是作曲家的约束

"phpunit/phpunit-selenium": ">=7",
"phpunit/phpunit": ">=6" 

可以使用以下选项。注意我的挣扎::

'w3c' => 假

这必须是布尔值而不是字符串。

class NavigationTest extends PHPUnit_Extensions_Selenium2TestCase
{

    public function setUp()
    {
        static $count;
        $count or $count = 1 and print PHP_EOL . 'java -jar ' . dirname(__DIR__) . '/selenium-server-standalone-3.141.59.jar' . PHP_EOL;
        self::shareSession(true);
        $this->setDesiredCapabilities([
            "chromeOptions" => [
                'w3c' => false
            ]
        ]);
        $this->setHost('localhost');
        $this->setPort(4444);
        $this->setBrowser('chrome');
        $this->setBrowserUrl('http://localhost:9919/');
        $this->prepareSession()->currentWindow()->maximize();

    }
}
于 2019-07-11T03:55:05.500 回答
1

不确定您使用的是什么框架,但在将浏览器和 chromedriver 更新到最新的 v75.0.3770.90 后,我遇到了同样的错误。我的建议是在脚本中查找 session init 部分并添加禁用w3c. 例如升级前的我的:

chrome_options = Selenium::WebDriver::Chrome::Options.new
options[:options] = chrome_options
Capybara::Selenium::Driver.new(app, options)

升级后

chrome_options = Selenium::WebDriver::Chrome::Options.new
chrome_options.add_option('w3c',false)
options[:options] = chrome_options
Capybara::Selenium::Driver.new(app, options)
于 2019-06-20T07:51:41.647 回答
0

在我的情况下,它是不支持 w3c 的不同版本的 selenium。将 chromedriver 降低到版本 74.0.3729.6 使所有工作正常。它也可以通过将 selenium 版本更新到支持 W3C 的最新版本来修复。

于 2019-07-10T13:02:14.593 回答
0

请开始阅读文档,而不是“仅仅禁用”某些有原因的东西。

例如,执行脚本:

  • /session/{session id}/执行/同步
  • /session/{session id}/执行/异步
于 2022-01-12T09:19:07.383 回答