Appium Python WebDriverWait wait.until(expected_conditions.alert_is_present()) случайный сбой

У меня есть тестовый класс Appium, тестирующий приложение iOS с двумя почти идентичными тестами внутри:

def test_fail(self):
    self.log_in('invalid_user_1')
    self.wait.until(expected_conditions.alert_is_present())
    alert = self.driver.switch_to.alert
    assert "Your mobile number is not registered with us" in alert.text
    alert.accept()

def test_normal(self):
    self.log_in('empty')
    self.wait.until(expected_conditions.alert_is_present())
    alert = self.driver.switch_to.alert
    assert 'Please enter mobile number' in alert.text
    alert.accept()

Когда я запускаю тест test_fail (он запускается первым перед test_normal), он всегда не может поймать диалоговое окно с предупреждением об ошибке:

WebDriverException: Сообщение: при обработке команды произошла неизвестная ошибка на стороне сервера. Исходная ошибка: была предпринята попытка работы с модальным диалоговым окном, когда оно не было открыто.

Однако *test_normal работает. Я попытался закомментировать test_normal, test_fail завершился ошибкой с тем же сообщением.

Затем я пытаюсь закомментировать test_fail, но на этот раз test_normal сработает. Итак, по какой-то странной причине test_fail просто не работает с self.wait.until(expected_conditions.alert_is_present()).

Однако, если я заменю строку test_fail test wait.until:

self.wait.until(expected_conditions.alert_is_present())

с:

self.wait_for('OK')

Тогда бы все работало.

Self.wait объявлен в def setUp(self) self.wait = WebDriverWait(self.driver, 120)

Я запускаю Appium 1.7.2 (Appium GUI 1.4.0) в Mac OS X. Тест iOS выполняется на симуляторе iPhone 7 с OS 11.2.

Трассировка стека ошибок:

Error
Traceback (most recent call last):
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/case.py", line 331, in run
    testMethod()
  File "/Users/steve/Desktop/Temp/Appium/Ding_ios_aws/ios_aws/tests/test_invalid_login.py", line 16, in test_invalid_user_login
    self.wait.until(expected_conditions.alert_is_present())
  File "/Users/steve/venv/Appium/lib/python2.7/site-packages/selenium/webdriver/support/wait.py", line 71, in until
    value = method(self._driver)
  File "/Users/steve/venv/Appium/lib/python2.7/site-packages/selenium/webdriver/support/expected_conditions.py", line 387, in __call__
    alert = driver.switch_to.alert
  File "/Users/steve/venv/Appium/lib/python2.7/site-packages/selenium/webdriver/remote/switch_to.py", line 55, in alert
    alert.text
  File "/Users/steve/venv/Appium/lib/python2.7/site-packages/selenium/webdriver/common/alert.py", line 69, in text
    return self.driver.execute(Command.GET_ALERT_TEXT)["value"]
  File "/Users/steve/venv/Appium/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 312, in execute
    self.error_handler.check_response(response)
  File "/Users/steve/venv/Appium/lib/python2.7/site-packages/appium/webdriver/errorhandler.py", line 29, in check_response
    raise wde
WebDriverException: Message: An unknown server-side error occurred while processing the command. Original error: An attempt was made to operate on a modal dialog when one was not open.

Может ли кто-нибудь помочь мне понять, что происходит?

изображение диалогового окна test_normal изображение диалога test_normal

Изображение диалогового окна test_fail изображение диалога test_fail


person T1000    schedule 16.03.2018    source источник
comment
не могли бы вы поделиться скриншотами обоих предупреждений?   -  person Naveen Kumar R B    schedule 16.03.2018
comment
@NaveenKumarRB Привет, я обновил скриншоты   -  person T1000    schedule 16.03.2018
comment
ошибка вылетает после ожидания 120 секунд или сразу?   -  person Naveen Kumar R B    schedule 16.03.2018
comment
@NaveenKumarRB немедленно. Я попытался добавить еще один self.wait = WebDriverWait(self.driver, 120) в test_fail, чтобы попытаться сбросить ожидание (хотя не уверен, что это так работает), но это не помогло.   -  person T1000    schedule 16.03.2018
comment
Не могли бы вы добавить полную трассировку стека? Я думаю, что ошибка в alert = self.driver.switch_to.alert. попробуйте добавить 1-2 секунды сна перед этим и попробуйте.   -  person Naveen Kumar R B    schedule 16.03.2018
comment
@NaveenKumarRB Я обновил трассировку стека в сообщении.   -  person T1000    schedule 16.03.2018
comment
@NaveenKumarRB добавление сна перед оповещением = self.driver.switch_to.alert не помогло, но добавление его перед self.wait.until(expected_conditions.alert_is_present()) работает. Я не понимаю.   -  person T1000    schedule 16.03.2018


Ответы (1)


Скорее всего, вы столкнулись с ошибкой https://github.com/appium/appium/issues/10286. .

Ошибка: при первом пинге/проверке самого алерта, если алерта нет, Appium выдает исключение, не дожидаясь заданного времени.

Эта ошибка зарегистрирована недавно (15 дней назад). попробуйте последнюю версию. Я думаю, что это исправлено в последней бета-версии.

Также см. https://github.com/facebook/WebDriverAgent/issues/857, в котором говорится, что это проблема Appium, но не WebDriver.

Временное решение: добавьте 1-3 секунды сна, чтобы убедиться, что оповещение присутствует перед проверкой явного условия.

person Naveen Kumar R B    schedule 16.03.2018
comment
Спасибо. Я также только что нашел эту ссылку около 30 минут назад. Это точно проблема. Затем я пытаюсь поймать WebDrierException и добавить sleep(1) и повторить попытку wait.until(expected_conditions.alert_is_present()), и это работает. - person T1000; 16.03.2018