Java 元素MyElement在点(x,y)处不可单击。。。其他元素将收到单击
我正在尝试使用基于硒的Katalon Studio进行一些测试。在我的一次测试中,我必须在文本区域内书写。问题是我得到了以下错误: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)处不可单击。其他元素将收到单击“可能是由于不同的因
...Element MyElement is not clickable at point (x, y)... Other element would receive the click...
事实上,我的元素被放在其他一些可能会隐藏它的diva中,但我如何才能使单击事件击中我的文本区域?
元素。。。在点(x,y)处不可单击。其他元素将收到单击“
可能是由于不同的因素引起的。您可以通过以下任一过程解决这些问题:
操作
类:
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.
或
等待
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