Selenium WebDriver не находит элемент, используя CSS селектор и атрибут данных - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть элемент ввода HTML для имени при регистрации.

<div class="form-group" data-test="signup-form-first-name">
    <label for="first-name">First Name</label>
    <input type="text" id="first-name" name="first-name" autocomplete="given-name" class="fbkr-input gray error" value="" background-repeat: no-repeat; background-attachment: scroll; background-size: 16px 18px; background-position: 98% 50%; cursor: pointer;">
    <div aria-live="polite" class="label label-danger">
        First Name is required.
        </div>
</div>

Элемент с классом опасности-метки виден только в случае ошибки и пустого поля. Я пытаюсь проверить, является ли этот элемент видимым при тестировании потока регистрации, но каждый раз, когда я пытаюсь это сделать, он терпит неудачу. Я попытался изменить скрипт, чтобы он использовал только класс (.label-danger), но, увы, все равно ничего. Вот код, с которым я пытаюсь это сделать.

    def is_element_error_label_visible(self, element_data_attribute: str) -> bool:
        try:
            element_present = 
            expected_conditions.presence_of_element_located(
                (By.CSS_SELECTOR, f". 
            {self._build_data_attribute(element_data_attribute)} .label-danger"))
            WebDriverWait(self.remote_web_driver, 
            15).until(element_present)
        except NoSuchElementException:
            return False
        return True

Значение, которое

f"{self._build_data_attribute(element_data_attribute)} .label-danger"))

возвращает: [data-test = "signup-form-first- name "] .label-danger

Это неправильный способ получить элемент с помощью селектора CSS? Или есть гораздо более простой способ для этого. Пожалуйста, помните, что я не хочу использовать xPath, так как мне нравится поддерживать мой код в чистоте, поэтому я использую атрибут data-test .

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

Я не знаком с python, чтобы предоставить фрагмент кода. Но я бы использовал частичный CSS селектор соответствия для этой ситуации. Пожалуйста, используйте его, если применимо только.

div[class*="label-danger"]
0 голосов
/ 27 апреля 2020

Попробуйте воспользоваться следующим css селектором.

expected_conditions.presence_of_element_located((By.CSS_SELECTOR, ".label-danger"))

Обновление: пока отображается автоматизация, вам нужно нажать кнопку Sign_up, чтобы увидеть ошибку без ввода данных.

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://fishingbooker.com/")
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.CSS_SELECTOR,"a.btn[href*='signup']"))).click()
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.CSS_SELECTOR,"button.fbkr-button.yellow"))).click()
try:
    print(WebDriverWait(driver,10).until(EC.presence_of_element_located((By.CSS_SELECTOR,"#first-name + .label-danger"))).text)
except:
    print("No such element found")

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...