Как отключить w3c в chromedriver для устранения ошибки неизвестной команды: Невозможно вызвать стандартную команду, отличную от W3C, в то время как в W3C - PullRequest
12 голосов
/ 05 июня 2019

С только что выпущенной версией Chrome 75 наши тесты перестали работать должным образом. Они дают трассировку стека, вставленную ниже. Мы используем ruby ​​on rails v. 5.1.6.2 с rspec, selenium-webdriver 3.8.0.

StackTrace:

Selenium::WebDriver::Error::UnknownCommandError:
            unknown command: Cannot call non W3C standard command while in W3C mode
          # 0   chromedriver                        0x000000010c46e8e9 chromedriver + 3594473
          # 1   chromedriver                        0x000000010c3fe543 chromedriver + 3134787
          # 2   chromedriver                        0x000000010c1aa29f chromedriver + 692895
          # 3   chromedriver                        0x000000010c11a691 chromedriver + 104081
          # 4   chromedriver                        0x000000010c11b7d5 chromedriver + 108501
          # 5   chromedriver                        0x000000010c42d555 chromedriver + 3327317
          # 6   chromedriver                        0x000000010c438e60 chromedriver + 3374688
          # 7   chromedriver                        0x000000010c438bf8 chromedriver + 3374072
          # 8   chromedriver                        0x000000010c40cd39 chromedriver + 3194169
          # 9   chromedriver                        0x000000010c4396d8 chromedriver + 3376856
          # 10  chromedriver                        0x000000010c420f27 chromedriver + 3276583
          # 11  chromedriver                        0x000000010c456064 chromedriver + 3493988
          # 12  chromedriver                        0x000000010c474617 chromedriver + 3618327
          # 13  libsystem_pthread.dylib             0x00007fff7744c2eb _pthread_body + 126
          # 14  libsystem_pthread.dylib             0x00007fff7744f249 _pthread_start + 66
          # 15  libsystem_pthread.dylib             0x00007fff7744b40d thread_start + 13
          # /Users/julie/.rvm/gems/ruby-2.5.1/gems/selenium-webdriver-3.8.0/lib/selenium/webdriver/remote/response.rb:69:in `assert_ok'
          # /Users/julie/.rvm/gems/ruby-2.5.1/gems/selenium-webdriver-3.8.0/lib/selenium/webdriver/remote/response.rb:32:in `initialize'
          # /Users/julie/.rvm/gems/ruby-2.5.1/gems/selenium-webdriver-3.8.0/lib/selenium/webdriver/remote/http/common.rb:81:in `new'
          # /Users/julie/.rvm/gems/ruby-2.5.1/gems/selenium-webdriver-3.8.0/lib/selenium/webdriver/remote/http/common.rb:81:in `create_response'
          # /Users/julie/.rvm/gems/ruby-2.5.1/gems/selenium-webdriver-3.8.0/lib/selenium/webdriver/remote/http/default.rb:104:in `request'
          # /Users/julie/.rvm/gems/ruby-2.5.1/gems/selenium-webdriver-3.8.0/lib/selenium/webdriver/remote/http/common.rb:59:in `call'
          # /Users/julie/.rvm/gems/ruby-2.5.1/gems/selenium-webdriver-3.8.0/lib/selenium/webdriver/remote/bridge.rb:166:in `execute'
          # /Users/julie/.rvm/gems/ruby-2.5.1/gems/selenium-webdriver-3.8.0/lib/selenium/webdriver/remote/oss/bridge.rb:579:in `execute'
          # /Users/julie/.rvm/gems/ruby-2.5.1/gems/selenium-webdriver-3.8.0/lib/selenium/webdriver/remote/oss/bridge.rb:526:in `element_displayed?'
          # /Users/julie/.rvm/gems/ruby-2.5.1/gems/selenium-webdriver-3.8.0/lib/selenium/webdriver/common/element.rb:199:in `displayed?'
          # /Users/julie/.rvm/gems/ruby-2.5.1/gems/capybara-2.17.0/lib/capybara/selenium/node.rb:148:in `visible?'
          # /Users/julie/.rvm/gems/ruby-2.5.1/gems/capybara-2.17.0/lib/capybara/node/element.rb:269:in `block in visible?'
          # /Users/julie/.rvm/gems/ruby-2.5.1/gems/capybara-2.17.0/lib/capybara/node/base.rb:81:in `synchronize'
          # /Users/julie/.rvm/gems/ruby-2.5.1/gems/capybara-2.17.0/lib/capybara/node/element.rb:269:in `visible?'
          # /Users/julie/.rvm/gems/ruby-2.5.1/gems/capybara-2.17.0/lib/capybara/queries/selector_query.rb:84:in `matches_filters?'
          # /Users/julie/.rvm/gems/ruby-2.5.1/gems/capybara-2.17.0/lib/capybara/result.rb:29:in `block in initialize'

Наша конфигурация драйвера:

