【问题标题】:Python Selenium: Element Is Not Clickable At PointPython Selenium:元素不可点击
【发布时间】:2019-11-25 23:39:23
【问题描述】:

我正在使用下面的代码单击您在所附屏幕截图中看到的带有相应 HTML 代码的突出显示选项卡。该选项卡始终在脚本底部可见,因此无需向下滚动到它。

element = WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.ID, "tab-button-settings")))
element.click()

我得到的错误如下。我做错了什么?

Message: unknown error: Element <a class="tab-button has-icon icon-only" href="#" role="tab" ng- 
reflect-tab="[object Object]" id="tab-button-settings" aria-controls="tabpanel-t0-1" aria- 
selected="false">...</a> is not clickable at point (1440, 1017). Other element would receive the 
click: <div class="click-block click-block-enabled click-block-active"></div>
(Session info: chrome=78.0.3904.108)

【问题讨论】:

  • 拦截点击的 div 被标记为“click-block-enabled”,所以如果此时您应该能够点击该链接,那么您已经在站点中发现了一个错误。 (可能是不可见的模态或类似的东西??)

标签: python selenium xpath css-selectors webdriverwait


【解决方案1】:

您可以使用动作类来避免上述问题

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

from selenium.webdriver.common.action_chains import ActionChains

element = WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.ID, "tab-button-settings"))
ActionChains(driver).move_to_element(element).click().perform()

【讨论】:

    【解决方案2】:

    javascript 的另一种替代方法是使用触摸操作

    from selenium.webdriver.common.touch_actions import TouchActions
    
    element = WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.ID, "tab-button-settings")))
    
    touchactions = TouchActions(driver)
    touchactions.tap(element).perform()
    

    【讨论】:

    • 我试过了,这里是错误:Message: unknown error: Element &lt;a class="tab-button has-icon icon-only" href="#" role="tab" ng-reflect-tab="[object Object]" id="tab-button-settings" aria-controls="tabpanel-t0-1" aria-selected="false"&gt;...&lt;/a&gt; is not clickable at point (1440, 1017). Other element would receive the click: &lt;div class="click-block click-block-enabled click-block-active"&gt;&lt;/div&gt;
    【解决方案3】:

    所需的元素是Angular 元素,因此要在元素上定位和click(),您必须为element_to_be_clickable() 诱导WebDriverWait,您可以使用以下任一Locator Strategies

    • 使用CSS_SELECTOR

      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a.tab-button.has-icon.icon-only#tab-button-settings"))).click()
      
    • 使用XPATH

      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@class='tab-button has-icon icon-only' and @id='tab-button-settings']"))).click()
      
    • 注意:您必须添加以下导入:

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

    如果unknown error 仍然出现,您可能需要另外为invisibility_of_element_located() 诱导WebDriverWait,您可以使用以下任一解决方案:

    • 使用CSS_SELECTOR:

      WebDriverWait(driver, 20).until(EC.invisibility_of_element_located((By.CSS_SELECTOR, "div.click-block.click-block-enabled.click-block-active")))
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a.tab-button.has-icon.icon-only#tab-button-settings"))).click()
      
    • 使用XPATH

      WebDriverWait(driver, 20).until(EC.invisibility_of_element_located((By.XPATH, "//div[@class='click-block click-block-enabled click-block-active']")))
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@class='tab-button has-icon icon-only' and @id='tab-button-settings']"))).click()
      

    参考文献

    您可以在以下位置找到一些相关讨论:

    【讨论】:

    • CSS 选择器方法抛出此错误:Message: unknown error: Element &lt;a class="tab-button has-icon icon-only" href="#" role="tab" ng-reflect-tab="[object Object]" id="tab-button-settings" aria-controls="tabpanel-t0-1" aria-selected="false"&gt;...&lt;/a&gt; is not clickable at point (480, 28). Other element would receive the click: &lt;div class="click-block click-block-enabled click-block-active"&gt;&lt;/div&gt;
    • XPath 方法抛出这个:Message: unknown error: Element &lt;a class="tab-button has-icon icon-only" href="#" role="tab" ng-reflect-tab="[object Object]" id="tab-button-settings" aria-controls="tabpanel-t0-1" aria-selected="false"&gt;...&lt;/a&gt; is not clickable at point (1440, 1017). Other element would receive the click: &lt;div class="click-block click-block-enabled click-block-active"&gt;&lt;/div&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 2015-06-13
    • 1970-01-01
    • 2016-12-29
    • 2020-10-16
    相关资源
    最近更新 更多