使用 selenium 函数按名称查找元素时元素不可交互,但在通过 xpath 方法使用查找元素时有效
Posted
技术标签:
【中文标题】使用 selenium 函数按名称查找元素时元素不可交互,但在通过 xpath 方法使用查找元素时有效【英文标题】:Element not Interactable when using the selenium function find element by name but works when using find element by xpath method 【发布时间】:2020-11-09 13:26:52 【问题描述】:我有一个网页,我正在尝试登录它。当我使用按名称查找元素的方法来查找元素时,我得到元素不可交互错误,但是当我通过 xpath 使用查找元素时,它工作正常并且没有错误。谁能解释一下为什么通过 name 方法找到它时无法与元素交互?
对于用户 ID、密码和登录元素也观察到同样的问题。 我敢肯定,即使按名称使用方法网站已加载并可以使用。 下面是网页登录截图
我的 html 代码如下
下面是我使用的代码
import xlrd
import openpyxl
import requests
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
from selenium.webdriver.support.ui import Select
from selenium.webdriver.chrome.options import Options
from selenium.webdriver import ChromeOptions, Chrome
opts = webdriver.ChromeOptions()
opts.add_experimental_option("detach", True)
def login_to_Portal(mBrowser):
mBrowser.find_element_by_id("userNameTrucks")
mBrowser.find_element_by_id("userNameTrucks").clear()
mBrowser.find_element_by_id("userNameTrucks").send_keys("xxxxx")
mBrowser.find_element_by_xpath("/html/body/div/router-view/section/div[2]/ul/li[4]/input")
#mBrowser.find_element_by_name("password").clear()
mBrowser.find_element_by_xpath("/html/body/div/router-view/section/div[2]/ul/li[4]/input").send_keys("xxxxx")
mBrowser.find_element_by_xpath("/html/body/div/router-view/section/div[2]/ul/li[5]/button").click()
#mBrowser.find_element_by_class_name("au-target").click()
#mBrowser.find_element_by_name("target")
#mBrowser.find_element_by_name("target").click()
mBrowser = webdriver.Chrome(executable_path = r'C:\chromedriver_win32\chromedriver.exe', options = opts )
mBrowser.get("https://grouptrucksportal.volvo.com/gpp/index.html")
time.sleep(10)
mBrowser.find_element_by_xpath("/html/body/div/compose[1]/section/div[1]/map/area[1]")
mBrowser.find_element_by_xpath("/html/body/div/compose[1]/section/div[1]/map/area[1]").click()
time.sleep(3)
mBrowser.find_element_by_xpath("/html/body/div/compose[3]/section/div[2]/div/ul/li[4]/a")
mBrowser.find_element_by_xpath("/html/body/div/compose[3]/section/div[2]/div/ul/li[4]/a").click()
time.sleep(5)
login_to_Portal(mBrowser)
现在正在使用 xpatha,一切正常。 当我使用按名称查找元素时,它失败并出现不可交互错误
【问题讨论】:
你能分享你的代码吗? 添加代码图像是不好的做法,没有人会从图像中为您编写。考虑添加代码而不是代码的图像。请阅读minimal reproducible example 并在您的所有帖子中关注它 @Dev 我没有在这里添加代码,我有网站和 HTML 代码的图像。这是公司内部工具,我们不应该共享网页的完整 HTML 代码。希望你能理解。 @Gokul nath,我已经添加了代码,请看一下 【参考方案1】:此错误消息...
ElementNotInteractableException: Message: element not interactable
...暗示您尝试与之交互的 WebElement 在此时不可交互(不处于可交互状态)。
此错误的两个 (2) 主要原因是:
您正在尝试与错误/错误的元素进行交互。 或者您在元素变为可点击/可交互之前过早调用click()
。
分析及解决方案
您需要注意几件事。对于像Truck Dealer Online 这样的网站,一旦您导航到Login 页面而不是find_element_by_id()
或find_element_by_name()
,您必须为element_to_be_clickable()
诱导WebDriverWait。
例如,要将字符序列发送到 用户名 字段,您可以使用以下任一Locator Strategies:
使用ID
:
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.ID, "userNameTrucks"))).send_keys("SrinivasVenkataram")
使用CSS_SELECTOR
:
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input#userNameTrucks"))).send_keys("SrinivasVenkataram")
使用XPATH
:
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@id='userNameTrucks']"))).send_keys("SrinivasVenkataram")
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
参考文献
你可以在ElementNotInteractableException找到详细讨论:
ElementNotInteractableException: Message: element not interactable error sending text in search field using Selenium Python【讨论】:
感谢 Debanjan 的回复,将尝试此操作并随时通知您。使用 XPath 进行查询是识别元素的好选择,因为将来如果网页(HTML 代码)更新,那么我们的代码失败的可能性会更大吗? @SrinivasVenkataram 很高兴能为您提供帮助。 Vote up questions and answers 你觉得很有帮助。见Why is voting important。以上是关于使用 selenium 函数按名称查找元素时元素不可交互,但在通过 xpath 方法使用查找元素时有效的主要内容,如果未能解决你的问题,请参考以下文章