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

问题描述 投票:13回答:4

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

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

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

java selenium selenium-webdriver webdriver katalon-studio
4个回答
19
投票

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为覆盖是看不见的。

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

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

0
投票

试试Thread.Sleep()

隐式 - Thread.Sleep()

所以这实际上并不是Selenium WebDriver的一个特性,但它是大多数编程语言中的常见功能。但没关系。

Thread.Sleep()完全按照你的想法做,它正在睡眠线程。因此,当您的程序运行时,在大多数情况下,该程序将进行一些自动检查,它们在一个线程上运行。因此,当我们调用Thread.Sleep时,我们指示我们的程序在一段时间内完全没有做任何事情,只是睡觉。无论我们的测试应用程序到底是什么,我们都不在乎,我们的支票正在休息时间!

但令人沮丧的是,在Selenium WebDriver GUI检查框架中看到Thread.Sleep()的一些实例是相当普遍的。偶然发生的是脚本会偶尔失败或失败,有人在本地运行它并意识到存在竞争,有时WedDriver正在失败。可能是应用程序有时需要更长时间才能加载,也许当它有更多数据时,所以为了修复它,它们会告诉WebDriver小睡,以确保在检查继续之前加载应用程序。

了Thread.sleep(5000);

提供的值以毫秒为单位,因此此代码将使检查睡眠5秒。


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'
    ),
)
© www.soinside.com 2019 - 2024. All rights reserved.