Python - Selenium - получить родительский класс

У меня есть сайт http://demoqa.com/registration/

Я пытался проверить, что когда пользователь нажимает, а затем щелкает обязательное поле, такое как имя пользователя или номер телефона, появляется сообщение об ошибке «Обязательное поле», когда данные не были введены.

Кто-нибудь знает, как это проверить? я подумал

phone = self.driver.find_element_by_xpath("//div[contains(.,'Phone Number')]")

а затем из этого, используя что-то вроде getError = phone.find_element_by_xpath () и используя (..), чтобы попытаться перейти к родительскому классу, но безуспешно!

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

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

Спасибо!

Дополнительная информация:

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

<div class = "fieldset">
    <label class = "" for = "phone_9">Phone Number</label>
    <input id = "phone_9" class = "input_fields piereg_validate[required,custom[phone_international]]" type = "text" value = "" placeholder = "" name = "phone_9">
</div>


<div class = "fieldset error">
    <label class = "" for = "phone_9">Phone Number</label>
    <input id = "phone_9" class = "input_fields 
 piereg_validate[required,custom[phone_international]]" type = "text" value = "" 
 placeholder = "" name = "phone_9">
    <div class = "legend_txt">
        <span class = "legend error">* This field is required</span>
    </div>
 </div>

Не могли бы вы обновить вопрос с помощью пробных версий кода?

DebanjanB 15.03.2018 20:54

Привет, @DebanjanB, у меня действительно мало, потому что я новичок в python, обычно я пишу на C#. Вот код, который я упомянул, пытаясь вернуться к классу temp = self.phone.find_element_by_xpath (".// ancestor :: tr")

agleno 15.03.2018 21:17
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
2 438
2

Ответы 2

Попробуйте использовать приведенный ниже фрагмент кода:

from selenium.common.exceptions import NoSuchElementException

error = "* This field is required"
phone = driver.find_element_by_xpath("//div[label='Phone Number']")
phone_input = phone.find_element_by_tag_name("input")
phone_label = phone.find_element_by_tag_name("label")
phone_input.click()
phone_label.click()
try:
    phone.find_element_by_xpath(".//span[@class='legend error' and .='%s']" % error)
except NoSuchElementException:
    print("No error displayed")

Это должно позволить вам щелкнуть внутренний ввод, внешний ввод и проверить, появляется ли ошибка.

Если вам нужно сделать утверждение:

result = True
try:
    phone.find_element_by_xpath(".//span[@class='legend error' and .='%s']" % error)
except NoSuchElementException:
    result = False
assert result, "No error displayed"

У меня есть решение * я думаю

видя, как изменяется "имя класса div" при появлении требуемого сообщения, у меня есть решение. Сначала я нахожу элемент, получаю его имя родителей, поднявшись на один уровень с помощью (..), проверяю, что он должен называться «fieldset». Я думаю вызвать сообщение об ошибке и повторить процесс, но убедитесь, что "fieldset" изменился на "fieldset error"

getElementBase = self.driver.find_element_by_id('phone_9')
getElementClassRoot = getElementBase.find_element_by_xpath('..')
getElementClassRootName = getElementClassRoot.get_attribute('class')

Хороший. Но учтите, что вы должны быть уверены, что приложение работает правильно, и если имя класса "error" добавлено к родительскому div, это на самом деле означает, что span с отображаемым сообщением об ошибке ... Потому что, если есть ошибка - вы можете ее пропустить ... ИМХО, лучше проверить внешний вид элемента в DOM и, кроме того, сделайте утверждение типа assert element.is_displayed()

Andersson 15.03.2018 22:21

Хорошая точка зрения! @Andersson Я думаю, что включу в тест оба фрагмента кода, спасибо за вашу помощь

agleno 15.03.2018 22:23

Другие вопросы по теме