【问题标题】:selenium python issue - invalid element stateselenium python问题 - 无效的元素状态
【发布时间】:2018-01-19 17:33:13
【问题描述】:

使用 Chrome 驱动 selenium 时出现错误:“无效元素状态”。

我正在尝试做的事情: 将一些数据传入http://www.dhl.de/onlinefrankierung

我的第一个问题是,当我尝试在名为“Nachnahme”的复选框上使用 .click() 方法时,没有任何反应,也没有进行检查。

当您手动进行检查时,页面会刷新并打开其他字段,这就是我要访问的内容。

在尝试使用.send_keys() 方法传入数据时发生第二个问题,即引发无效元素状态。

到目前为止,这是我的代码:

from selenium import webdriver
driver = webdriver.Chrome('C:\\Users\\Owner\\AppData\\Local\\Programs\\Python\\Python36-32\\Lib\\site-packages\\chromedriver.exe')
driver.get('http://www.dhl.de/onlinefrankierung')
product_element = driver.find_element(by='id', value='bpc_PAK02')
product_element.click()
services_element = driver.find_element(by='id', value='sc_NNAHME')
services_element.click()
address_element_name = driver.find_element(by='name', value='formModel.sender.name')
address_element_name.send_keys("JackBlack")

错误: C:\Users\Owner\AppData\Local\Programs\Python\Python36-32\python.exe "C:/Users/Owner/Desktop/UpWork/Marvin Sessner/script.py" Traceback (最近一次通话最后):文件“C:/Users/Owner/Desktop/UpWork/Marvin Sessner/script.py”,第 23 行,在 address_element_name.send_keys("tester") 文件 "C:\Users\Owner\AppData\Roaming\Python\Python36\site-packages\selenium\webdriver\remote\webelement.py", 第 352 行,在 send_keys 中 'value':keys_to_typing(value)}) 文件 "C:\Users\Owner\AppData\Roaming\Python\Python36\site-packages\selenium\webdriver\remote\webelement.py", 第 501 行,在 _execute return self._parent.execute(command, params) File "C:\Users\Owner\AppData\Roaming\Python\Python36\site-packages\selenium\webdriver\remote\webdriver.py", 第 308 行,执行中 self.error_handler.check_response(response) 文件 "C:\Users\Owner\AppData\Roaming\Python\Python36\site-packages\selenium\webdriver\remote\errorhandler.py", 第 194 行,在 check_response 中 raise exception_class(message, screen, stacktrace) selenium.common.exceptions.InvalidElementStateException: 消息: 无效元素状态(会话信息:chrome=HIDDEN)(驱动程序信息: chromedriver=隐藏 (5b82f2d2aae0ca24b877009200ced9065a772e73),平台=Windows NT 10.0.15063 x86_64)

【问题讨论】:

  • 你能用完整的错误堆栈跟踪以及哪个元素和哪一行更新问题吗?
  • 我刚刚更新了问题

标签: python selenium


【解决方案1】:

在两个操作之间放置一个小的sleep 即可解决问题。以下代码工作得很好。

现在,在有人对睡眠投反对票或发表评论之前。让我澄清一下,这是最好的解决方案吗? 不,不是

但是现在您知道它为什么不起作用了,您的操作正在生成一些 AJAX 请求,并且在它完成之前您正尝试执行另一个导致问题的操作。

好的解决方案是编写条件,等待该操作完成,但同时您有一个有效的临时解决方案。

import time
from selenium import webdriver
driver = webdriver.Chrome('h:\\bin\\chromedriver.exe')
driver.get('http://www.dhl.de/onlinefrankierung')
product_element = driver.find_element(by='id', value='bpc_PAK02')
product_element.click()
time.sleep(5)
services_element = driver.find_element(by='id', value='sc_NNAHME')
services_element.click()
time.sleep(5)
address_element_name = driver.find_element(by='name', value='formModel.sender.name')
address_element_name.send_keys("JackBlack")

【讨论】:

    【解决方案2】:

    如果您使用显式等待,通常可以避免此错误。特别是,如果一个元素可以被点击(输入、按钮、选择等),您可以等待它成为可点击的。以下是适用于您的情况的方法。

    from selenium import webdriver
    from selenium.webdriver.common import utils
    from selenium.webdriver.chrome.options import Options
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    def waitForElementClickable(timeout=5, method='id', locator=None):
        try:
            element = WebDriverWait(driver, timeout).until(
                EC.element_to_be_clickable((method, locator))
            )
            print("Element", method + '=' + locator, "can be clicked.")
            return element
        except Exception:
            print("Element", method + '=' + locator, "CANNOT be clicked.")
            raise
    
    options = Options()
    options.add_argument('--disable-infobars')
    driver = webdriver.Chrome(chrome_options=options)
    driver.get('http://www.dhl.de/onlinefrankierung')
    
    product_element = waitForElementClickable(method='id', locator='bpc_PAK02')
    product_element.click()
    
    services_element = waitForElementClickable(method='id', locator='sc_NNAHME')
    services_element.click()
    
    address_element_name = waitForElementClickable(method='name', locator='formModel.sender.name')
    address_element_name.send_keys("JackBlack")
    

    【讨论】:

      猜你喜欢
      • 2018-09-28
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 2021-04-11
      • 2022-01-10
      相关资源
      最近更新 更多