Selenium Невозможно найти элемент несколько раз в моей программе - PullRequest
0 голосов
/ 20 января 2020

Я использую селен для ввода некоторых данных в поле. Дело в том, что моя программа много раз перебирает это поле, и некоторые из них возвращают следующую ошибку. Я не уверен, что вызывает это, поскольку у него нет стандартного образца поведения. Я пытался дифференцировать метод find_elenemt всеми возможными способами find_element, но я получаю те же результаты. Это ошибка:

selenium.common.exceptions.NoSuchElementException: Сообщение: нет такого элемента: невозможно найти элемент: {"method": "css selector" , "селектор": "[name =" username "]"}

И это блок, ответственный за ошибку:

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Field Completion~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
email = emailgen()
time.sleep(0.1)
mail = driver.find_element_by_name('email').send_keys(email)
driver.find_element_by_class_name('next-button').click()
time.sleep(0.3)
driver.find_element_by_xpath("/html/body/div[3]/div/div/div[2]/div[1]/form/div[1]/div[2]/select/option[9]").click()
driver.find_element_by_xpath("//select[@name='dob-month']//option[3]").click()
driver.find_element_by_xpath("//select[@name='dob-year']//option[contains(text(),'1993')]").click()
driver.find_element_by_xpath("//button[contains(text(),'next')]").click()
tempuser = email.split('@')[0]
temppass = passwordgen()
time.sleep(0.5)
print('Username = ', tempuser)
print('Password = ', temppass)
combocr()
time.sleep(0.5)
driver.find_element_by_name('username').send_keys(tempuser)
driver.find_element_by_name('password').send_keys(temppass)
driver.find_element_by_name('confirm_password').send_keys(temppass)
driver.find_element_by_css_selector('#root > div > div > div.registration-component.scene-component.mounted > div.scene-content > form > div:nth-child(4) > label > div').click()
driver.find_element_by_css_selector("#root > div > div > div.registration-component.scene-component.mounted > div.scene-content > form > div.next-button > button").click()
print('Acquiring Token..')
time.sleep(1)

1 Ответ

3 голосов
/ 20 января 2020

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

Я бы изменил эти три строки:

email = emailgen()
time.sleep(0.1)
mail = driver.find_element_by_name('email').send_keys(email)

Для этого:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# add the above imports

email = emailgen()
mail = WebDriverWait(driver, 15).until(EC.presence_of_element_located((By.NAME, 'email')))
mail.send_keys(email)

Мы заменяем time.sleep() на WebDriverWait в поле электронной почты, чтобы убедиться, что оно полностью загружено перед его обнаружением. time.sleep() будет каждый раз ждать одинаковое количество времени, что не всегда достаточно для загрузки страницы. WebDriverWait выполняет точное время ожидания, необходимое для загрузки элемента, до 15 секунд. Надеюсь, это исправит ваши периодически возникающие ошибки.

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