元素 MyElement 在点 (x, y) 不可点击...其他元素将收到点击
Element MyElement is not clickable at point (x, y)... Other element would receive the click
我正在尝试使用基于硒的 Katalon Studio 进行一些测试。在我的一个测试中,我必须在一个文本区域内书写。问题是我收到以下错误:
...Element MyElement is not clickable at point (x, y)... Other element would receive the click...
事实上,我的元素被放置在其他一些可能隐藏它的 diva 中,但我怎样才能让点击事件击中我的文本区域?
Element ... is not clickable at point (x, y). Other element would receive the click"
可能由不同的因素引起。您可以通过以下任一过程解决它们:
- 由于 JavaScript 或 AJAX 调用存在
,元素未被点击
尝试使用Actions
Class:
WebElement element = driver.findElement(By.id("id1"));
Actions actions = new Actions(driver);
actions.moveToElement(element).click().build().perform();
- 元素未被点击,因为它不在 Viewport
内
尝试使用 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);
- 在元素可点击之前页面正在刷新。
在这种情况下归纳出一些wait
.
- 元素存在于 DOM 但不可点击。
在这种情况下,为可点击的元素添加一些 ExplicitWait
。
WebDriverWait wait2 = new WebDriverWait(driver, 10);
wait2.until(ExpectedConditions.elementToBeClickable(By.id("id1")));
- 元素存在但有临时覆盖。
在这种情况下,将 ExplicitWait
与 ExpectedConditions
设置为 invisibilityOfElementLocated
让叠加层不可见。
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 的某些其他组件 => 在 [=23= 中经常看到这样的东西] 元素),并且当手动(缓慢地)步进您的代码时,它运行顺利,然后 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 techstack
中处理 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();
}
}
试试 Thread.Sleep()
隐式 - Thread.Sleep()
所以这实际上不是 Selenium WebDriver 的一个特性,但它是大多数编程语言中的一个常见特性。
但是 none 那件事。
Thread.Sleep() 完全按照你的想法去做,它让线程休眠。因此,当您的程序运行时,在大多数情况下,该程序将进行一些自动检查,它们在线程上 运行 。
所以当我们调用 Thread.Sleep 时,我们是在指示我们的程序在一段时间内什么都不做,只是睡觉。
我们的被测应用程序在做什么并不重要,我们不在乎,我们的检查正在打盹!
令人沮丧的是,在 Selenium WebDriver GUI 检查框架中看到 Thread.Sleep() 的几个实例是相当普遍的。
往往会发生的是脚本会失败或偶尔失败,有人在本地运行它并意识到存在竞争,有时 WedDriver 会失败。可能是应用程序有时需要更长的时间来加载,也许当它有更多数据时,所以为了修复它,他们告诉 WebDriver 小睡一下,以确保在检查继续之前加载应用程序。
Thread.sleep(5000);
提供的值以毫秒为单位,因此此代码将使检查休眠 5 秒。
正如@DebanjanB 所说,您的按钮(或另一个元素)可能会暂时被另一个元素覆盖,但您可以等待并单击它,即使您不知道哪个元素覆盖了按钮。
为此,您可以使用单击操作定义自己的 ExpectedCondition:
public class SuccessfulClick implements ExpectedCondition<Boolean> {
private WebElement element;
public SuccessfulClick(WebElement element) { //WebElement element
this.element = element;
}
@Override
public Boolean apply(WebDriver driver) {
try {
element.click();
return true;
} catch (ElementClickInterceptedException | StaleElementReferenceException | NoSuchElementException e) {
return false;
}
}
}
然后使用这个:
WebDriverWait wait10 = new WebDriverWait(driver, 10);
wait10.until(elementToBeClickable(btn));
wait10.until(new SuccessfulClick(btn));
我遇到了这个问题,因为我点击了一个展开的菜单选项,改变了可滚动区域的大小和其他项目的位置。所以我只是让我的程序点击菜单的下一级,然后再次前进,到我试图访问的菜单级别。它将菜单放回到原来的位置,这样 "click intercepted" 错误就不会再发生了。
错误并没有在我每次单击可扩展菜单时发生,只有当可扩展菜单选项已经完全位于其可滚动区域的底部时才会发生。
我正在尝试使用基于硒的 Katalon Studio 进行一些测试。在我的一个测试中,我必须在一个文本区域内书写。问题是我收到以下错误:
...Element MyElement is not clickable at point (x, y)... Other element would receive the click...
事实上,我的元素被放置在其他一些可能隐藏它的 diva 中,但我怎样才能让点击事件击中我的文本区域?
Element ... is not clickable at point (x, y). Other element would receive the click"
可能由不同的因素引起。您可以通过以下任一过程解决它们:
- 由于 JavaScript 或 AJAX 调用存在 ,元素未被点击
尝试使用Actions
Class:
WebElement element = driver.findElement(By.id("id1"));
Actions actions = new Actions(driver);
actions.moveToElement(element).click().build().perform();
- 元素未被点击,因为它不在 Viewport 内
尝试使用 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);
- 在元素可点击之前页面正在刷新。
在这种情况下归纳出一些wait
.
- 元素存在于 DOM 但不可点击。
在这种情况下,为可点击的元素添加一些 ExplicitWait
。
WebDriverWait wait2 = new WebDriverWait(driver, 10);
wait2.until(ExpectedConditions.elementToBeClickable(By.id("id1")));
- 元素存在但有临时覆盖。
在这种情况下,将 ExplicitWait
与 ExpectedConditions
设置为 invisibilityOfElementLocated
让叠加层不可见。
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 的某些其他组件 => 在 [=23= 中经常看到这样的东西] 元素),并且当手动(缓慢地)步进您的代码时,它运行顺利,然后 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 techstack
中处理 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();
}
}
试试 Thread.Sleep()
隐式 - Thread.Sleep()
所以这实际上不是 Selenium WebDriver 的一个特性,但它是大多数编程语言中的一个常见特性。 但是 none 那件事。
Thread.Sleep() 完全按照你的想法去做,它让线程休眠。因此,当您的程序运行时,在大多数情况下,该程序将进行一些自动检查,它们在线程上 运行 。 所以当我们调用 Thread.Sleep 时,我们是在指示我们的程序在一段时间内什么都不做,只是睡觉。 我们的被测应用程序在做什么并不重要,我们不在乎,我们的检查正在打盹!
令人沮丧的是,在 Selenium WebDriver GUI 检查框架中看到 Thread.Sleep() 的几个实例是相当普遍的。 往往会发生的是脚本会失败或偶尔失败,有人在本地运行它并意识到存在竞争,有时 WedDriver 会失败。可能是应用程序有时需要更长的时间来加载,也许当它有更多数据时,所以为了修复它,他们告诉 WebDriver 小睡一下,以确保在检查继续之前加载应用程序。
Thread.sleep(5000);
提供的值以毫秒为单位,因此此代码将使检查休眠 5 秒。
正如@DebanjanB 所说,您的按钮(或另一个元素)可能会暂时被另一个元素覆盖,但您可以等待并单击它,即使您不知道哪个元素覆盖了按钮。
为此,您可以使用单击操作定义自己的 ExpectedCondition:
public class SuccessfulClick implements ExpectedCondition<Boolean> {
private WebElement element;
public SuccessfulClick(WebElement element) { //WebElement element
this.element = element;
}
@Override
public Boolean apply(WebDriver driver) {
try {
element.click();
return true;
} catch (ElementClickInterceptedException | StaleElementReferenceException | NoSuchElementException e) {
return false;
}
}
}
然后使用这个:
WebDriverWait wait10 = new WebDriverWait(driver, 10);
wait10.until(elementToBeClickable(btn));
wait10.until(new SuccessfulClick(btn));
我遇到了这个问题,因为我点击了一个展开的菜单选项,改变了可滚动区域的大小和其他项目的位置。所以我只是让我的程序点击菜单的下一级,然后再次前进,到我试图访问的菜单级别。它将菜单放回到原来的位置,这样 "click intercepted" 错误就不会再发生了。
错误并没有在我每次单击可扩展菜单时发生,只有当可扩展菜单选项已经完全位于其可滚动区域的底部时才会发生。