selenium - 使用 selenium 函数按名称查找元素时元素不可交互,但在通过 xpath 方法使用查找元素时有效
问题描述
我有一个网页,我正在尝试登录它。当我使用按名称查找元素的方法来查找元素时,我得到元素不可交互错误,但是当我通过 xpath 使用查找元素时,它工作正常并且没有错误。谁能解释我为什么通过名称方法找到它时无法与元素交互?
用户 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,一切正常。当我按名称使用查找元素时,它失败并出现不可交互错误
解决方案
此错误消息...
ElementNotInteractableException: Message: element not interactable
...意味着您尝试与之交互的WebElement在那一刻不可交互(不处于可交互状态)。
此错误的两个 (2) 主要原因是:
- 您正在尝试与错误/错误的元素进行交互。
- 或者您在元素变为可点击/可交互
click()
之前就调用得太早了。
分析与解决
您需要注意几件事。对于像 Truck Dealer Online 这样的网站,一旦您导航到登录页面而不是find_element_by_id()
或者find_element_by_name()
您必须为.element_to_be_clickable()
例如,要将字符序列发送到用户名字段,您可以使用以下任一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
参考
推荐阅读
- python - 运行绘图破折号代码时,在 Chrome 浏览器中加载依赖项时出错
- ruby - 无法在 OSX 上安装 OpenSSL gem
- php - DOMNode 类中不存在 PHP-getelementsbytagname 方法
- locking - 页面刷新后 SignalR 无法正常工作
- vba - VBA 使用单个 sendkeys 驱动的宏执行数以万计的操作
- wso2is - WSO2IS passport-saml SLO,从编码字符串构造 AuthRequest 时出错
- caching - WebAPI core 2.0 通过 post params 缓存
- vuejs2 - 从 VueJS 应用程序中访问 VuePress 文档?
- jquery - 何时使用 toastr 在重定向中清除 Viewbag
- sql - ReactJs 与数据库