【问题标题】:Chromedriver Element is not clickable at point (xxx, yyy). Other element would receive the click:Chromedriver 元素在点 (xxx, yyy) 不可点击。其他元素会收到点击:
【发布时间】:2015-09-09 23:13:52
【问题描述】:

在将 Chromedriver 与 Selenium 一起使用时,我遇到了以下可怕的错误:

"org.openqa.selenium.WebDriverException: Element is not clickable at point (xxx, yyy). Other element would receive the click: ..."

我知道这已经讨论过here

但是,如果我延迟大约 5 秒然后单击它,我的情况会有所不同。我不需要做任何特别的事情,请稍等。

我知道我可以通过使用 JS 或 Actions 来强制点击,但我想要一种更优雅的处理方式,即仅在按钮变为可点击时点击按钮。问题是我不知道如何检查按钮是否可点击。

我尝试了以下方法,但都不起作用:

1) ExpectedConditions.elementToBeClickable
2) ExpectedConditions.visibilityOf

有什么想法吗?

【问题讨论】:

  • 我想我可以编写一个方法来不断尝试点击,直到它成功点击,即延迟尝试/捕获?这会被认为是一个优雅的解决方案吗?我讨厌必须把 thread.sleeps 放在任何地方。

标签: java selenium selenium-chromedriver


【解决方案1】:

我能想到两个你可以尝试的选择:

JavaScript

检查描述文档加载状态的Document.readyState属性:

JavascriptExecutor jsExecutor = (JavascriptExecutor) input;
return jsExecutor.executeScript("return document.readyState;").equals("complete");

您可以等待它“完成”。在很多情况下可能不起作用,但值得一试。

循环

这可能是最简单的解决方案。不确定它的优雅,但应该在不浪费更多时间的情况下完成这项工作(这只是一个非常基本的示例,不应按原样使用此代码):

while (true) {
    try {
        element.click();
    } catch (WebDriverException e) {
        // ignore
        Thread.sleep(millis);
    }

【讨论】:

  • 感谢您的回复。循环选项是最后的手段,因为我认为它不优雅。我会测试JS版本并告诉你。
  • @ratsstack 好吧,请记住,许多“漂亮”的实现基本上只是在内部执行相同的循环 :) 例如,看看 Selenium FluentWait 类中的 until 方法。这就是它的基本功能。
  • 抱歉,我不清楚在这种情况下“输入”是什么?
  • @ratsstack 这是你的WebDriver实例
  • @ratsstack,While 循环应该有一些超时,否则代码将处于无限循环中。
【解决方案2】:

我使用自定义的 waitAndClick() 方法处理了这个问题,该方法使用如下递归:

int waitCounter = 0;

// Wait for an element to become clickable

public static void WaitAndClick(WebElement elementToBeClicked) throws InterruptedException, IOException {


    try
    {


        WebDriverWait wait = new WebDriverWait(driver, 20);
        WebDriverWait wait1 = new WebDriverWait(driver, 20);



        wait.until(ExpectedConditions.visibilityOf(elementToBeClicked));
                wait1.until(ExpectedConditions.elementToBeClickable(elementToBeClicked));

        elementToBeClicked.click();

    }

    catch(Exception  e)

    {
        MethodLibrary.Logger_Info("Element not clicked yet. waiting some more for " + elementToBeClicked);

        if(waitCounter <3){

            waitCounter++;

            WaitAndClick(elementToBeClicked);
        }

        waitCounter = 0;


    }



}

【讨论】:

    猜你喜欢
    • 2016-12-19
    • 2016-06-08
    • 2017-04-16
    • 2018-03-16
    • 2015-01-12
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 2018-10-26
    相关资源
    最近更新 更多