Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 消息:过时元素引用:元素未附加到页面文档_Python_Selenium_Selenium Webdriver_Selenium Chromedriver_Staleelementreferenceexception - Fatal编程技术网

Python 消息:过时元素引用:元素未附加到页面文档

Python 消息:过时元素引用:元素未附加到页面文档,python,selenium,selenium-webdriver,selenium-chromedriver,staleelementreferenceexception,Python,Selenium,Selenium Webdriver,Selenium Chromedriver,Staleelementreferenceexception,我正在尝试自动化一项我们几乎每天都在做的任务。我读到python与selenium的结合将是完成这项任务的完美选择。欢迎任何意见: 请参阅下面的代码 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expec

我正在尝试自动化一项我们几乎每天都在做的任务。我读到python与selenium的结合将是完成这项任务的完美选择。欢迎任何意见:

请参阅下面的代码

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)
此错误消息

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_键时,元素已过时

有多个事实需要解决,如下所示:

密码字段 密码字段包含onfocus属性,包含函数managePasswordTxt。因此,一旦您单击密码字段,就会调用managePasswordTxt JavaScript,您必须诱导WebDriverWait使该字段可单击,并且您可以使用以下解决方案:

代码块:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

options = Options()
options.add_argument("start-maximized")
options.add_argument("disable-infobars")
options.add_argument("--disable-extensions")
driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\WebDrivers\ChromeDriver\chromedriver_win32\chromedriver.exe')
driver.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')
username = driver.find_element_by_xpath("//input[@id='USER']").send_keys("Alex")
driver.find_element_by_xpath("//input[@id='PASSWORD']").click()
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@id='PASSWORD']"))).send_keys("Pruteanu")
浏览器客户端的快照:

版本兼容性 另一个问题是您正在使用的二进制文件之间的版本兼容性,如下所示:

您使用的是chromedriver=2.35 的发行说明明确提到以下内容: 支持Chrome v62-64

您使用的是chrome=66.0 的发行说明明确提到以下内容: 支持Chrome v65-67

我们不知道您的Selenium客户端版本。 因此,ChromeDriver v2.35和Chrome浏览器版本v66.0之间存在明显的不匹配

解决方案 将硒升级到当前水平。 将ChromeDriver升级到当前级别。 将Chrome版本保持在ChromeV66.x级别。 通过IDE清理项目工作区,并仅使用所需的依赖项重建项目。 在执行测试套件之前和之后,使用该工具清除所有操作系统杂务。 如果您的基本Web客户端版本太旧,请通过卸载它并安装最新的GA和Web客户端发布版本。 重新启动系统。 执行@Test。
你的定位器很好。但是,当您单击或将焦点更改为password元素时,会出现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

使用有效的用户名和密码,代码可以正常登录

修改您的代码以填写密码,如下所示

# 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)

当您尝试对网页上不再可用的webElement执行操作时,可能是因为网页已刷新,因此代码保留的对象不再有效,因此会引发StaleElement异常。在执行“单击密码”字段后,需要再次执行查找,然后尝试在其上发送密钥。可能xpath在单击后会发生更改,如果是这种情况,请在单击后更新xpath。

切换到FireFox driviver解决了使用我在此处发布的相同代码的问题。

这不是浏览器与chromedriver兼容性的问题。这在Chrome v66+和Chromedriver 2.38上失败。我已经测试了这段代码,但在Chrome上的v2.36+上失败了。同样,我已经切换到Firefox进行这个项目,并且运行了同样的代码,奇怪的事情