有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Chromedriver元素在点(xxx,yyy)处不可单击。其他元素将收到单击:

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

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

我知道这已经讨论过了here

然而,我的情况是有点不同的意义上说,如果我把一个约5秒的延迟,然后点击它的工程罚款。我不需要做什么特别的事,就等着吧

我知道我可以通过使用JS或操作来强制点击,但我想要一种更优雅的方式来处理这个问题,即只有当按钮变得可点击时才点击按钮。问题是我不知道如何检查按钮是否可点击

我尝试了以下方法,但都没有成功:

1) ExpectedConditions.elementToBeClickable
2) ExpectedConditions.visibilityOf

有什么想法吗


共 (2) 个答案

  1. # 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);
        }
    
  2. # 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;
    
    
        }
    
    
    
    }