Невозможно вызвать стандартную команду не W3C в режиме W3C (Selenium :: WebDriver :: Error :: UnknownCommandError) с Selenium ChromeDriver в огуречном рубине - PullRequest
10 голосов
/ 13 мая 2019

У нас есть фреймворк автоматизации Cucumber Ruby, в котором мы запускаем несколько тестов в браузере Chrome без головы в Docker на Jenkins. Несколько дней назад мы начали получать сообщение об ошибке «Эта версия 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.

Ответы [ 7 ]

13 голосов
/ 07 июня 2019

Все, что вам нужно сделать, это просто отключить W3C при инициализации веб-драйвера

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

Окружающая среда:

  • Хром 75
  • ChromeDriver 75
8 голосов
/ 11 июня 2019

Если вы получаете эту ошибку, используя 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
7 голосов
/ 05 июня 2019

Это сообщение об ошибке ...

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

... означает, что ChromeDriver не смог вызвать не стандартную команду W3C в режиме Режим W3C при запуске / порождении нового WebBrowser т.е. Браузер Chrome сеанс.

Здесь основная проблема возникает, когда ChromeDriver 'Клиент s запрашивает W3C-совместимый сеанс , но ответ от ChromeDriver не соответствует спецификации W3C и вызывает ошибки в языковых API.


Анализ

Согласно обсуждению в Ответ ChromeDriver в режиме W3C не соответствует стандарту Джон Чен (владелец - WebDriver для Google Chrome) упомянул что Саймон Стюарт (Создатель -WebDriver) обновил:

  • Новый ответ сеанса для сеанса w3c должен выглядеть следующим образом:

    {
      "value": {
        "sessionId": "some-uuid",
        "capabilities": {
          "browserName": "chrome",
          ...
        }
      }
    }
    
  • Но при запуске новогосеанс с параметром w3c, установленным на true в chromeOptions следующим образом:

    • Селен / 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 (где «status»)не может быть целым числом), ни правильно сформированным ответом W3C, и без правильно сформированного ответа нельзя использовать w3c-совместимый.

1080 * Эта ревизия и коммит решают эту проблему.

Этот сценарий использования

Поскольку вы используете ChromeDriver v75.x и Chrome v75.x , и вы все еще видите ту же ошибку, вам нужно передать ExperimentalOption w3c как true исключительно следующим образом:

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

Обновление

До ChromeDriver v74.x , Chrome и ChromDriver Комбо работал по умолчанию в режиме w3c, но была ошибка в chromedriver / server / http_handler.cc .Согласно сведениям в goog: chromeOptions.w3c = false не работает для запроса POST с пустым телом :

Метод HttpHandler::HandleCommand проверяет значение kW3CDefaultконстанта вместо значения сеанса goog:chromeOptions.w3c.В результате была нарушена поддержка протокола JSON Wire, где разрешены запросы POST с пустым телом.Протокол JSON Wire будет востребован до тех пор, пока конечная точка displayed не будет возобновлена ​​в режиме w3c.Следует отметить, что спецификация W3C WebDriver не запрещает использование «отображаемой» конечной точки, и эта функция активно используется в некоторых API.

Поскольку команда Is Element Displayed не является частью спецификации W3C,но все еще используется некоторыми API, и его функциональность может быть трудно воспроизвести в этих API.При этом Список изменений [ ревизия и commit ] повторно включает эту команду в режиме W3C для упрощения перехода в режим W3C.

@ John haveуже подтвердили, что мы ожидаем обновления до ChromeDriver v75.0 завтра с исправлением.


Вот решение

Как и обещал Джон Чен [Владелец - WebDriverдля Google Chrome], ChromeDriver версии 75.0.3770.90 и 76.0.3809.25 были выпущены и теперь доступны в Загрузках ChromeDriver сайт.Эти версии включают следующие исправления ошибок по сравнению с предыдущими выпусками ChromeDriver 75 и 76 :

  • Исправлена ​​ошибка, которая некорректно отклонялаPOST-запросы с пустым телом в режиме OSS
  • Добавлены новые конечные точки для получения журнала Chrome

Кроме того, версия 76.0.3809.25 также включает следующее изменение:

  • Добавлена ​​конечная точка для команды Is Displayed в режиме W3C

Снимок

75_76

1 голос
/ 02 июля 2019

Просто добавьте w3c: false в конце, как в этом примере:

  capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(chromeOptions: { args: ["window-size=#{DEFAULT_X_RES},#{DEFAULT_Y_RES}"], w3c: false })
0 голосов
/ 11 июля 2019

Для моих друзей по PHP, которые ищут глубины Интернета ...
Новейшая версия PHPUnit_Extensions_Selenium2TestCase

На данный момент ограничение композитора составляет

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

    }
}
0 голосов
/ 10 июля 2019

В моем случае это была другая версия selenium, которая не поддерживала w3c.Уменьшите chromedriver до версии 74.0.3729.6, чтобы все работало.Это также можно исправить, обновив версию Selen до последней, поддерживающей W3C.

0 голосов
/ 20 июня 2019

Не уверен, какую платформу вы используете, но у меня возникает та же ошибка после обновления моего браузера и 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...