首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Cucumber Ruby中使用Selenium (Selenium::WebDriver::Error::UnknownCommandError)在W3C模式下不能调用非W3C标准命令

在Cucumber Ruby中使用Selenium (Selenium::WebDriver::Error::UnknownCommandError)在W3C模式下不能调用非W3C标准命令
EN

Stack Overflow用户
提问于 2019-05-13 11:38:13
回答 8查看 31.7K关注 0票数 19

我们有Cucumber Ruby自动化框架,我们很少在Jenkins的Docker上运行Chrome无头浏览器的测试。几天前,我们开始收到一个错误:“这个版本的ChromeDriver只支持ChromeDriver 75”,这一次我们使用的是ChromeDriver 2.46,使用的是google不稳定浏览器,使用的命令如下:

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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检查的可能性很大。

EN

回答 8

Stack Overflow用户

发布于 2019-06-07 07:58:06

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

代码语言:javascript
复制
options = webdriver.ChromeOptions()
options.add_experimental_option('w3c', False)
create_webdriver('Chrome', options=options)

环境:

  • 铬75
  • ChromeDriver 75
票数 24
EN

Stack Overflow用户

发布于 2019-06-05 08:21:32

这个错误信息..。

代码语言:javascript
复制
unknown command: Cannot call non W3C standard command while in W3C mode (Selenium::WebDriver::Error::UnknownCommandError)

...implies表示,ChromeDriver在启动/生成新的WebBrowser (即Chrome浏览器会话)时,在W3C模式中无法调用非W3C标准命令。

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

分析

根据ChromeDriver响应在W3C模式下不符合标准 John ( Google的所有者- WebDriver) 提到过的讨论,Stewart (Creator - WebDriver )更新了以下内容:

  • w3c会话的新会话响应应该如下所示: {“值”:{ "sessionId":“一些-uuid”,“功能”:{ "browserName":“browserName”,.}}
  • 但是,当使用w3c选项启动新会话时,chromeOptions中的true设置如下:
代码语言:javascript
复制
- Selenium/Python:

从selenium导入webdriver = webdriver.ChromeOptions() opt.add_experimental_option('w3c',True)驱动程序= webdriver.Chrome(chrome_options=opt)

-硒/爪哇:

{ "sessionId":"af4656c27fb94485b7872e1fc616923a",“状态”:“确定”,“值”:{ "browserName":"chrome",.}

  • 返回的响应如下: { "sessionId":"af4656c27fb94485b7872e1fc616923a",“状态”:“确定”,“值”:{ "browserName":"chrome",.}

它既不是的正确形式的响应(其中“状态”将是一个整数),也不是一个格式正确的W3C响应,如果没有正确的格式响应,则不能使用w3c兼容的响应。

这个修订和这个提交解决了这个问题。

这个酶

由于您使用的是w3c v75.x和Chromev75.x,并且您仍然看到相同的错误,您需要将ExperimentalOption ChromeDriver完全作为true传递,如下所示:

代码语言:javascript
复制
capabilities = { "chromeOptions" => {'w3c' => true} }

更新

直到ChromeDriver v74.x,Chrome和ChromDriver组合体默认在w3c模式下运行,但在handler.cc中有错误。根据goog:chromeOptions.w3c=false不适用于空体的POST请求中的详细信息

方法HttpHandler::HandleCommand检查kW3CDefault常量的值,而不是会话goog:chromeOptions.w3c值。因此,JSON协议支持被打破,允许使用空体的POST请求。在displayed端点以w3c模式恢复之前,JSON协议是必需的。应该注意的是,W3C WebDriver规范并不禁止使用“显示的”端点,该特性在某些API中得到了积极使用。

因为Is Element Displayed命令不是W3C规范的一部分,但仍被一些API使用,其功能很难在这些API中复制。此更改列表[修订提交]重新启用在W3C模式下的此命令,以简化向W3C模式的转换。

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

这是解决办法

正如John的Google所有者- WebDriver承诺的那样,76.0.3809.25和ChromeDriver版本已经发布,现在可以在ChromeDriver下载站点上获得。这些版本包括以前版本的ChromeDriver 7576的以下bug修复

  • 修正了错误地拒绝开放源码软件模式中空体的POST请求的错误。
  • 添加了检索Chrome日志的新端点

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

  • 添加的端点在W3C模式下显示命令

快照

票数 19
EN

Stack Overflow用户

发布于 2019-06-11 02:14:37

如果使用rails + rspec + capybara + selenium获取此错误,则传递禁用W3C选项的方法如下:

代码语言:javascript
复制
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
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56111529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档