Подтвердить что ты не робот

Проверьте, существует ли какое-либо предупреждение с использованием селена с питоном

Я пытаюсь написать тест с селеном на языке 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, чтобы проверить, могу ли я получить доступ к его свойствам, но щелчок правой кнопкой мыши был отключен. Мне нужно решение очень быстро, даже на других языках. Я все равно понимаю подход. Я буду признателен за любую помощь.

4b9b3361

Ответ 1

Что я делаю, так это устанавливаю условную задержку с 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_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 секунд, пока не появится поддерживаемое предупреждение.

Ответ 2

Я знаю, что это слишком поздний ответ, и вы решили этот вопрос несколько лет назад, но я все еще хочу опубликовать свой анализ и результаты для возможного использования будущими читателями.

Я работаю над проектом по разработке веб-сайта Django, и в настоящее время существует ошибка, которая заключается в том, что после открытия определенной веб-страницы появляется сообщение об ошибке. Моя среда это:

  • Джанго 1,8
  • Python 2.7
  • Селен 2.46.0

Я прочитал здесь документ о "UnexpectedAlertPresentException", и он говорит:

Брошенный, когда неожиданное предупреждение появляется.

Обычно вызывается, когда ожидаемый модал блокирует форму веб-драйвера, выполняя любые другие команды.

Я проверил в своем проекте, и мои выводы:

  • Когда окно предупреждения find_element_by_X методы 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").

Я не очень уверен, как выбранное решение помогло вам решить проблему, потому что мой анализ показывает, что проблема находится в другом месте. Во всяком случае, я не прошу перевыбора принятого решения. Я просто хочу поделиться своими мыслями для будущих читателей. Приносим свои извинения в случае, если я что-то упустил или неправильно понял в этом вопросе, из-за которого мой анализ оказался неверным (и который тратит ваше время на чтение этого :-).

Ответ 3

В Java мы делаем это так

WebDriverWait wait3 = new WebDriverWait(driver, 7000);
wait3.until(ExpectedConditions.alertIsPresent());
driver.switchTo().alert().accept();

Он неявно будет ожидать оповещения, если оповещение отсутствует, он выдаст "Предупреждение не присутствует, за исключением", который мы можем перехватить и продвинуться вперед.

Надеюсь, поможет.

Ответ 4

alert = self.driver.switch_to.alert
    if alert.is_displayed():
        alert.accept()