Python 消息:过时元素引用:元素未附加到页面文档
我正在尝试自动化一项我们几乎每天都在做的任务。我读到python与selenium的结合将是完成这项任务的完美选择。欢迎任何意见: 请参阅下面的代码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
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进行这个项目,并且运行了同样的代码,奇怪的事情