Selenium成功点击了一个元素,但实际上并没有点击它

时间:2015-11-10 20:50:05

标签: java selenium testing selenium-webdriver automated-tests

我有一个单击按钮的方法,但是,当它运行时,selenium会在成功点击时返回结果,而实际上,实际上并未实际点击该按钮。如果我多次运行测试,偶尔会按预期点击它。我将我的测试框架设置为隐式等待大约15秒,我已经设置了明确的等待这个元素,但仍然看到相同的问题。当我<element>.isDisplayed()时,始终找到该元素。我将.click放在一个while循环中,点击它几次,大部分时间都有效,但是,有时测试失败了。是否可以在单击按钮之前使用if语句检查元素是否实际显示?

我试过了:

if(!element.isDisplayed){
    element.click
}

以下是我遇到问题的按钮:

<button class="notkoButton listNew">
<div class="l6e iconAdd">New List</div>
</button>

这是我的方法:

public marketing_lists_page navigateToNewListPage() throws Throwable {
    try {
        int x = 0;
        while(x < 5) {
            newListBtn.click();
            x++;
        }
       //newListPageHeader.isDisplayed();
    } catch (NoSuchElementException e){
        logs.errorDetails("Could not navigate to New List Page");
        Assert.fail();
    }
    return this;
}

8 个答案:

答案 0 :(得分:4)

似乎元素最初未启用或无法点击。要回答你的问题,是的,你可以使用明确的等待并等待元素可点击:

{{1}}

答案 1 :(得分:2)

试试这个,点击使用javascript并随意根据您的方便更改元素的位置: -

WebElement element= driver.findElement(By.xpath("YOUR XPATH"));

JavascriptExecutor executor = (JavascriptExecutor) driver;
executor.executeScript("arguments[0].click();", element);

希望它会对你有所帮助:)。

答案 2 :(得分:1)

在点击之前尝试滚动到该元素。当你在chrome上测试时,这通常会发生。您可以使用JavaScriptExecutor滚动。

这样的事情:

JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("window.scrollTo(0," + element.getLocation().Y + ")"); 

答案 3 :(得分:0)

你说你已经尝试了明确的等待,但听起来你要求的最好是通过fluentWait(这是明确等待的类型)来完成:

public WebElement fluentWait(final By locator) {
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
        .withTimeout(30, TimeUnit.SECONDS)
        .pollingEvery(5, TimeUnit.SECONDS)
        .ignoring(NoSuchElementException.class);

WebElement foo = wait.until(new Function<WebDriver, WebElement>() {
    public WebElement apply(WebDriver driver) {
        return driver.findElement(locator);
    }
});

return  foo; };;

此处WebElement将是您尝试单击的按钮。关于FluentWait的一个很酷的事情是,如果找到它,则返回元素本身。来自文档:

Wait接口的实现,可以动态配置其超时和轮询间隔。每个FluentWait实例定义等待条件的最大时间量,以及检查条件的频率。此外,用户可以将等待配置为在等待时忽略特定类型的异常,例如在页面上搜索元素时的NoSuchElementExceptions。

使用它只需:

WebElement newListBtn = fluentWait(By.id("button"));

还可以尝试:

Driver.SwitchTo().DefaultContent();

点击之前以防它是一个框架问题。

答案 4 :(得分:0)

Selenium缺乏GUI“活力”。 我建议你在点击后向页面发送刷新。

告诉我发生了什么事。

答案 5 :(得分:0)

我遇到了完全相同的问题,但只是在我将硒库从2.45更新到2.48.2之后。 “点击”方法调用永远不会失败,这意味着驱动程序总能找到该元素,我认为它未能做到的是单击正确的点可能。我的测试可以在更高分辨率的屏幕上正常运行,并且有时会在较低分辨率屏幕上通过(但主要是由于点击问题而失败)。我尝试了很多东西,但最终对我有用的是ZOOM。

在运行测试之前,我调用以下方法,“click”方法现在可以在低分辨率屏幕上正常工作。

public void zoomOut () {
        WebElement html = driver.findElement(By.tagName("html"));
        html.sendKeys(Keys.chord(Keys.CONTROL, Keys.SUBTRACT));
}

答案 6 :(得分:0)

在使用JavaScript WebDriver时,我在表面上遇到了类似的问题-click()承诺成功解决,但是什么也没发生。

在我看来,这与页面上的无效图片src属性有关(与我单击的按钮无关)。无论出于何种原因,修复图像链接都可以解决问题!

我知道OP正在使用Java而不是JS,但是我自己的搜索将我带到了这里,因此其他使用JavaScript的人也可能会以同样的方式来

答案 7 :(得分:0)

我注意到点击次数也与硒不一致,这在一定程度上似乎是一个已知问题:

https://github.com/SeleniumHQ/selenium/issues/4075

在我的情况下,实际上没有办法准备好该元素。我等了一下,但更重要的是,我的测试用例填写的是一个非常大的表格,单击该按钮以启动下拉菜单非常简单,我可以看到它在测试前半分钟就已加载与之互动,但仍然经常失败。直到我写了一个愚蠢的while循环,每100毫秒单击一次,直到出现预期的下拉列表。

这都是猜测,只是基于个人观察以及该线程中其他人员的评论-例如一位用户提到,他们在运行并行测试时注意到更多类似问题,似乎表明似乎有可能错过了事件,这可能是由于其架构引入的滞后。具体地说,我将这与赛普拉斯如何直接使用不带中间服务器的浏览器的本机命令进行比较。