Сообщение: ссылка на устаревший элемент: элемент не прикреплен к документу страницы - PullRequest
0 голосов
/ 13 мая 2018

Я пытаюсь автоматизировать задачу, которую мы выполняем почти ежедневно. Я читал, что Python в сочетании с селеном идеально подходит для решения этой задачи. Любой совет приветствуется:)

См. Мой код ниже.

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

usernameStr = 'USERNAME'
passwordStr = 'PASSWORD'

browser = webdriver.Chrome()
browser.get('https://www.partner.co.il/he-il/login/login/?TYPE=100663297&REALMOID=06-f94d9340-8677-4c32-9f36-efd036fe99f0&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=vmwebcms9&TARGET=-SM-HTTPS%3a%2f%2fwww%2epartner%2eco%2eil%2fcopa%2fpages%2fprotected%2fprotectedredirect%2easpx%3foriginal%3dhttps%3a%2f%2fwww%2epartner%2eco%2eil%2faccount_actions')

# fill in username 

username = browser.find_element_by_xpath('//*[@id="USER"]')
username.send_keys(usernameStr)

# fil the password

password = browser.find_element_by_xpath('//*[@id="PASSWORD"]')
password.click()
password.send_keys(passwordStr)


# press the login button

signInButton = browser.find_element_by_id('LoginBtn')
signInButton.click()

# go to the abroad page

browser.get(('https://biz.partner.co.il/he-il/biz/international/going-abroad'))

Но это возвращает

=========== RESTART: C:\Program Files (x86)\Python36-32\login2.py ===========
Traceback (most recent call last):
  File "C:\Program Files (x86)\Python36-32\login2.py", line 22, in <module>
    password.send_keys(passwordStr)
  File "C:\Program Files (x86)\Python36-32\lib\site-packages\selenium\webdriver\remote\webelement.py", line 479, in send_keys
    'value': keys_to_typing(value)})
  File "C:\Program Files (x86)\Python36-32\lib\site-packages\selenium\webdriver\remote\webelement.py", line 628, in _execute
    return self._parent.execute(command, params)
  File "C:\Program Files (x86)\Python36-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 312, in execute
    self.error_handler.check_response(response)
  File "C:\Program Files (x86)\Python36-32\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 237, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
  (Session info: chrome=66.0.3359.139)
  (Driver info: chromedriver=2.35.528161 (5b82f2d2aae0ca24b877009200ced9065a772e73),platform=Windows NT 10.0.14393 x86_64)

Ответы [ 4 ]

0 голосов
/ 02 мая 2019

Переход на FireFox Driviver решил проблему с использованием того же кода, который я выложил здесь

0 голосов
/ 13 мая 2018

Ваши локаторы в порядке.Однако при нажатии или изменении фокуса на элемент пароля возникает исключение StaleElementReference.

Добавьте это утверждение импорта

from selenium.common.exceptions import StaleElementReferenceException

И добавьте это к своему коду

try:
    ActionChains(browser).send_keys(Keys.TAB).send_keys(passwordStr).perform()
    password.send_keys(passwordStr)
except StaleElementReferenceException:
    pass

При правильном имени пользователя и пароле код будет входить в систему в порядке.

0 голосов
/ 13 мая 2018

Измените свой код, чтобы ввести пароль следующим образом.

# fil the password

password = browser.find_element_by_xpath('//*[@id="PASSWORD"]')
password.click()
password = browser.find_element_by_xpath('//*[@id="PASSWORD"]')
password.send_keys(passwordStr)

Исключение StaleElement выдается при попытке выполнить операцию над элементом webElement, который больше недоступен на странице, возможно, из-за того, что страница была обновлена ​​иследовательно, ваш код держится за объект, который больше не действителен.Вам нужно снова выполнить поиск после выполнения щелчка для поля пароля и затем попытаться отправить по нему.Вполне возможно, что xpath изменился бы после нажатия, обновите ваш xpath после щелчка, если это сценарий.

0 голосов
/ 13 мая 2018

Это сообщение об ошибке ...

selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
  (Session info: chrome=66.0.3359.139)
  (Driver info: chromedriver=2.35.528161 (5b82f2d2aae0ca24b877009200ced9065a772e73),platform=Windows NT 10.0.14393 x86_64)

... подразумевает, что при вызове send_keys() для поля password элемент превратился устаревшим .

Существует несколько фактов, на которые следует обратить внимание:


Поле пароля

Поле password содержит атрибут onfocus, содержащий функцию managePasswordTxt(). Поэтому, когда вы щелкнете по полю password, будет вызван managePasswordTxt() JavaScript , и вам нужно будет вызвать WebDriverWait для того, чтобы поле было кликабельным, и вы можете использовать следующее решение:

partner_co_li_login


Совместимость версий

Дополнительной проблемой является совместимость версии между используемыми вами двоичными файлами следующим образом:

  • Вы используете chromedriver = 2,35
  • Примечания к выпуску chromedriver = 2,35 четко упоминает следующее:

Поддержка Chrome v62-64

  • Вы используете хром = 66.0
  • Примечания к выпуску ChromeDriver v2.38 четко упоминает следующее:

Поддержка Chrome v65-67

  • Ваш Selenium Client версия нам неизвестна.

Таким образом, существует явное несоответствие между ChromeDriver v2.35 и Chrome Browser версия v66.0

Решение

  • Обновление Селен до текущих уровней Версия 3.11.0 .
  • Обновление ChromeDriver до текущей ChromeDriver v2.38 уровень.
  • Сохранить Chrome версия на Chrome v66.x уровней. ( в соответствии с примечаниями к выпуску ChromeDriver v2.38 )
  • Очистите ваше Рабочее пространство проекта через IDE и Перестройте ваш проект только с необходимыми зависимостями.
  • Используйте CCleaner инструмент для удаления всех рутинных операций ОС до и после выполнения test Suite .
  • Если ваша базовая версия Web Client устарела, удалите ее через Revo Uninstaller и установите последнюю версию GA и выпущенную версию Web Клиент .
  • Возьмите Перезагрузка системы .
  • Выполните свой @Test.
...