Скриптът Selenium/WebDriver се прекъсва от предупреждение - изключение Съобщение: u'Modal dialog present'

Аз съм сравнително нов в Python/JS, а също и в автоматизираното тестване със Selenium/WebDriver, но постигнах известен напредък!

Сега съм заседнал в една точка и това е наистина разочароващо.

Уебсайтът, който тествам, продава продукти. Успях да накарам скрипта си да навигира произволно и да стигна до страницата за плащане, да попълня фиктивни данни, да изпратя данни с помощта на:

browser.execute_script("document.Form.submit(); return true;")
browser.execute_script("processPayment(); return true;")

Обикновено има бутон Плати сега и щракването върху този елемент води до същото изключение и нямаше начин да щракна върху него OK/Отказ чрез WebDriver (без WebElement), но разбрах, че изпълнявайки този JS код мога да получа покрай него. Моята новозаредена страница (след изпращане на данни и потвърждаване на публикуването й) с потвърждение и всички правилни данни се зарежда, но скриптът на Python е прекъснат и не мога да продължа теста.

Има ли решение за това? Това, което искам да направи, е да игнорира този модален диалог, да изчака да се зареди следващата страница за потвърждение и след това да продължи да намира елементи, да отпечатва техните стойности, да ги съхранява и т.н.

Опитах да използвам:

wait = ui.WebDriverWait(browser,10)
wait.until(lambda browser: browser.title.lower().startswith('Your Receipt'))
print(browser.title)

но скриптът се прекъсва. Съжалявам, ако е отговорено, но не можах да го намеря, освен това съм начинаещ!

Благодаря предварително!

РЕДАКТИРАНЕ:

Го е направил! В моя случай това, което проработи, е, че просто промених малко кода си

browser.execute_script("document.roomBookingForm.submit(); return true;")
alert = browser.switch_to_alert()
alert.dismiss()
browser.execute_script("processPayment(); return true;")

Забележка за начинаещите, че ще трябва да импортирате Alert.

from selenium.webdriver.common.alert import Alert

person tsaulic    schedule 04.06.2012    source източник


Отговори (1)


Забележка за начинаещи (като мен), че ще трябва да импортирате Alert.

from selenium.webdriver.common.alert import Alert

... ... ... (code placeholder)

browser.execute_script("document.roomBookingForm.submit(); return true;")
alert = browser.switch_to_alert()
alert.dismiss()
browser.execute_script("processPayment(); return true;")

току-що добави манипулатора на предупреждения

person tsaulic    schedule 05.06.2012
comment
Разбира се имайте предвид, че alert.dismiss() натиска бутона за отмяна; използвайте alert.accept(), за да натиснете OK. - person Racing Tadpole; 23.10.2013
comment
и браузърът в отговора е екземплярът на webdriver. - person Sinux; 10.11.2015
comment
за изскачащи прозорци за влизане използвайте alert.send_keys(u"user{}pass".format(Keys.TAB)) преди да използвате alert.accept(). Очевидно селенът трябва да направи това, преди това някой използваше win32com.client, за да въведе информацията за вход. Което работи според браузъра на потребителя, но Selenium извежда грешка Modal dialog present за всички find_element повиквания, докато предупреждението не бъде обработено от Selenium. Източник за грешка в GitHub ‹github.com/seleniumhq/selenium- google-code-issue-archive/issues/ - person Brian W; 07.03.2019