Проверьте, существует ли какое-либо предупреждение, используя селен с python
Я пытаюсь написать тест с селеном на языке Python для веб-страницы, которая управляет пользователями. На этой странице кто-то может добавить роль для пользователей, и если при ее добавлении существует роль, появляется предупреждение. Я не знаю, является ли это предупреждение JavaScript или элементом веб-страницы. Я хочу автоматически проверить наличие оповещения, потому что проверка роли в списке тратит впустую время и несет огромную нагрузку. Я попробовал это:
browser = webdriver.Firefox()
browser.get("url")
browser.find_the_element_by_id("add_button").click()
try:
alert = browser.switch_to_alert()
alert.accept()
print "alert accepted"
except:
print "no alert"
Но это не сработало, и я получил "UnexpectedAlertPresentException". Я также попробовал это:
browser = webdriver.Firefox()
browser.get("url")
browser.find_the_element_by_id("add_button").click()
s = set(browser.window_handles)
s.remove(browser.current_window_handle)
browser.switch_to_window(s.pop())
Но я получил то же исключение. Кроме того, я попытался получить доступ к предупреждению с помощью firebug, чтобы проверить, могу ли я получить доступ к его свойствам, но щелчок правой кнопкой был отключен. Мне нужно решение очень быстро, даже на других языках. Я могу понять подход в любом случае. Я буду признателен за любую помощь.
5 ответов
Что я делаю, так это устанавливаю условную задержку с WebDriverWait непосредственно перед тем моментом, когда я ожидаю увидеть предупреждение, а затем переключаюсь на него, например так:
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
browser = webdriver.Firefox()
browser.get("url")
browser.find_the_element_by_id("add_button").click()
try:
WebDriverWait(browser, 3).until(EC.alert_is_present(),
'Timed out waiting for PA creation ' +
'confirmation popup to appear.')
alert = browser.switch_to.alert
alert.accept()
print("alert accepted")
except TimeoutException:
print("no alert")
WebDriverWait(browser,
3)
будет ждать не менее 3 секунд, пока не появится поддерживаемое оповещение.
Я знаю, что это слишком поздний ответ, и вы решили этот вопрос несколько лет назад, но я все еще хочу опубликовать свой анализ и результаты для возможного использования будущими читателями.
Я работаю над проектом по созданию веб-сайта Django, и в настоящее время есть ошибка, которая, как только открывается определенная веб-страница, появляется сообщение об ошибке. Моя среда это:
- Джанго 1,8
- Python 2.7
- Селен 2.46.0
Я прочитал здесь документ о "UnexpectedAlertPresentException", и там говорится:
Брошенный, когда неожиданное предупреждение появляется.
Обычно вызывается, когда ожидаемый модал блокирует форму веб-драйвера, выполняя любые другие команды.
Я проверил в своем проекте, и мои выводы:
- Когда окно предупреждения вверх,
find_element_by_X
методы могут быть успешными. - Click() или send_keys() завершатся с ошибкой "UnexpectedAlertPresentException".
Поэтому я думаю, что try...catch
блок не работает, потому что "UnexpectedAlertPresentException" выбрасывается в строке
browser.find_the_element_by_id("add_button").click()
Это также означает, что окно оповещения может появиться, как только веб-страница будет открыта этой строкой:
browser.get("url")
Другими словами, может быть проблема, скрытая глубже, которая вызвала окно предупреждения, как только страница открыта. Возможно, вам придется сначала решить эту проблему.
Другое дело: при условии, что после этой строки появилось окно с предупреждением:
browser.find_the_element_by_id("add_button").click()
Тогда alert = browser.switch_to_alert()
должен хорошо работать без исключений, что противоречит тому, что вы здесь описываете. Это также заставило меня думать, что проблема еще в browser.get("url")
линия.
Я не очень уверен, как выбранное решение помогло вам решить проблему, потому что мой анализ показывает, что проблема находится в другом месте. Во всяком случае, я не прошу перевыбора принятого решения. Я просто хочу поделиться своими мыслями для будущих читателей. Прошу прощения за то, что я упустил из виду или неправильно понял что-то в этом вопросе, что привело к тому, что мой анализ оказался неверным (и который тратит ваше время на чтение этого:-).
Попробуйте это короткое решение, используя явный метод ожидания.
try:
wait.until(EC.alert_is_present())
driver.switch_to.alert.accept()
print("Alert accepted")
except:
print("no Alert found")
В Java мы делаем это так
WebDriverWait wait3 = new WebDriverWait(driver, 7000);
wait3.until(ExpectedConditions.alertIsPresent());
driver.switchTo().alert().accept();
Он неявно будет ожидать оповещения, если оповещение отсутствует, он выдаст "Предупреждение не присутствует, за исключением", который мы можем перехватить и продвинуться вперед.
Надеюсь, поможет.
alert = self.driver.switch_to.alert
if alert.is_displayed():
alert.accept()