Проверьте, существует ли какое-либо предупреждение, используя селен с 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()
Другие вопросы по тегам