Селен - Не могу найти элементы, которые на 100% существуют на сайте - PullRequest
0 голосов
/ 26 сентября 2019

Я делаю сторонний проект для развлечения, чтобы автоматизировать сайт https://10fastfingers.com/, чтобы Selenium автоматически завершил все достижения сайта.Вы можете найти мой текущий код в моем хранилище: https://github.com/jasperan/pyfastfingers

Однако я столкнулся с проблемой со страницей входа:

https://10fastfingers.com/login

Селен не позволяетЯ могу сразу найти следующие теги HTML, соответствующие значения xpath которых представлены ниже:

//*[@id="UserEmail"]
[//*[@id="UserPassword"]

Кажется, что веб-сайт не загружает их правильно с первого раза, потому что даже когда я проверяю этивручную (с помощью моего собственного веб-клиента, Firefox, Chrome или даже Chromium, но запущенного мной ...) я автоматически перенаправляюсь к его прародителю:

/html/body

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

Однако программно я не могу этого сделать.Независимо от того, сколько раз я пытаюсь найти элемент, он не находит его должным образом, каждый раз выдает следующее исключение:

 File "pyfastfingers.py", line 112, in <module>
   main()
 File "pyfastfingers.py", line 100, in main
   do_login(driver)
 File "pyfastfingers.py", line 74, in do_login
   password = driver.find_element_by_xpath('[//*[@id="UserPassword"]')
 File "/home/j/.local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 394, in find_element_by_xpath
   return self.find_element(by=By.XPATH, value=xpath)
 File "/home/j/.local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 978, in find_element
   'value': value})['value']
 File "/home/j/.local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
   self.error_handler.check_response(response)
 File "/home/j/.local/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
   raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.InvalidSelectorException: Message: invalid selector: Unable to locate an element with the xpath expression [//*[@id="UserPassword"] because of the following error:
SyntaxError: Failed to execute 'evaluate' on 'Document': The string '[//*[@id="UserPassword"]' is not a valid XPath expression.
 (Session info: chrome=74.0.3729.169)
 (Driver info: chromedriver=74.0.3729.6 (255758eccf3d244491b8a1317aa76e1ce10d57e9-refs/branch-heads/3729@{#29}),platform=Linux 4.18.0-21-generic x86_64)

Вот некоторый код, который соответствует моей функции входа в систему:

    driver.get('https://10fastfingers.com/login')

    placeholder = driver.find_element_by_xpath('/html/body')
    email = driver.find_element_by_xpath('//*[@id="UserEmail"]')
    password = driver.find_element_by_xpath('[//*[@id="UserPassword"]')
    email.send_keys(os.environ['FINGERS_EMAIL'])
    password.send_keys(os.environ['FINGERS_PASSWORD'])
    login_button = driver.find_element_by_id('login-form-submit')
    login_button.click()
    # Login complete

Вы можете найти полный код в моем хранилище.

Ответы [ 3 ]

2 голосов
/ 26 сентября 2019

Проблема в

driver.find_element_by_xpath('[//*[@id="UserPassword"]')

Удалите первый '[' в xpath.

driver.find_element_by_xpath('//*[@id="UserPassword"]')
1 голос
/ 26 сентября 2019

Ваша проблема xpath выражение:

[//*[@id="UserPassword"]

Это должно быть:

//*[@id="UserPassword"]

Но похоже, что вы можете использовать .find_element_by_id вместо .find_element_by_xpath, выглядит лучше.

driver.get('https://10fastfingers.com/login')

email = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.ID, 'UserEmail')))
email.send_keys(os.environ['FINGERS_EMAIL'])

password = driver.find_element_by_id('UserPassword')
login_button = driver.find_element_by_id('login-form-submit')

password.send_keys(os.environ['FINGERS_PASSWORD'])
login_button.click()

После импорта:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
1 голос
/ 26 сентября 2019

Вы пробовали подождать, пока функция.

wait = WebDriverWait(driver, 10)
men_menu = wait.until(ec.visibility_of_element_located((By.XPATH, "//*[@id="UserPassword"]")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...