我正在尝试使用基于硒的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"
可能因不同因素而引起。您可以通过以下任一过程解决它们:
尝试使用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);
我假设,你已经检查过这里没有任何其他组件重叠(透明广告 - 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();
}
}
试试Thread.Sleep()
隐式 - Thread.Sleep()
所以这实际上并不是Selenium WebDriver的一个特性,但它是大多数编程语言中的常见功能。但没关系。
Thread.Sleep()完全按照你的想法做,它正在睡眠线程。因此,当您的程序运行时,在大多数情况下,该程序将进行一些自动检查,它们在一个线程上运行。因此,当我们调用Thread.Sleep时,我们指示我们的程序在一段时间内完全没有做任何事情,只是睡觉。无论我们的测试应用程序到底是什么,我们都不在乎,我们的支票正在休息时间!
但令人沮丧的是,在Selenium WebDriver GUI检查框架中看到Thread.Sleep()的一些实例是相当普遍的。偶然发生的是脚本会偶尔失败或失败,有人在本地运行它并意识到存在竞争,有时WedDriver正在失败。可能是应用程序有时需要更长时间才能加载,也许当它有更多数据时,所以为了修复它,它们会告诉WebDriver小睡,以确保在检查继续之前加载应用程序。
了Thread.sleep(5000);
提供的值以毫秒为单位,因此此代码将使检查睡眠5秒。
我在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'
),
)