使用 Selenium 和 Python 选择与描述文本相对应的元素

Selecting element with respective to the description text using Selenium and Python

我正在尝试使用以下代码在随附的屏幕截图中查找并单击显示 OAT (ADS05....) 的位置:

oatObj = driver.find_element(By.XPATH,"//span[contains(@class, 'treeImg') and contains(., 'OAT ')]") 
oatObj.click()

这会弹出以下错误:

ElementNotInteractableException: Message: element not interactable

这个元素绝对是可点击的,代码中的其他地方我使用了类似的 XPATH 匹配,它们确实有效。这个 XPATH 有什么不同之处是任何人都可以看到的吗?这是单击时元素和检查窗格的屏幕截图:

尝试在点击元素之前使用等待

wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.XPATH,'YourXpath')))

如果有更多元素具有相同的 xpath

,您也可以使用 find_elements

您可以使用 Java 脚本和执行操作来更改点击方式

ElementNotInteractableException: Message: element not interactable 您收到的错误是因为该元素在访问时不可交互。可能是各种原因,有时它不可见并试图点击,有时与其他元素叠加,有时用于视口。

请找到以下解决方案。

#1 使用 WebDriverWait()

oatObj=WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//span[contains(@class, 'treeImg') and contains(., 'OAT ')]")))
oatObj.click()

#2 使用 Actions class

oatObj=WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//span[contains(@class, 'treeImg') and contains(., 'OAT ')]")))

ActionChains(driver).move_to_element(oatObj).click().perform()

#3 使用 JavaScripts Executor

oatObj=WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//span[contains(@class, 'treeImg') and contains(., 'OAT ')]")))

driver.execute_script("arguments[0].click();",oatObj)

请导入以下库:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains

innerText 确实包含文本 OAT 但规范地包含文本 starts-with正文OAT


解决方案

要点击 clickable 元素,理想情况下您需要引入 WebDriverWait for the and you can use the following :

  • 使用 XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//li/span[contains(@class, 'treeImg') and starts-with(., 'OAT')]"))).click()
    
  • 注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC