Jak wyłączyć w3c w chromedriver, aby rozwiązać błąd nieznany polecenie: nie można wywołać standardowego polecenia innego niż W3C, gdy w W3C

Po wydaniu Chrome w wersji 75 nasze testy nie działają poprawnie. Dają one stacktrace wklejone poniżej. Używamy ruby on rails V. 5.1.6.2 z 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'

Konfiguracja Sterownika:

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:

Udało mi się tymczasowo uruchomić nasze testy używając capabilities = { "chromeOptions" => {'w3c' => false} }.

Po aktualizacji chromedriver, zaczęliśmy otrzymywać błąd " nieznany błąd: DevToolsActivePort plik nie istnieje". Aby rozwiązać ten problem, zaktualizowaliśmy nasz klejnot selenium-webdriver do wersji 3.142.3 i to naprawiło problem, pozwalając nam używać w3c bez żadnych dodatkowych parametrów.

Author: Julie, 2019-06-05

8 answers

Najpierw rozwiązanie

Zgodnie z obietnicą Johna Chena [właściciela - WebDriver dla Google Chrome] wczoraj, nowe wersje ChromeDriver 75.0.3770.90 oraz 76.0.3809.25 zostały wydane i są teraz dostępne na stronie ChromeDriver Downloads . Wersje te zawierają następujące poprawki błędów w poprzednich wydaniach ChromeDriver 75 oraz 76:

  • Naprawiono błąd, który nieprawidłowo odrzucał POST żądania z pustym ciałem w trybie OSS
  • Dodano nowe punkty końcowe do pobierania dziennika Chrome

Dodatkowo wersja 76.0.3809.25 zawiera również następującą zmianę:

  • Dodano polecenie endpoint for is displays w trybie W3C

Migawka E-Mail

75_76


Szczegóły

Aby rozwiązać ten problem, należy wyłączyć w chromedriverze wyłącznik chromedriver.]}
Selenium::WebDriver::Error::UnknownCommandError:
        unknown command: Cannot call non W3C standard command while in W3C mode

Jako obecna implementacja ChromeDriver żąda od klienta sesji zgodnej z W3C.


Ten Komunikat o błędzie sugeruje jednak, że ChromeDriverNie był w stanie wywołać standardowego poleceniainnego niż W3C, podczas gdy w trybie W3Cpodczas inicjowania/spawania nowej sesji WebBrowser, tj. przeglądarki Chrome.

Głównym problemem jest to, gdy klient ChromeDriver żąda sesji zgodnej z W3C {[20]]}, odpowiedź ChromeDriver Nie jest zgodna ze specyfikacją W3C i powoduje błędy w interfejsach API języka. [18]} zgodnie z dyskusją w odpowiedź ChromeDriver w trybie W3C nie jest zgodna ze standardem John Chen (właściciel-WebDriver dla Google Chrome) wspomniany Simon Stewart (twórca-WebDriver) zaktualizował, że:
  • Nowa odpowiedź sesji dla sesji w3c powinna wyglądać następująco:]}
    {
      "value": {
        "sessionId": "some-uuid",
        "capabilities": {
          "browserName": "chrome",
          ...
        }
      }
    }
    
  • [[18]}Ale przy rozpoczynaniu nowego sesja z w3c opcja ustawiona na true w chromeOptions zwrócona odpowiedź wyglądała następująco:
        {
          "sessionId": "af4656c27fb94485b7872e1fc616923a",
          "status": "ok",
          "value": {
            "browserName": "chrome",
            ...
          }
        }
    

Który nie jest ani poprawnie uformowaną odpowiedzią dla protokołu JSON Wire (gdzie "status" byłby liczbą całkowitą), ani poprawnie uformowaną odpowiedzią W3C i bez prawidłowo uformowanej odpowiedzi nie można użyć kompatybilnej z w3c.

This revision and this commit addressed this problem.


This usecase

Prawdopodobnie używasz ChromeDriver v75.x z Chrome v75.x i jeśli nadal widzisz błąd, musisz przejść ExperimentalOption w3c jako true jawnie następująco:

  • Ruby próbka kodu:

    capabilities = { "chromeOptions" => {'w3c' => true} }
    
  • Java próbka kodu:

    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 kod próbka:

    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')
    

Update

