Java 元素MyElement在点(x,y)处不可单击。。。其他元素将收到单击

Java 元素MyElement在点(x,y)处不可单击。。。其他元素将收到单击,java,selenium,selenium-webdriver,webdriver,katalon-studio,Java,Selenium,Selenium Webdriver,Webdriver,Katalon Studio,我正在尝试使用基于硒的Katalon Studio进行一些测试。在我的一次测试中,我必须在文本区域内书写。问题是我得到了以下错误: ...Element MyElement is not clickable at point (x, y)... Other element would receive the click... 事实上,我的元素被放在其他一些可能会隐藏它的diva中,但我如何才能使单击事件击中我的文本区域?元素。。。在点(x,y)处不可单击。其他元素将收到单击“可能是由于不同的因

我正在尝试使用基于硒的Katalon Studio进行一些测试。在我的一次测试中,我必须在文本区域内书写。问题是我得到了以下错误:

...Element MyElement is not clickable at point (x, y)... Other element would receive the click...

事实上,我的元素被放在其他一些可能会隐藏它的diva中,但我如何才能使单击事件击中我的文本区域?

元素。。。在点(x,y)处不可单击。其他元素将收到单击“
可能是由于不同的因素引起的。您可以通过以下任一过程解决这些问题:

  • 由于存在JavaScript或AJAX调用,无法单击元素
  • 尝试使用
    操作
    类:

    WebElement element = driver.findElement(By.id("id1"));
    Actions actions = new Actions(driver);
    actions.moveToElement(element).click().build().perform();
    
  • 元素未被单击,因为它不在
  • 尝试使用
    JavascriptExecutor
    将元素置于视口中:

    JavascriptExecutor jse1 = (JavascriptExecutor)driver;
    jse1.executeScript("scroll(250, 0)"); // if the element is on top.
    jse1.executeScript("scroll(0, 250)"); // if the element is at bottom.
    

  • 在元素可单击之前,页面正在刷新
  • 在这种情况下,诱导一些
    等待

  • 元素存在于DOM中,但不可单击
  • 在这种情况下,为可单击的元素添加一些
    ExplicitWait

    WebDriverWait wait2 = new WebDriverWait(driver, 10);
    wait2.until(ExpectedConditions.elementToBeClickable(By.id("id1")));
    
  • 元素存在,但具有临时覆盖
  • 在这种情况下,将
    设置为
    以使覆盖不可见,从而诱导

    WebDriverWait wait3 = new WebDriverWait(driver, 10);
    wait3.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("ele_to_inv")));
    
  • 元素存在,但具有永久覆盖层
  • 使用
    JavascriptExecutor
    直接发送对元素的单击

    WebElement ele = driver.findElement(By.xpath("element_xpath"));
    JavascriptExecutor executor = (JavascriptExecutor)driver;
    executor.executeScript("arguments[0].click();", ele);
    

    元素…在点(x,y)处不可单击。其他元素将收到单击“
    可能是由于不同的因素造成的。您可以通过以下任一过程解决这些问题:

  • 由于存在JavaScript或AJAX调用,无法单击元素
  • 尝试使用
    操作
    类:

    WebElement element = driver.findElement(By.id("id1"));
    Actions actions = new Actions(driver);
    actions.moveToElement(element).click().build().perform();
    
  • 元素未被单击,因为它不在
  • 尝试使用
    JavascriptExecutor
    将元素置于视口中:

    JavascriptExecutor jse1 = (JavascriptExecutor)driver;
    jse1.executeScript("scroll(250, 0)"); // if the element is on top.
    jse1.executeScript("scroll(0, 250)"); // if the element is at bottom.
    

  • 在元素可单击之前,页面正在刷新
  • 在这种情况下,诱导一些
    等待

  • 元素存在于DOM中,但不可单击
  • 在这种情况下,为可单击的元素添加一些
    ExplicitWait

    WebDriverWait wait2 = new WebDriverWait(driver, 10);
    wait2.until(ExpectedConditions.elementToBeClickable(By.id("id1")));
    
  • 元素存在,但具有临时覆盖
  • 在这种情况下,将
    设置为
    以使覆盖不可见,从而诱导

    WebDriverWait wait3 = new WebDriverWait(driver, 10);
    wait3.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("ele_to_inv")));
    
  • 元素存在,但具有永久覆盖层
  • 使用
    JavascriptExecutor
    直接发送对元素的单击

    WebElement ele = driver.findElement(By.xpath("element_xpath"));
    JavascriptExecutor executor = (JavascriptExecutor)driver;
    executor.executeScript("arguments[0].click();", ele);
    

    我假设,您已经检查过这里没有任何其他组件重叠(透明广告iframe或DOM=>的某些其他组件在input/textfield元素中非常常见),并且,当手动(缓慢)步进代码时,它工作顺利,那么ajax调用可能会导致这种行为

    要避免thread.sleep,请尝试坚持使用EventFiringWebDriver并为其注册句柄。 (根据应用程序的techstack,您可以在处理程序中为Angular、JQuery或wicket使用它,因此需要不同的实现) (顺便说一句:这种方法也让我多次摆脱了“StaleElementException”之类的东西)

    见: org.openqa.selenium.support.events.EventFiringWebDriver org.openqa.selenium.support.events.WebDriverEventListener

    driveme = new ChromeDriver();
    driver = new EventFiringWebDriver(driveme);
    ActivityCapture handle=new ActivityCapture();
    driver.register(handle);
    
    =>ActivityCapture实现WebDriverEventListener e、 g.javascriptExecutor在wicket/dojo技术堆栈中处理Ajax调用

        @Override
    public void beforeClickOn(WebElement arg0, WebDriver event1) {
        try {
            System.out.println("After click "+arg0.toString());
            //System.out.println("Start afterClickOn - timestamp: System.currentTimeMillis(): " + System.currentTimeMillis());
            JavascriptExecutor executor = (JavascriptExecutor) event1;
            StringBuffer javaScript = new StringBuffer();
            javaScript.append("for (var c in Wicket.channelManager.channels) {");
            javaScript.append(" if (Wicket.channelManager.channels[c].busy) {");
            javaScript.append(" return true;");
            javaScript.append(" }");
            ;
            ;
            ;
            javaScript.append("}");
            javaScript.append("return false;");
            //Boolean result = (Boolean) executor.executeScript(javaScript.toString());
            WebDriverWait wait = new WebDriverWait(event1, 20);
            wait.until(new ExpectedCondition<Boolean>() {
                public Boolean apply(WebDriver driver) {
                    return !(Boolean) executor.executeScript(javaScript.toString());
                }
            });
            //System.out.println("End afterClickOn - timestamp: System.currentTimeMillis(): " + System.currentTimeMillis());
        } catch (Exception ex) {
            //ex.printStackTrace();
        }
    }
    
    @覆盖
    单击之前的公共无效(WebElement arg0,WebDriver event1){
    试一试{
    System.out.println(“单击“+arg0.toString()”后);
    //System.out.println(“点击后启动-时间戳:System.currentTimeMillis():”+System.currentTimeMillis());
    JavascriptExecutor executor=(JavascriptExecutor)事件1;
    StringBufferJavaScript=新的StringBuffer();
    append(“for(Wicket.channelManager.channels中的var c){”);
    append(“if(Wicket.channelManager.channels[c].busy){”);
    append(“return true;”;
    append(“}”);
    ;
    ;
    ;
    append(“}”);
    append(“return false;”;
    //布尔结果=(布尔)executeScript(javaScript.toString());
    WebDriverWait wait=新的WebDriverWait(事件1,20);
    等待.直到(新的ExpectedCondition(){
    公共布尔应用(WebDriver驱动程序){
    return!(布尔值)executeScript(javaScript.toString());
    }
    });
    //System.out.println(“点击后结束-时间戳:System.currentTimeMillis():”+System.currentTimeMillis());
    }捕获(例外情况除外){
    //例如printStackTrace();
    }
    }
    
    我假设,您已经检查过这里没有任何其他组件重叠(透明广告iframes或DOM的其他组件=>在input/textfield元素中经常看到这种情况),并且,当手动(缓慢)步进您的代码时,它工作顺利,那么ajax调用可能会导致这种行为

    要避免thread.sleep,请尝试坚持使用EventFiringWebDriver并为其注册句柄。 (根据应用程序的techstack,您可以在处理程序中为Angular、JQuery或wicket使用它,因此需要不同的实现) (顺便说一句:这种方法也让我多次摆脱了“StaleElementException”之类的东西)

    见: org.openqa.selenium.support.events.EventFiringWebDriver org.openqa.selenium.support.events.WebDriverEventListener

    driveme = new ChromeDriver();
    driver = new EventFiringWebDriver(driveme);
    ActivityCapture handle=new ActivityCapture();
    driver.register(handle);
    
    =>ActivityCapture实现WebDriverEventListener e、 g.javascriptExecutor在wicket/dojo技术堆栈中处理Ajax调用

        @Override
    public void beforeClickOn(WebElement arg0, WebDriver event1) {
        try {
            System.out.println("After click "+arg0.toString());
            //System.out.println("Start afterClickOn - timestamp: System.currentTimeMillis(): " + System.currentTimeMillis());
            JavascriptExecutor executor = (JavascriptExecutor) event1;
            StringBuffer javaScript = new StringBuffer();
            javaScript.append("for (var c in Wicket.channelManager.channels) {");
            javaScript.append(" if (Wicket.channelManager.channels[c].busy) {");
            javaScript.append(" return true;");
            javaScript.append(" }");
            ;
            ;
            ;
            javaScript.append("}");
            javaScript.append("return false;");
            //Boolean result = (Boolean) executor.executeScript(javaScript.toString());
            WebDriverWait wait = new WebDriverWait(event1, 20);
            wait.until(new ExpectedCondition<Boolean>() {
                public Boolean apply(WebDriver driver) {
                    return !(Boolean) executor.executeScript(javaScript.toString());
                }
            });
            //System.out.println("End afterClickOn - timestamp: System.currentTimeMillis(): " + System.currentTimeMillis());
        } catch (Exception ex) {
            //ex.printStackTrace();
        }
    }
    
    @覆盖
    单击之前的公共无效(WebElement arg0,WebDrive