Как отключить w3c в chromedriver для устранения ошибки неизвестной команды: Невозможно вызвать стандартную команду, отличную от W3C, в то время как в W3C
С только что выпущенной версией Chrome 75 наши тесты перестали работать должным образом. Они дают трассировку стека, вставленную ниже. Мы используем ruby on rails v. 5.1.6.2 с rspec, selenium-webdriver 3.8.0.
Трассировки стека:
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
ОБНОВИТЬ:
Я смог заставить наши тесты работать временно, используя capabilities = { "chromeOptions" => {'w3c' => false} }
,
После обновления chromedriver мы начали получать сообщение об ошибке "неизвестная ошибка: файл DevToolsActivePort не существует". Чтобы решить эту проблему, мы обновили наш драгоценный камень selenium-webdriver до 3.142.3, и это исправило проблему, позволив нам использовать w3c без каких-либо дополнительных параметров.
7 ответов
Первое решение
Как обещал Джон Чен [владелец - 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
Снимок электронной почты
Отключать лучшие практики будет w3c
в chromedriver для устранения ошибки:
Selenium::WebDriver::Error::UnknownCommandError:
unknown command: Cannot call non W3C standard command while in W3C mode
поскольку текущая реализация ChromeDriver запрашивает W3C-совместимый сеанс для клиента.
Однако это сообщение об ошибке означает, что ChromeDriver не смог вызвать стандартную команду, отличную от W3C, в то время как в режиме W3C он инициировал / порождал новый WebBrowser, то есть сеанс Chrome Browser.
Основная проблема заключается в том, что когда клиент 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 / 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. Этот список изменений [ revision and commit ] повторно включает эту команду в режиме W3C, чтобы облегчить переход в режим W3C.
@John уже подтвердил, что мы ожидаем обновления ChromeDriver v75.0 завтра с исправлением.
Для людей Javascript (я специально использую WebdriverIO) убедитесь, что вы используете 'goog:chromeOptions'
capabilities: {
browserName: 'chrome',
'goog:chromeOptions': {
'w3c': false
}
}
Иначе вы получите
unknown error: Illegal key values seen in w3c capabilities: [chromeOptions]
После выполнения options = Selenium::WebDriver::Chrome::Options.new
ты можешь сделать options.add_option('w3c', false)
Я столкнулся с той же проблемой.
Я пытался отключить использование capabilities = Selenium::WebDriver::Remote::Capabilities.chrome({ "chromeOptions" => {'w3c' => false} })
но это не сработало.
Затем я перешел на capabilities = { "chromeOptions" => {'w3c' => false} }
и теперь это работает.
Может, это поможет тебе.
Вот как это можно сделать в Behat с Mink: #behat #mink
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
Пользователи 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.
Я думаю, что стоит также связать эту ветку. Еще одна проблема с переполнением стека
Я адресую шаги там, чтобы решить эту ошибку для PHP Selenium 2 TestCase
{
'platformName':'Android',
'platformVersion':'8.0.0',
'deviceName':'Samsung Galaxy S9',
'deviceType':'Phone',
'nativeWebTap': 'True',
'browser' : 'Chrome',
"goog:chromeOptions": {'w3c': False}
}
используйте параметры goog:chromeOptions, чтобы установить w3c True или False. на консоли вы увидите то же самое.
Недавно я обновил appium до 1.18, используя chromeDriver версии 84, и моя версия браузера Chrome тоже 84. Я использую библиотеку appium python для запуска браузера. Мои возможности указаны ниже, но я получаю сообщение об ошибке -"WebDriverException: Сообщение: 'chromeOptions' должно быть объекта типа". Пожалуйста, дайте мне знать, что не так с моими возможностями.
{
'platformName':'Android',
'platformVersion':'8.0.0',
'deviceName':'Samsung Galaxy S9',
'deviceType':'Phone',
'nativeWebTap': 'True',
'browser' : 'Chrome',
'chromeOptions' : '{args: [ 'w3c : false']}'
}