【问题标题】:ElementClickInterceptedException: Message: element click intercepted using Selenium WebDriverElementClickInterceptedException:消息:使用 Selenium WebDriver 拦截的元素单击
【发布时间】:2021-05-16 07:33:00
【问题描述】:

我在运行自动化测试时尝试单击一个字段,但出现此错误:

raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: Element <input id="artistNominee010" type="checkbox" class="rock-artist-checkbox"> is not clickable at point (967, 601). Other element would receive the click: <span class="rock-artist-toggle-icon"></span>

这是我尝试访问该属性的代码行:

select_nominee = WebDriverWait(driver, 2).until(EC.presence_of_element_located((By.ID, 'artistNominee010'))).click()

这是页面的DOM结构:

<input id="artistNominee010" type="checkbox" class="rock-artist-checkbox">
<label class="rock-artist-label" for="artistNominee010">
<span class="rock-artist-photo-wrap">
<img class="rock-artist-photo" alt="" src="/images/artist-photos/nominee010.jpg"></span>
<span class="rock-desktop-hide rock-artist-name">John Doe</span>
<span class="rock-accessible-text">select John Doe</span>
<span class="rock-artist-toggle-icon"></span></label>

从网站上看,这是可点击的元素,但我无法直接选择它,因为其他元素包含相同的类名和不同的被提名者,id 是唯一的。

<span class="rock-accessible-text">select John Doe</span>

有没有办法做这样的事情:

select_nominee = WebDriverWait(driver, 2).until(EC.presence_of_element_located((By.ID, 'artistNominee010').class('rock-accessible-text')).click()

【问题讨论】:

    标签: python selenium-webdriver xpath css-selectors webdriverwait


    【解决方案1】:

    等待元素可点击

    select_nominee = WebDriverWait(driver, 2).until(EC.element_to_be_clickable((By.ID, 'artistNominee010'))).click()
    

    因为元素可以存在于 DOM 中,但还不能点击(如果被另一个元素阻挡,这可能是你的情况)。

    【讨论】:

      【解决方案2】:

      要点击元素而不是presence_of_element_located(),您需要将WebDriverWait 诱导为element_to_be_clickable(),您可以使用以下任一Locator Strategies

      • 使用CSS_SELECTOR

        WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "label[for='artistNominee010']"))).click()
        
      • 使用XPATH

        WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//label[@for='artistNominee010']"))).click()
        
      • 注意:您必须添加以下导入:

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

      【讨论】:

        【解决方案3】:

        所以我能够以一种非常简单的方式解决这个问题,如下所示:

        from selenium.webdriver.common import keys
        
        select_nominee = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,'artistNominee010'))).send_keys(keys.Keys.SPACE)
        

        参考请访问Selenium: Element not clickable … Other Element Would Receive Click

        【讨论】:

          猜你喜欢
          • 2019-12-29
          • 1970-01-01
          • 2019-12-13
          • 1970-01-01
          • 2019-11-08
          • 2021-10-08
          • 1970-01-01
          • 2020-09-09
          • 2020-01-04
          相关资源
          最近更新 更多