元素 MyElement 在点 (x, y) 处不可单击...其他元素将接收单击

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

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

事实上,我的元素被放置在其他一些可能隐藏它的女神中,但是我如何使点击事件命中我的文本区域?


答案 1

Element ... is not clickable at point (x, y). Other element would receive the click"可由不同的因素引起。您可以通过以下任一过程解决它们:

  1. 由于存在 JavaScript 或 AJAX 调用,元素未被点击

尝试使用类:Actions

WebElement element = driver.findElement(By.id("id1"));
Actions actions = new Actions(driver);
actions.moveToElement(element).click().build().perform();
  1. 元素未被单击,因为它不在视口

尝试使用 将元素引入视口: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.

WebElement myelement = driver.findElement(By.id("id1"));
JavascriptExecutor jse2 = (JavascriptExecutor)driver;
jse2.executeScript("arguments[0].scrollIntoView()", myelement); 
  1. 在元素可单击之前,页面将刷新。

在这种情况下,诱导一些.wait

  1. 元素存在于 DOM 中,但不可单击。

在本例中,为元素添加一些可单击的内容。ExplicitWait

WebDriverWait wait2 = new WebDriverWait(driver, 10);
wait2.until(ExpectedConditions.elementToBeClickable(By.id("id1")));
  1. 元素存在,但具有临时叠加。

在这种情况下,将显式等待预期条件设置为不可见的ElementLementDed诱导覆盖不可见。

WebDriverWait wait3 = new WebDriverWait(driver, 10);
wait3.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("ele_to_inv")));
  1. 元素存在,但具有永久叠加。

用于直接发送对元素的单击。JavascriptExecutor

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

答案 2

我假设,你已经检查过这里没有任何其他重叠的组件(透明的广告iframes或DOM的其他一些组件=>输入/文本字段元素中经常看到这样的东西),并且,当手动(缓慢)步进你的代码时,它工作顺利,那么ajax调用可能会导致这种行为。

若要避免 thread.sleep,请尝试坚持使用 EventFiringWebDriver 并向其注册一个句柄。(根据应用程序的技术堆栈,您可以在处理程序中将其用于Angular,JQuery或检票口,因此需要不同的实现)(顺便说一句:这种方法也让我摆脱了“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,例如javascriptExecutor来处理检票口/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();
    }
}

推荐