Selenium 调试:元素在 (X,Y) 点不可单击

问题描述 投票:0回答:8

我尝试通过 Selenium 抓取这个网站

我想单击“下一页”按钮,为此我这样做:

driver.find_element_by_class_name('pagination-r').click()

它适用于许多页面,但不适用于所有页面,我收到此错误

WebDriverException: Message: Element is not clickable at point (918, 13). Other element would receive the click: <div class="linkAuchan"></div>

始终适用于此页面

我读了这个问题

我尝试过这个

driver.implicitly_wait(10)
el = driver.find_element_by_class_name('pagination-r')
action = webdriver.common.action_chains.ActionChains(driver)
action.move_to_element_with_offset(el, 918, 13)
action.click()
action.perform()

但是我遇到了同样的错误

python selenium-webdriver web-scraping selenium-firefoxdriver
8个回答
205
投票

另一个元素覆盖了您尝试单击的元素。您可以使用

execute_script()
单击此按钮。

element = driver.find_element_by_class_name('pagination-r')
driver.execute_script("arguments[0].click();", element)

29
投票

因为元素在浏览器上不可见,所以首先需要向下滚动到该元素 这可以通过执行 javascript 来完成。

element = driver.find_element_by_class_name('pagination-r')
driver.execute_script("arguments[0].scrollIntoView();", element)
driver.execute_script("arguments[0].click();", element)

18
投票

我遇到了类似的问题,使用 ActionChains 无法解决我的错误: WebDriverException:消息:未知错误:元素在点处不可单击(5 74, 892)

如果你不想使用execute_script,我找到了一个很好的解决方案:

from selenium.webdriver.common.keys import Keys #need to send keystrokes

inputElement = self.driver.find_element_by_name('checkout')

inputElement.send_keys("\n") #send enter for links, buttons

inputElement.send_keys(Keys.SPACE) #for checkbox etc

3
投票

我已经编写了处理此类异常的逻辑。

   def find_element_click(self, by, expression, search_window=None, timeout=32, ignore_exception=None,
                       poll_frequency=4):
    """It find the element and click then  handle all type of exception during click

    :param poll_frequency:
    :param by:
    :param expression:
    :param timeout:
    :param ignore_exception:list It is a list of exception which is need to ignore.
    :return:
    """
    if ignore_exception is None:
        ignore_exception = []

    ignore_exception.append(NoSuchElementException)
    if search_window is None:
        search_window = self.driver

    end_time = time.time() + timeout
    while True:
        try:
            web_element = search_window.find_element(by=by, value=expression)
            web_element.click()
            return True
        except tuple(ignore_exception) as e:
            self.logger.debug(str(e))
            if time.time() > end_time:
                self.logger.exception(e)
                time.sleep(poll_frequency)
                break
        except Exception as e:
            raise
    return False

2
投票

如果您收到

element not clickable
错误,即使在对元素使用 wait 之后,也请尝试以下解决方法之一:

  • 使用
    Action
    移动到
    element
    的位置,然后在
    perform
     上运行 
    action
WebElement element = driver.findElement(By("element_path"));
Actions actions = new Actions(driver);
actions.moveToElement(element).click().perform();`
  • 检查
    element
    wait
    上是否有覆盖层或旋转器是否不可见
By spinnerimg = By.id("spinner ID");
WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds);
wait.until(ExpectedConditions.invisibilityOfElementLocated(spinnerimg ));

希望这有帮助


0
投票

我在 Chrome 驱动程序中遇到了类似的问题,将 chromeOptions 的

PageLoadStrategy
从“Eager”更改为
Normal
解决了我的问题。

chromeOptions.PageLoadStrategy = PageLoadStrategy.Normal;

0
投票

使用显式等待而不是隐式等待。

new WebDriverWait(TestingSession.Browser.WebDriver, TimeSpan.FromSeconds(10)).Until(ExpectedConditions.ElementExists((By.ClassName("pagination-r'")))); 

0
投票

请注意,我们遇到这个问题是因为我们在

.click()
元素上执行
Submit
操作。您可以在
.click()
 上执行 Button
.submit()
上执行
Submit
,两者之一,但您不应该混淆这两种方法。

.click()
.submit()

© www.soinside.com 2019 - 2024. All rights reserved.