selenium python问题 - 无效的元素状态

时间:2018-01-19 17:33:13

标签: python selenium

获取错误:"元素状态无效"使用Chrome驱动程序进行硒时。

我想做的事情: 将一些数据传递给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:\用户\用户\应用程序数据\本地\程序\ Python的\ Python36-32 \ python.exe   " C:/ Users / Owner / Desktop / UpWork / Marvin Sessner / script.py"追溯   (最近的呼叫最后一次):文件" C:/ Users / Owner / Desktop / UpWork / Marvin   Sessner / script.py",第23行,in       address_element_name.send_keys(" tester")文件" C:\ Users \ Owner \ AppData \ Roaming \ Python \ Python36 \ site-packages \ selenium \ webdriver \ remote \ webelement.py",   第352行,在send_keys中       ' value&#39 ;: keys_to_typing(value)})文件" C:\ Users \ Owner \ AppData \ Roaming \ Python \ Python36 \ site-packages \ selenium \ webdriver \ remote \ webelement.py&#34 ;,   第_ 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(响应)文件" 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:Message:   无效的元素状态(会话信息:chrome = HIDDEN)(驱动程序信息:   chromedriver = HIDDEN   (5b82f2d2aae0ca24b877009200ced9065a772e73),platform = Windows NT   10.0.15063 x86_64)

2 个答案:

答案 0 :(得分:2)

在两个动作之间放置一个小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")

答案 1 :(得分:1)

如果使用显式等待,通常可以避免此错误。特别是,如果可以单击某个元素(输入,按钮,选择等),则可以等待它可以单击。以下是您的案例。

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