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

我正在尝试使用基于selenium的Katalon Studio进行一些测试。 在我的一个测试中,我必须在textarea内写。 问题是我收到以下错误:

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

实际上我的元素放在其他可能隐藏它的diva中,但是如何让click事件命中我的textarea呢?

Element ... is not clickable at point (x, y). Other element would receive the click" Element ... is not clickable at point (x, y). Other element would receive the click"可能由不同因素引起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. 元素未被点击,因为它不在Viewport中

尝试使用JavascriptExecutor将元素放在Viewport中:

 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. 元素存在但具有临时叠加。

在这种情况下,将ExplicitWaitExpectedConditions设置为invisibilityOfElementLocated以使Overlay不可见。

 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); 

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

要避免thread.sleep,请尝试坚持使用EventFiringWebDriver并为其注册句柄。 (根据您的应用程序的技术堆栈,您可以在处理程序中使用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,例如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() { 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(); } }