使用Selenium WebDriverWait等待元素可点击不起作用

时间:2016-09-05 14:09:15

标签: java selenium

我想点击一个菜单项。

然而就在这次点击之前,在我的测试流程中,我有一个模态打开,这可以防止单击菜单项。此外,当关闭时,模态会褪色而不是立即消失。

我所做的是关闭菜单项,然后在执行点击之前等待菜单项可点击:

    WebDriverWait wait = new WebDriverWait(getDriver(), time);
    wait.withMessage(message);
    try {
        wait.until(ExpectedConditions.elementToBeClickable(locator));
    } catch (Exception e) {
        Logging.logException(e);
    }

    clickOn(locator);

但是这不起作用,因为我每次都在运行以下异常:

org.openqa.selenium.WebDriverException: unknown error: Element is not clickable at point (158, 565). Other element would receive the click: <div class="globalpopup with-data slideout">...</div>

我也有Selenium设置每次发生异常时截取屏幕截图,在屏幕截图中我可以清楚地看到模态正在逐渐淡出。 因此,单击它的关闭按钮,但此时我认为等待应该生效并暂停执行,直到模态完全消失并且可以单击菜单项。这不会发生。

现在我通常通过添加一点睡眠时间来解决这个问题,因为它可以预测模态淡出需要多长时间。但是我真的想找出一个更优雅的解决方案,它可以适用于所有情况。

我的理解是elementToBeClickable不考虑元素何时被另一个元素覆盖,我觉得很傻。有没有办法模拟这样的等待(notCoveredByOtherElement),因为它正是我需要的?

P.S。我正在使用Selenium 2.53。还没有尝试过v3,虽然如果有人能确认在这个新版本中正确处理了这个案例,我很乐意开始切换到它。

1 个答案:

答案 0 :(得分:-1)

我也遇到过这个问题的时间,并尝试了一些对我有用的解决方案。

1 - 将Chrome驱动程序更新为最新的2.23

2 - 获取坐标,然后单击链接或按钮

3 - 尝试使用Y坐标

单击
// Find an element
 WebElement elementToClick = driver.findElement(By.xpath("Your xpath"));

// Scroll the browser to the element's Y position
((JavascriptExecutor)driver).executeScript("window.scrollTo(0,"+elementToClick.getLocation().y+")");

// Click the element

elementToClick.click();

// Find an element

WebElement elementToClick = driver.findElement(By.xpath("Your xpath"));


// Scroll the browser to the element's Y position

((JavascriptExecutor)driver).executeScript("window.scrollTo(0,"+elementToClick.getLocation().y+")");

 // Click the element
 elementToClick.click();

我已经记录了以下所有链接,请检查

Solutions for Element is not clickable in Selenium