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

时间:2017-06-23 14:42:38

标签: java selenium selenium-webdriver webdriver katalon-studio

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

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

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

6 个答案:

答案 0 :(得分:18)

Element ... is not clickable at point (x, y). Other element would receive the click"可能因不同因素而导致。您可以通过以下任一过程解决这些问题:

  1. 由于JavaScript或AJAX调用而无法点击元素
  2. 尝试使用Actions类:

    WebElement element = driver.findElement(By.id("id1"));
    Actions actions = new Actions(driver);
    actions.moveToElement(element).click().build().perform();
    
    1. 元素未被点击,因为它不在Viewport
    2. 范围内

      尝试使用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. 在元素可点击之前,页面会刷新。
      2. 在这种情况下诱导一些wait

        1. 元素存在于DOM中但不可点击。
        2. 在这种情况下,为要点击的元素添加一些ExplicitWait

          WebDriverWait wait2 = new WebDriverWait(driver, 10);
          wait2.until(ExpectedConditions.elementToBeClickable(By.id("id1")));
          
          1. 元素存在,但有临时叠加。
          2. 在这种情况下,将 ExplicitWait ExpectedConditions 设置为 invisibilityOfElementLocated 是看不见的。

            WebDriverWait wait3 = new WebDriverWait(driver, 10);
            wait3.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("ele_to_inv")));
            
            1. 元素存在但具有永久叠加。
            2. 使用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)

我遇到了这个问题,因为我单击了展开的菜单选项,更改了可滚动区域的大小以及其他项目的位置。所以我只是让我的程序在菜单的上一级上单击回来,然后再次前进到我尝试访问的菜单上。它将菜单恢复到原始位置,因此不再发生此“单击被拦截”错误。

每次我单击一个可扩展菜单时,都不会发生此错误,仅当可扩展菜单选项已经完全位于其可滚动区域底部时。