Do ChromeDriver v74.x, Chrome i ChromeDriver combo działało domyślnie w trybie w3c, ale wystąpił błąd w chromedriver/server/http_handler.cc. zgodnie ze szczegółami w goog:chromeOptions.W3C = false nie działa dla żądania POST z pustym ciałem :

Metoda HttpHandler::HandleCommand sprawdza wartość stałej kW3CDefault zamiast wartości sesji goog:chromeOptions.w3c. Jako w rezultacie została przerwana obsługa protokołu JSON Wire, gdzie dozwolone są żądania POST z pustym ciałem. Protokół JSON Wire będzie potrzebny do displayed endpoint jest wznawiany w trybie w3c. Należy zauważyć, że W3C WebDriver specification nie zabrania używania "wyświetlonego" punktu końcowego i ta funkcja jest aktywnie używana w niektórych API.

Jako Is Element Displayed polecenie nie jest częścią specyfikacji W3C, ale nadal jest używane przez niektóre API, a jego funkcjonalność może być trudna do powtórzenia w tych API. This Change List [revision i commit ] ponownie włącza to polecenie w trybie W3C, aby ułatwić przejście do trybu W3C.

@John potwierdzili już, że spodziewamy się aktualizacji do ChromeDriver v75. 0 jutro z poprawką.

 22
Author: DebanjanB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-19 21:47:54

Dla ludzi Javascript (szczególnie używam WebdriverIO) upewnij się, że używasz 'GOG:chromeOptions'

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

Else you ' ll get

unknown error: Illegal key values seen in w3c capabilities: [chromeOptions]
 8
Author: bonjonbovi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-18 17:59:47

Po wykonaniu options = Selenium::WebDriver::Chrome::Options.new możesz zrobić options.add_option('w3c', false)

 6
Author: Rajat Verma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-06-07 20:03:37

Mam ten sam problem.

Próbowałem wyłączyć używając capabilities = Selenium::WebDriver::Remote::Capabilities.chrome({ "chromeOptions" => {'w3c' => false} }), ale nie zadziałało.

Potem zmieniłem na capabilities = { "chromeOptions" => {'w3c' => false} } i teraz działa.

Może to ci pomoże.
 4
Author: Sandro Queiroz Jr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-06-05 01:40:51

PHP Behat-Mink-Selenium użytkownicy zobacz ten post dla informacji: https://medium.com/@alex.designworks/chromedriver-75-enforces-w3c-standard-breaking-behat-tests-460cad435545 i problem z Githubem https://github.com/minkphp/MinkSelenium2Driver/issues/293

Od tego postu "obejściem" jest powrót do Chrome 74 dla osób korzystających z Behat-Mink-Selenium.

 0
Author: Phil Davis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-06-07 08:42:16

Tak można to zrobić w Behat z norką: #behat #norka

  Behat\MinkExtension:
    base_url: "your_site_url"
    browser_name: 'chrome'
    goutte: ~
    javascript_session: selenium2
    selenium2:
      wd_host: http://127.0.0.1:4444/wd/hub
      capabilities:
        browser: chrome
        extra_capabilities:
          chromeOptions:
            args: ['--headless', '--disable-gpu']
            w3c: false
 0
Author: Shweta Sharma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-09 13:41:00
{ 
  'platformName':'Android', 
  'platformVersion':'8.0.0',
  'deviceName':'Samsung Galaxy S9',
  'deviceType':'Phone', 
  'nativeWebTap': 'True',
  'browser' : 'Chrome',
  "goog:chromeOptions": {'w3c': False}
}

Użyj opcji goog: chromeOptions, aby ustawić W3C True lub False. na konsoli zobaczysz to samo przechodzenie.

 0
Author: user8672807,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-05 20:39:57

Niedawno zaktualizowałem appium do 1.18, używając chromeDriver w wersji 84, a moja wersja przeglądarki chrome to również 84. Używam biblioteki Appium python do uruchomienia przeglądarki. Moje możliwości są jak poniżej, ale dostaję błąd - "WebDriverException: Message: 'chromeOptions' must be of type object". Proszę dać mi znać, co jest nie tak z moimi możliwościami.

{ 
  'platformName':'Android', 
  'platformVersion':'8.0.0',
  'deviceName':'Samsung Galaxy S9',
  'deviceType':'Phone', 
  'nativeWebTap': 'True',
  'browser' : 'Chrome',
  'chromeOptions' : '{args: [ 'w3c : false']}' 
}
 -1
Author: For Testing,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-27 15:21:41