首页 > 解决方案 > 使用 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,一切正常。当我按名称使用查找元素时,它失败并出现不可交互错误

标签: seleniumselenium-webdriverxpathcss-selectorswebdriverwait

解决方案


此错误消息...

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
    

参考

您可以在以下位置找到有关ElementNotInteractableException的详细讨论:


推荐阅读