File.write(LOG_FILE_PATH, '')
Selenium::WebDriver.logger.level = :debug
Selenium::WebDriver.logger.output = LOG_FILE_PATH
Capybara.register_driver :selenium do |app|
  # from https://github.com/SeleniumHQ/selenium/issues/3738
  capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(loggingPrefs: {browser: 'ALL'})
  options = Selenium::WebDriver::Chrome::Options.new
  options.add_argument '--disable-infobars' # hide info bar about chrome automating test
  # if we don't use this flag, every selenium test will die with the error:
  # "unknown error: Chrome failed to start: exited abnormally"
  options.add_argument '--no-sandbox'
  options.add_argument '--headless' if ENV.fetch("HEADLESS", nil).present?
  options.add_argument '--window-size=1600,2400'
  options.add_argument '-–allow-file-access-from-files' # TODO Julie - may help with file specs?
  options.add_preference('homepage', 'about:blank') # TODO is this working?
  options.add_preference('profile.default_content_settings.popups', 0)
  options.add_preference('download.default_directory', DownloadHelpers::PATH.to_s)
  Capybara::Selenium::Driver.new(
    app,
    clear_local_storage: true,
    clear_session_storage: true,
    browser: :chrome,
    options: options,
    desired_capabilities: capabilities,
  )
end

UPDATE:

Мне удалось временно запустить наши тесты, используя capabilities = { "chromeOptions" => {'w3c' => false} }.

После обновления chromedriver мы начали получать сообщение об ошибке «неизвестная ошибка: файл DevToolsActivePort не существует». Чтобы решить эту проблему, мы обновили наш драгоценный камень selenium-webdriver до 3.142.3, и это исправило проблему, позволив нам использовать w3c без каких-либо дополнительных параметров.

Ответы [ 6 ]

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

Первое решение

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

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

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

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

Снимок электронной почты

75_76


Это будет против лучших практик отключить w3c в chromedriver для устранения ошибки:

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

в качестве текущей реализации ChromeDriver запрашивает W3C-совместимый сеанс для клиента.


Однако из этого сообщения об ошибке следует, что ChromeDriver не смог вызвать стандартную команду не W3C в режиме W3C при запуске / порождении нового Веб-браузер т.е. Браузер Chrome сеанс.

Основная проблема заключается в том, что когда клиент ChromeDriver запрашивает W3C-совместимый сеанс , ответ от ChromeDriver не соответствует спецификации W3C, и вызывает ошибки в языковых API.

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

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

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

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

Что не является ни правильно сформированным ответом для протокола JSON Wire (где «status» будет целым числом), ни правильно сформированным ответом W3C, и без правильно сформированного ответа нельзя использовать w3c-совместимый.

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


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

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

  • Ruby Пример кода:

    capabilities = { "chromeOptions" => {'w3c' => true} }
    
  • Java пример кода:

    import org.openqa.selenium.chrome.ChromeDriver;
    import org.openqa.selenium.chrome.ChromeOptions;
    
    public class W3c {
      public static void main(String[] args) throws Exception {
        ChromeOptions opt = new ChromeOptions();
        opt.setExperimentalOption("w3c", true);
        ChromeDriver driver = new ChromeDriver(opt);
        driver.get("https://www.google.co.in");
      }
    }
    
  • Python пример кода:

    from selenium import webdriver
    
    opt = webdriver.ChromeOptions()
    opt.add_experimental_option('w3c', True)
    driver = webdriver.Chrome(chrome_options=opt)
    driver.get('https://www.google.co.in')
    

Обновление

До ChromeDriver v74.x , Chrome и ChromDriver Комбо работал по умолчанию в режиме w3c, но была ошибка в chromedriver / сервер / 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 с исправлением.

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

После выполнения options = Selenium::WebDriver::Chrome::Options.new Вы можете сделать options.add_option('w3c', false)

2 голосов
/ 05 июня 2019

Я столкнулся с той же проблемой.

Я пытался отключить, используя capabilities = Selenium::WebDriver::Remote::Capabilities.chrome({ "chromeOptions" => {'w3c' => false} }), но это не сработало.

Затем я изменил на capabilities = { "chromeOptions" => {'w3c' => false} }, и теперь это работает.

Может быть, это поможет вам.

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

Для пользователей Javascript (я специально использую WebdriverIO) убедитесь, что вы используете 'goog: chromeOptions'

  capabilities: {
    browserName: 'chrome',
    'goog:chromeOptions': {
        'w3c': false
    }
  }

В противном случае вы получите

unknown error: Illegal key values seen in w3c capabilities: [chromeOptions]
0 голосов
/ 11 июля 2019

Думаю, стоит связать и эту ветку. Другое переполнение стека Общая проблема с драйвером Chrome w3c

Я рассматриваю шаги, чтобы устранить эту ошибку для PHP Selenium 2 TestCase

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

PHP Behat-Mink-Selenium пользователи видят этот пост для информации: https://medium.com/@alex.designworks/chromedriver-75-enforces-w3c-standard-breaking-behat-tests-460cad435545 и выпуск GitHub https://github.com/minkphp/MinkSelenium2Driver/issues/293

Начиная с этого поста, «обходной путь» должен использовать Chrome 74 для тех, кто использует Behat-Mink-Selenium.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...