Python + Selenium: проверьте автоматическое закрытие уведомления, которое не принадлежит источнику страницы - PullRequest
0 голосов
/ 04 февраля 2020

Существует тег выбора с обязательным параметром (required="required):

<select name="doc[]" id="doc" multiple="multiple" size="18" required="required">
  <option value="1">А.2 Проверочный перечень для ФИ плана сертификации ПО</option>
  <option value="2">А.3 Проверочный перечень для ФИ плана разработки ПО</option>
  ...

Цель этого параметра - запретить нажатие кнопки (ей) фиксации, если ничего не выбрано в множественном выборе. тег. Это выглядит так:

chrome notification

Мне нужно проверить, отображается ли какое-либо предупреждение / уведомление / всплывающее окно с использованием Selenium + Python. Предупреждение не является стандартным окном, которое можно увидеть в HTML и / или переключиться на него, т. Е. Ничего не происходит с источником HTML, элемент не может быть проверен, он отображается только в течение 5 секунд, а затем исчезает.

Он выглядит одинаково в разных браузерах (первое изображение выше, из Chrome, то же самое из Opera), это из Firefox:

firefox

И IE: IE

MS Edge не отображает никаких сообщений.

Также отслеживается с помощью Chrome / Firefox devtools - ничего не происходит в консоли это тоже не анимация (chrome F12 - меню точек - больше инструментов - анимация).

Так как я могу проверить наличие таких уведомлений?

Ответы [ 2 ]

1 голос
/ 04 февраля 2020

Это проверка формы :

element = driver.find_element_by_id('doc')

# boolean
is_valid = drive.execute_script('return arguments[0].validity.valid', element)

# get validation message
validation_message = element.get_attribute('validationMessage')
0 голосов
/ 04 февраля 2020

Всплывающее окно , на которое вы ссылаетесь, является результатом метода Constraint API's element.setCustomValidity () .

Примечание : HTML5 Проверка ограничений не устраняет необходимость проверки на стороне сервера. Несмотря на то, что следует ожидать гораздо меньше недопустимых запросов форм, недопустимые запросы могут отправляться несовместимыми браузерами (например, браузерами без HTML5 и без JavaScript) или плохими парнями, пытающимися обмануть ваше веб-приложение. Следовательно, как и в случае HTML4, вам также необходимо проверить входные ограничения на стороне сервера таким образом, чтобы это соответствовало тому, что делается на стороне клиента.


Решение

Чтобы получить текст, полученный в результате использования метода element.setCustomValidity(), вам нужно вызвать WebDriverWait для element_to_be_clickable() и использовать любую из следующих стратегий локатора :

  • Использование CSS_SELECTOR:

    print(WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "select#doc[name^='doc']"))).get_attribute("validationMessage"))
    
  • Использование XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//select[@id='doc' and starts-with(@name, 'doc')]"))).click()
    
  • Примечание : необходимо добавить следующие операции импорта:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...