获取错误:"元素状态无效"使用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)
答案 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")