web-dev-qa-db-ja.com

Cucumber Ruby

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チェックを無効にする可能性は素晴らしいと思います。

14
sugu

あなたがしなければならないのは、Webドライバを初期化するときにW3Cを無効にすることだけです

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

環境:

  • Chrome 75
  • ChromeDriver 75
17

このエラーメッセージ...

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

...ChromeDriver非W3C標準コマンドを呼び出すことができなかったことを意味します新しいWebBrowserの開始/起動中のW3Cモード、つまりChrome Browserセッション。

ここでの主な問題は、ChromeDriverのクライアントがW3C準拠のセッションを要求したときに応答がfromChromeDriverはW3C仕様に準拠していないため、言語APIでエラーが発生します。


分析

W3CモードでのChromeDriverの応答が標準に準拠していない John Chen(所有者-Google ChromeのWebDriver)の説明に従って 言及 その、Simon Stewart(クリエーター-WebDriver)はそれを更新しました:

  • W3cセッションの新しいセッション応答は次のようになります。

    {
      "value": {
        "sessionId": "some-uuid",
        "capabilities": {
          "browserName": "chrome",
          ...
        }
      }
    }
    
  • ただし、w3cオプションをchromeOptionsでtrueに設定して新しいセッションを開始すると 次のように:

    • セレン/ Python:

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

      {
        "sessionId": "af4656c27fb94485b7872e1fc616923a",
        "status": "ok",
        "value": {
          "browserName": "chrome",
          ...
        }
      }
      
  • 返される応答は次のようになります。

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

これは、JSONワイヤープロトコルの正しい形式の応答(「ステータス」は整数になります)でも、正しい形式のW3C応答でもありません。正しく形式された応答がないと、w3c互換を使用できません。

この revision およびこの commit がこの問題に対処しました。


このユースケース

ChromeDriver v75.xChrome v75.xを使用しているにもかかわらず同じエラーが表示される場合は、 ExperimentalOptionw3castrue排他的に以下のとおりです。

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

更新

ChromeDriver v74.xChromeおよびChromDriverコンボがw3cで実行されるまでデフォルトではモードですが、 chromedriver/server/http_handler.cc にバグがありました。 goog:chromeOptions.w3c=falseの詳細に従って、POST空のボディを持つリクエスト

メソッドHttpHandler::HandleCommandは、セッションkW3CDefault値の代わりにgoog:chromeOptions.w3c定数の値をチェックします。その結果、JSONワイヤープロトコルのサポートが壊れました。ここで、POST空の本文を含むリクエストが許可されます。JSONワイヤープロトコルは、displayedエンドポイントはw3cモードで再開されます。W3CWebDriver仕様では「表示された」エンドポイントの使用が禁止されておらず、この機能は一部のAPIで積極的に使用されています。

Is Element DisplayedコマンドはW3C仕様の一部ではありませんが、一部のAPIで引き続き使用されており、その機能をそれらのAPIで複製するのは難しい場合があります。これ変更リスト[ revision および commit ]は、W3Cモードでこのコマンドを再度有効にしますW3Cモードへの移行を容易にするため。

@Johnは、明日、修正によりChromeDriver v75.0へのアップデートを期待することをすでに確認しています。


これが解決策です

John Chen [所有者-Google ChromeのWebDriver]が約束したように、ChromeDriverバージョン75.0.3770.90および76.0.3809.25がリリースされ、 ChromeDriver Downloads サイトで入手できるようになりました。これらのバージョンには、以前のリリースのChromeDriver75および76

  • OSSモードで空の本文を含むPOSTリクエストを誤って拒否するバグを修正しました
  • Chromeログを取得するための新しいエンドポイントを追加

さらに、バージョン76.0.3809.25には次の変更も含まれています。

  • W3CモードでIs Displayedコマンドのエンドポイントを追加

スナップショット

75_76

11
DebanjanB

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
10
mahi-man

この例のように、最後にw3c:falseを追加するだけです。

  capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(chromeOptions: { args: ["window-size=#{DEFAULT_X_RES},#{DEFAULT_Y_RES}"], w3c: false })
1
Daniel

私のPHPインターネットの深さを検索する友人のために...
PHPUnit_Extensions_Selenium2TestCaseの最新バージョン

現時点では、composerの制約

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

次のオプションを使用できます。私の闘争に注意してください::

'w3c' => false

これは文字列ではなくブール値でなければなりません。

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();

    }
}
1
Tyler Miles

使用しているフレームワークがわからないが、ブラウザーとChromedriverを最新のv75.0.3770.90に更新した後も同じエラーが発生する。私の提案は、スクリプトでセッションの初期化セクションを探し、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)
1
Dinh Luong

私の場合、w3cをサポートしていないのはSeleniumの別のバージョンでした。 chromedriverをバージョン74.0.3729.6に減らして、すべての作業を機能させます。また、SeleniumのバージョンをW3Cをサポートする最新バージョンに更新することで修正することもできます。

0
SkorpEN