【问题标题】:Element not clickable, ElementClickInterceptedException in Selenium元素不可点击,Selenium 中的 ElementClickInterceptedException
【发布时间】:2022-02-08 20:15:05
【问题描述】:

类似的问题被问过很多次了,我也复习了很多,比如Debugging "Element is not clickable at point" error , Selenium Webdriver - element not clickable error in firefox, ElementClickInterceptedException: Message: element click intercepted:

但没能解决我的问题。

我想从网站搜索下拉菜单中选择一部分汽车品牌。通常我会通过 Selenium 的 Select 来完成,但这在这里不起作用。

这是我的代码。

from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.proxy import Proxy, ProxyType
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains

ser = Service(executable_path= r'D:\chromedriver.exe')

#Note I have omitted the options that I use (proxy and header).
driver = webdriver.Chrome(service = ser)
driver.get("https://www.autotalli.com/")
time.sleep(5)

# Accepting cookies
driver.find_element(by = By.XPATH, value  = "//button[contains(text(),'Asetuks')]").click()
time.sleep(5)
driver.find_element(by = By.XPATH, value  = "//button[contains(text(),'Tallenna')]").click()
driver.maximize_window()
time.sleep(5)

#selecting parameters from the dropdown menu
element = WebDriverWait(driver, 20).until(
EC.element_to_be_clickable((By.XPATH, "//*[@class = 'mbsc-input-wrap']")))
element.click()

element = WebDriverWait(driver, 20).until(
EC.element_to_be_clickable((By.XPATH, "//*[@data-val = '66-duplicated']")))
element.click()
element = WebDriverWait(driver, 20).until(
EC.element_to_be_clickable((By.XPATH, "//*[@class = 'mbsc-input-wrap']")))
element.click()
element = WebDriverWait(driver, 20).until(
EC.element_to_be_clickable((By.XPATH, "//*[@data-val = '10-duplicated']")))
element.click()

让我失望的是代码适用于 66-duplicated 元素,但不适用于 10-duplicated 元素,而且两者在各方面都是相同的。我得到的错误是

Exception has occurred: ElementClickInterceptedException
Message: element click intercepted: Element <div role="option" tabindex="-1" aria-selected="false" class="mbsc-sc-itm mbsc-sel-gr-itm  mbsc-btn-e" data-index="2" data-val="10-duplicated" style="height:40px;line-height:40px;">...</div> is not clickable at point (268, 217). Other element would receive the click: <input tabindex="0" type="text" class="mbsc-sel-filter-input mbsc-control" placeholder="Hae">

为了解决这个问题,我尝试使用 javascript,移动到元素,然后单击并最大化窗口 - 这些都不起作用。

#Attempt 1:js:
driver.execute_script("arguments[0].click()", element)

#Attempt 2: moveToElement:

element = driver.find_element(by = By.XPATH, value  = "//*[@data-val = '10-duplicated']")
actions = ActionChains(driver)
actions.move_to_element(element).perform()
element = WebDriverWait(driver, 20).until(
EC.element_to_be_clickable((By.XPATH, "//*[@data-val = '10-duplicated']")))
element.click()

我也尝试了这些的组合,但无济于事。

但是,当我在单击元素“10-duplicated”之前放置一个断点并手动滚动并将鼠标移动到该元素并运行剩余的代码时,它可以工作。

我在这里很困惑。这是怎么回事?如何解决这个问题?

【问题讨论】:

    标签: python selenium selenium-webdriver


    【解决方案1】:

    该页面上有 17 个 //*[@class = 'mbsc-input-wrap'] 定位器匹配项,但您打开的是相同的,第一次匹配项 2 次。那是Merkit droplist。
    现在,当从打开的下拉列表中选择 //*[@data-val = '66-duplicated'] (Nissan) 时,这将起作用,因为该选项在可见选项中,但是当当前选择 Nissan 时,//*[@data-val = '10-duplicated'] (BMW) 选项不可见,您不能直接单击它。 为了现在选择它,您必须

    1. 取消之前对 Nissan 的选择,以便通过打开下拉列表首先看到 BMW。
    2. 滚动下拉列表
    3. 使用 JavaScript 单击 //*[@data-val = '10-duplicated'] - 不推荐,因为这不是人类用户可以通过 GUI 执行的操作。
      我会给你一个代码来进行第一种方法 - 取消之前的 Nissan 选择。
      我也在那里做了一些改进。
    from selenium import webdriver
    from selenium.webdriver.chrome.service import Service as ChromeService
    from selenium.webdriver.chrome.service import Service
    from selenium.webdriver.common.proxy import Proxy, ProxyType
    from selenium.webdriver.common.by import By
    import time
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.action_chains import ActionChains
    
    ser = Service(executable_path= r'D:\chromedriver.exe')
    
    #Note I have omitted the options that I use (proxy and header).
    driver = webdriver.Chrome(service = ser)
    driver.get("https://www.autotalli.com/")
    wait = WebDriverWait(driver, 20)
    
    time.sleep(5)
    
    # Accepting cookies
    driver.find_element(by = By.XPATH, value  = "//button[contains(text(),'Asetuks')]").click()
    time.sleep(5)
    driver.find_element(by = By.XPATH, value  = "//button[contains(text(),'Tallenna')]").click()
    driver.maximize_window()
    time.sleep(5)
    
    #selecting parameters from the dropdown menu
    wait.until(EC.element_to_be_clickable((By.XPATH, "//*[@class = 'mbsc-input-wrap']"))).click()
    
    wait.until(EC.element_to_be_clickable((By.XPATH, "//*[@data-val = '66-duplicated']"))).click()
    #clear the previously selected NIssan option
    wait.until(EC.element_to_be_clickable((By.XPATH, "//span[contains(@class,'usedCarsMakeClear clearOption')]"))).click()
    
    wait.until(EC.element_to_be_clickable((By.XPATH, "//*[@class = 'mbsc-input-wrap']"))).click()
    
    wait.until(EC.element_to_be_clickable((By.XPATH, "//*[@data-val = '10-duplicated']"))).click()
    
    

    【讨论】:

    • 感谢您的帮助,但我不想取消选择 Nissan 选项。在 GUI 中,您可以单击多个品牌并将它们添加到查询中。因此,如果您单击 Nissan 和 BMW,您将选择两个汽车品牌。例如。如果您将与 BMW 对应的代码替换为以下代码,则该代码有效。令人困惑的部分是您可以选择一些多辆汽车,但不能选择其他汽车。例如。 ` element = WebDriverWait(driver, 20).until( EC.element_to_be_clickable((By.XPATH, "//*[@data-val = '79-duplicated']"))) element.click() `
    猜你喜欢
    • 2020-09-09
    • 1970-01-01
    • 2021-10-08
    • 2019-12-29
    • 2018-07-17
    • 2015-06-13
    相关资源
    最近更新 更多