我正在尝试使用基于硒的Katalon Studio进行一些测试。在我的一个测试中,我必须在textarea内写。问题是我收到以下错误:
...Element MyElement is not clickable at point (x, y)... Other element would receive the click...
事实上,我的元素位于其他可能隐藏它的diva中但是如何让click事件命中我的textarea?
答案 0 :(得分:18)
Element ... is not clickable at point (x, y). Other element would receive the click"
可能因不同因素而导致。您可以通过以下任一过程解决这些问题:
尝试使用Actions
类:
WebElement element = driver.findElement(By.id("id1"));
Actions actions = new Actions(driver);
actions.moveToElement(element).click().build().perform();
尝试使用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);
在这种情况下诱导一些wait
。
在这种情况下,为要点击的元素添加一些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);
答案 1 :(得分:3)
我假设,你已经检查过这里没有任何其他组件重叠(透明广告 - 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 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();
}
}
答案 2 :(得分:0)
尝试Thread.Sleep()
隐含-Thread.Sleep()
因此,这实际上不是Selenium WebDriver的功能,但它是大多数编程语言中的常见功能。 但这无关紧要。
Thread.Sleep()完全按照您的想法去做,它使线程休眠。因此,当您的程序运行时,在大多数情况下,该程序将进行一些自动检查,它们正在线程上运行。 因此,当我们调用Thread.Sleep时,我们正在指示程序在一段时间内完全不执行任何操作,只是睡觉。 不管我们的测试中的应用程序做什么,我们都不在乎,我们的检查正在小睡一会!
令人沮丧的是,在Selenium WebDriver GUI检查框架中看到Thread.Sleep()的一些实例相当普遍。 可能发生的情况是脚本会失败或偶尔失败,有人在本地运行该脚本并意识到存在竞争,有时WedDriver会失败。可能是因为应用程序有时需要花费更长的时间才能加载,也许是在它有更多数据时,因此要对其进行修复,他们告诉WebDriver小睡一会儿,以确保在继续检查之前加载该应用程序。
Thread.sleep(5000);
提供的值以毫秒为单位,因此此代码会使检查休眠5秒钟。
答案 3 :(得分:0)
我在Python上发表了一篇关于此的文章,并被标记为重复,使我转为这篇文章。我尝试了在这里找到的所有内容以及其他一些帖子。
问题是我在Select元素中获取了异常,并且即使我尝试了脚本,也无法使用脚本来单击它。
由于我想使用可见文本(而不是按值或选项号)选择元素,因此我使用了以下代码,其中包括通过Xpath [contains(text(),'text')]查找元素,然后更改html。也许对另一个有用。
self.driver.execute_script(
"arguments[0].selected=true",
self.driver.find_element_by_xpath(
'//*[contains(text(), "%s" )]' % 'your_visible_text'
),
)
答案 4 :(得分:0)
正如@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));
答案 5 :(得分:-2)
我遇到了这个问题,因为我单击了展开的菜单选项,更改了可滚动区域的大小以及其他项目的位置。所以我只是让我的程序在菜单的上一级上单击回来,然后再次前进到我尝试访问的菜单上。它将菜单恢复到原始位置,因此不再发生此“单击被拦截”错误。
每次我单击一个可扩展菜单时,都不会发生此错误,仅当可扩展菜单选项已经完全位于其可滚动区域底部时。