gpt4 book ai didi

python - 无法使用 Selenium 输入凭据

转载 作者:太空宇宙 更新时间:2023-11-03 23:59:21 25 4
gpt4 key购买 nike

我正在尝试通过以下方式使用 selenium 登录网站:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://www.eco-visio.net/v5/")
username = driver.find_element_by_id("login-username")
username.send_keys("midregcog.admin")

但是我收到以下错误

ElementNotInteractableException           Traceback (most recent call last)
<ipython-input-9-975030640535> in <module>()
8 driver.get("https://www.eco-visio.net/v5/")
9 username = driver.find_element_by_id("login-username")
---> 10 username.send_keys("midregcog.admin")
11

C:\Anaconda2\lib\site-packages\selenium\webdriver\remote\webelement.pyc in send_keys(self, *value)
477 self._execute(Command.SEND_KEYS_TO_ELEMENT,
478 {'text': "".join(keys_to_typing(value)),
--> 479 'value': keys_to_typing(value)})
480
481 # RenderedWebElement Items

C:\Anaconda2\lib\site-packages\selenium\webdriver\remote\webelement.pyc in _execute(self, command, params)
631 params = {}
632 params['id'] = self._id
--> 633 return self._parent.execute(command, params)
634
635 def find_element(self, by=By.ID, value=None):

C:\Anaconda2\lib\site-packages\selenium\webdriver\remote\webdriver.pyc in execute(self, driver_command, params)
319 response = self.command_executor.execute(driver_command, params)
320 if response:
--> 321 self.error_handler.check_response(response)
322 response['value'] = self._unwrap_value(
323 response.get('value', None))

C:\Anaconda2\lib\site-packages\selenium\webdriver\remote\errorhandler.pyc in check_response(self, response)
240 alert_text = value['alert'].get('text')
241 raise exception_class(message, screen, stacktrace, alert_text)
--> 242 raise exception_class(message, screen, stacktrace)
243
244 def _value_or_default(self, obj, key, default):

ElementNotInteractableException: Message: element not interactable
(Session info: chrome=74.0.3729.131)
(Driver info: chromedriver=74.0.3729.6 (255758eccf3d244491b8a1317aa76e1ce10d57e9-refs/branch-heads/3729@{#29}),platform=Windows NT 10.0.17134 x86_64)

这是我要获取的网站的 id 标签。 enter image description here

最佳答案

如解释here ,您需要使用 javascript 人为地单击该元素,因为它是由 javascript 本身制作的(selenium 无法“看到”该元素)。另一个类似情况的例子是 my answer on this question .像这样调整您的代码(我也实现了等待,但这可能不是必需的):

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
from selenium.webdriver.common import action_chains
import time

driver = webdriver.Chrome()
driver.get("https://www.eco-visio.net/v5/")
username_element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//form/div/input[@id='login-username']")))# driver.find_element_by_id("login-username")

driver.execute_script("arguments[0].click();", username_element)
time.sleep(1) # give the click a moment to register
action = action_chains.ActionChains(driver)
action.send_keys("midregcog.admin")
action.perform()

这可以在我的机器上填写字段!希望这会有所帮助。

更新

@MarcelWilson 指出你只需要等待页面加载(不完全确定为什么因为它是,并且通过一些测试我不确定为什么它不能只用一个明确的等待。显然第一个答案过于复杂,您可以通过以下方式达到预期效果:

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
import time

driver = webdriver.Chrome()
driver.get("https://www.eco-visio.net/v5/")
username_element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//form/div/input[@id='login-username']")))# driver.find_element_by_id("login-username")
time.sleep(2) # give a longer wait than the explicit wait in the previous line
username_element.click()
username_element.send_keys("username")
password_element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//form/div/input[@id='login-password'][@type='password']")))# driver.find_element_by_id("login-username")
password_element.click()
password_element.send_keys("password")

我认为这可能是因为在生成页面的 javascript 中(我不是 javascript 专家)有诸如 if: loaded() 之类的行,这让我相信显式WebDriverWait 正在获取元素,但 javascript 仍在加载它。因此 WebDriverWait 确保元素存在,并且 time.sleep (2) 确保它在尝试与之交互之前也已加载,此时看起来您可以像普通页面一样与它交互而不会出现问题。我什至还得为这篇文章学习一些新东西 XD!

关于python - 无法使用 Selenium 输入凭据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56247257/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com