Selenium не может найти элемент по идентификатору или xpath - PullRequest
1 голос
/ 23 апреля 2020

Я пытаюсь написать скрипт на python (3.7.3) для автоматизации входа на веб-сайт с помощью Selenium в первый раз. Я практиковался с некоторыми базовыми примерами и просмотрел документацию Selenium. Пока все хорошо. Но когда я пробую это на веб-сайте по своему выбору; вещи go неправильно ...

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

Python код

from selenium import webdriver

path = r"C:\Users\path\chromedriver.exe"
driver = webdriver.Chrome(path)

driver.get ("https://a website")
driver.find_element_by_id("login-username").send_keys(login)
driver.find_element_by_id("login-sign-in-button").click()

Сообщение об ошибке

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"[id="login-username"]"}

HTML код поля имени пользователя:

<input id="login-username" type="text" name="username" placeholder="Username" msd-placeholder="Username" class="margin-bottom form-control ng-pristine ng-empty ng-invalid ng-invalid-required ng-touched" ng-model="formData.username" dh-autofocus="" required="">

Поиск элемента с xpath. Я изменил "" скобки вокруг идентификатора на '', чтобы избежать ошибок.

driver.find_element_by_xpath("//*[@id='login-username']").send_keys(login)

И, наконец, я пробовал длинный xpath

driver.find_element_by_xpath("/html/body/ui-view/ui-view/div/div[1]/div[1]/ui-view/div/div[1]/div/div[2]/form/div[1]/div/input").send_keys(login)

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

EDIT 1 Добавлена ​​функция ожидания. Код работает сейчас

driver.get ("https://a website")
element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "login-username")))
driver.find_element_by_id("login-username").send_keys(login)

1 Ответ

1 голос
/ 25 апреля 2020

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

driver.get ("https://a website")
element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "login-username")))
driver.find_element_by_id("login-username").send_keys(login)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...