«Selenium::WebDriver::Error::UnhandledAlertError: открыто неожиданное оповещение», несмотря на использование dismiss_confirm

#ruby-on-rails #selenium #capybara #selenium-chromedriver

#ruby-на-рельсах #selenium #капибара #селен-хромовый преобразователь

Вопрос:

Этот тест не пройден:

 describe 'a confirm modal', :js, driver: :chrome do
  it do
    visit '/test/confirm'
    dismiss_confirm do
      click_link 'Cancel'
    end
  end
end
  

с Selenium::WebDriver::Error::UnhandledAlertError: unexpected alert open ошибкой.

Эта ошибка немедленно завершается ошибкой, как только она попадает в click_link 'Cancel' строку:

 An error occurred in an after hook
  Selenium::WebDriver::Error::UnhandledAlertError: unexpected alert open: {Alert text : Are you sure?}
  (Session info: chrome=53.0.2785.101)
  (Driver info: chromedriver=2.21.371461 (633e689b520b25f3e264a2ede6b74ccc23cb636a),platform=Linux 4.4.0-42-generic x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 1 milliseconds: null
Build info: version: '2.53.0', revision: '35ae25b', time: '2016-03-15 17:00:58'
System info: host: '64c23d07d03c', ip: '172.18.0.6', os.name: 'Linux', os.arch: 'amd64', os.version: '4.4.0-42-generic', java.version: '1.8.0_03-Ubuntu'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities [{applicationCacheEnabled=false, rotatable=false, mobileEmulationEnabled=false, chrome={chromedriverVersion=2.21.371461 (633e689b520b25f3e264a2ede6b74ccc23cb636a), userDataDir=/tmp/.com.google.Chrome.nJ0sj0}, takesHeapSnapshot=true, databaseEnabled=false, handlesAlerts=true, hasTouchScreen=false, version=53.0.2785.101, platform=LINUX, browserConnectionEnabled=false, nativeEvents=true, acceptSslCerts=true, locationContextEnabled=true, webStorageEnabled=true, browserName=chrome, takesScreenshot=true, javascriptEnabled=true, cssSelectorsEnabled=true}]
Session ID: 12b4869246e45555e3456370e74ad536 (org.openqa.selenium.UnhandledAlertException)
  occurred at [remote server] sun.reflect.GeneratedConstructorAccessor31():-1:in `newInstance'
  

Я вижу в окне Chrome, что он все еще ждет, когда я нажму OK или Cancel.

Почему это сбой? Как мне заставить его отклонить подтверждение вместо ошибки?

Когда я просматриваю код с помощью byebug , я вижу, что dismiss_modal это даже не доходит до той части, где он пытается найти модальное значение и отклонить. Он выдает ошибку сразу, когда попадает в click_link , чего, как я понимаю, не должно произойти (в противном случае для этого dismiss_modal был бы rescue установлен блок):

 [229, 238] in /usr/local/bundle/gems/capybara-2.10.1/lib/capybara/selenium/driver.rb
   229:     modal.accept
   230:     message
   231:   end
   232: 
   233:   def dismiss_modal(type, options={}, amp;blk)
=> 234:     yield if block_given?
   235:     modal = find_modal(options)
   236:     message = modal.text
   237:     modal.dismiss
   238:     message
(byebug) s

[3, 12] in /app/spec/features/testing_basics_spec.rb
    3: describe 'a confirm modal', :js, driver: :chrome do
    4:   it do
    5:     visit '/test/confirm'
    6:     byebug
    7:     dismiss_confirm do
=>  8:       click_link 'Cancel'
    9:     end
  

Сервер selenium запущен в контейнере docker из selenium/standalone-chrome-debug изображения.

Драйвер настроен с:

 Capybara.register_driver :chrome do |app|
  Capybara::Selenium::Driver.new(
    app,
    browser:                :remote,
    url:                    "http://#{ENV['CHROME_WEBDRIVER_HOST']}:4444/wd/hub",
    desired_capabilities:   :chrome
  )
end
  

Он использует текущие версии драгоценных камней (насколько я знаю):

   * capybara (2.10.1)
  * selenium-webdriver (2.53.4)
  

Это шаблон Rails, с которым он взаимодействует ( app/views/confirm.html.haml ):


= link_to 'Cancel', '#', :confirm => 'Are you sure?'

Обновление: Спасибо @TomWalpole и @SaurabhGaur за предположение, что это может быть связано с использованием более старой версии chromedriver.

Похоже, я не обновлял свое selenium/standalone-chrome-debug изображение в течение нескольких недель (хотя я удивлен, что 5 недель — это настолько старый срок, что это могло вызвать проблему).

Перед обновлением…

 selenium/standalone-chrome-debug latest 84d9c94a042a 5 weeks ago         844.8 MB

root@65a9cd48f684:/# chromedriver --version                                                                                                                                                                
ChromeDriver 2.21.371461 (633e689b520b25f3e264a2ede6b74ccc23cb636a)
  

После обновления…

 selenium/standalone-chrome-debug latest df941c594b0a 2 days ago          865.3 MB

root@6800a351c182:/# chromedriver --version                  
ChromeDriver 2.24.417424 (c5c5ea873213ee72e3d0929b47482681555340c3)
  

И это работает!

Комментарии:

1. Обновите свой chromedriver до 2.24 — если это не исправит проблему, нам нужно знать, что открывает модальное оповещение, поскольку похоже, что оно уже открыто, прежде чем вы нажмете «Отмена»

2. Какую версию chromedriver вы используете??

3. @SaurabhGaur это в журнале — chromedriver=2.21.371461

4. @TomWalpole да, возможно, это проблема, вы правы, chromedriver должен быть upgrade >= 2.22 потому что я также сталкивался с такой же проблемой ранее с chromedriver 2.21 . Спасибо

5. @TomWalpole Спасибо за предложение! Похоже, это решило проблему. Похоже, мой образ docker просто не обновлялся в течение нескольких недель. Если вы хотите представить это в качестве ответа, я мог бы принять как решение. Спасибо! Также обновил вопрос тем, что я нашел на основе вашего предложения.

Ответ №1:

При использовании selenium-webdriver с Chrome важно обновлять chromedriver при обновлении самого Chrome. В вашем журнале отображается версия chromedriver 2.21, но последняя версия 2.24 — обновите ее, и ваши проблемы должны исчезнуть.