0

我试图自动化我们几乎每天都做的一项任务。我读到 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)
4

4 回答 4

1

此错误消息...

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字段包含onfocus属性包含managePasswordTxt()函数。因此,一旦您单击该password字段,就会调用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")
    
  • 浏览器客户端快照:

partner_co_li_login


版本兼容性

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

  • 您正在使用chromedriver=2.35
  • chromedriver=2.35的发行说明清楚地提到了以下内容:

支持Chrome v62-64

  • 您正在使用chrome=66.0
  • ChromeDriver v2.38的发行说明清楚地提到了以下内容:

支持Chrome v65-67

  • 我们不知道您的Selenium 客户端版本。

因此ChromeDriver v2.35Chrome 浏览器版本v66.0之间存在明显的不匹配

解决方案

  • 将Selenium升级到当前级别Version 3.11.0
  • 将ChromeDriver升级到当前的ChromeDriver v2.38级别。
  • 将Chrome版本保持在Chrome v66.x级别。(根据 ChromeDriver v2.38 发行说明
  • 通过IDE清理项目工作区并仅使用所需的依赖项重建项目。
  • 使用CCleaner工具在执行测试套件之前和之后清除所有操作系统杂务。
  • 如果您的基本Web Client版本太旧,请通过Revo Uninstaller卸载它并安装最新的 GA 和已发布版本的Web Client
  • 重新启动系统
  • 执行你的@Test.
于 2018-05-13T16:50:09.940 回答
0

你的定位器很好。但是,当您单击或将焦点更改为密码元素时,会出现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

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

于 2018-05-13T17:04:07.670 回答
0

切换到 FireFox 驱动程序解决了使用我在此处发布的相同代码的问题

于 2019-05-02T10:06:56.297 回答
0

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

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

于 2018-05-13T18:01:25.770 回答