невозможно найти элемент по идентификатору с селеном - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь автоматизировать вход на веб-сайт, и ниже приведен код, который я использовал.

from selenium import webdriver

chromedriver = "C:/Lujing/chromedriver.exe"
browser = webdriver.Chrome(chromedriver)
browser.get("https://community-pm.p.cloud.sabrehospitality.com/pms-web-ui/login")
browser.implicitly_wait(10)

userElem = browser.find_element_by_id("spark-input_1")
userElem.send_keys("input user name") #enter user name in the quote

passwordElem = browser.find_element_by_id("spark-input_2")
passwordElem.send_keys("input password") #enter password in the quote

signin = browser.find_element_by_class_name('login-button spark-btn spark-btn--md spark-btn--primary spark-block--lte-sm spark-margin-bottom--md spark-pull-right--gte-sm')
type(signin)
signin.click()

Я также пытался использовать find_element_by_xpath("//*[@id='spark-input_1']"), но я получаю сообщение об ошибке ниже.

Traceback (most recent call last):
  File "C:\Lujing\Python Scripts\PMS_report_downloads.py", line 9, in <module>
    userElem=browser.find_element_by_id("spark-input_1")
  File "C:\Users\Lujing.gao\AppData\Local\Programs\Python\Python38-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 360, in find_element_by_id
    return self.find_element(by=By.ID, value=id_)
  File "C:\Users\Lujing.gao\AppData\Local\Programs\Python\Python38-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 976, in find_element
    return self.execute(Command.FIND_ELEMENT, {
  File "C:\Users\Lujing.gao\AppData\Local\Programs\Python\Python38-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\Users\Lujing.gao\AppData\Local\Programs\Python\Python38-32\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"[id="spark-input_1"]"}
  (Session info: chrome=80.0.3987.163)

Вот скриншот исходных кодов на веб-странице

Может ли кто-нибудь помочь мне с этим?

1 Ответ

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

Ниже приведено рабочее решение для ввода значений в поле имени пользователя. Вы можете выяснить, как сделать поле пароля и кнопку отправки. Обратите внимание, у меня были проблемы с geckodriver. Я не уверен, работает ли он для вас, но он работает с Chromedriver для меня.

Как я уже упоминал в своем комментарии к вашему сообщению, причина, по которой вы не можете найти этот элемент, связана с shadowDOM. Вы можете использовать немного javascript, чтобы пройти это. Обратите внимание, что на будущих страницах веб-сайта вы можете столкнуться с вложенным shadowDOM, для которого потребуется решение, аналогичное приведенному ниже, но рекурсивное.

browser = webdriver.Chrome()
browser.get("https://community-pm.p.cloud.sabrehospitality.com/pms-web-ui/login")

shadow_root = browser.execute_script('return arguments[0].shadowRoot', browser.find_element_by_tag_name("sabre-shs-login"))

userElem = shadow_root.find_element_by_id('spark-input_1')
userElem.send_keys("input user name") #enter user name in the quote
...