【问题标题】:Selenium clicks an element 'successfully', yet, it is not actually clickedSelenium“成功”点击了一个元素,但实际上并没有点击它
【发布时间】:2016-02-11 21:11:48
【问题描述】:

我有一个单击按钮的方法,但是,当它运行时,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;
}

【问题讨论】:

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


【解决方案1】:

似乎该元素最初未启用或不可点击。为了回答您的问题,是的,您可以使用明确的等待并等待元素可点击:

WebDriverWait wait = new WebDriverWait(driver, timeOut);
wait.until(ExpectedConditions.elementToBeClickable(locator));

【讨论】:

  • 在与这个特定元素斗争并尝试了其他人的建议之后,这是最好的解决方案。但是,有时它会失败。在我的测试中元素可点击之后,我尽量避免使用 Thread.sleep(),为了让脚本不会失败,我不得不使用它。
【解决方案2】:

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

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

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

希望对你有帮助:)

【讨论】:

    【解决方案3】:

    在单击之前尝试滚动到该元素。这主要发生在您在 chrome 上进行测试时。你可以使用 JavaScriptExecutor 来滚动。

    类似这样的:

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

    【讨论】:

    • 谢谢你,但该元素位于页面顶部,我使用的是 firefox。
    • 你试过用 element.sendkeys(Keys.Enter) 或 element.sendkeys(Keys.return) 代替 click()
    【解决方案4】:

    您说您尝试过显式等待,但听起来您所要求的最好通过 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();
    

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

    【讨论】:

    • 我尝试使用 fluentWait,得到了相同的结果。问题是,selenium 成功通过了这一步,然而,它只是偶尔会被实际点击。我试过使用 css 和 xpath,我使用的元素没有分配给它的 id。 @marchocolate
    • 有趣。在您点击它五次的循环中,每次点击后,我都会调用 ConfirmPage(Next_Page) 方法。想想一个只能在下一页找到的元素,每次点击后都要寻找它。如果它在那里,那么点击就起作用了,你可以跳出循环。如果没有尝试再次单击。我会考虑一些代码并编辑它。
    • 即使按钮没有 id,但它确实有类“notkoButton listNew”,该类是否在页面的其他地方使用?
    • listNew 不在其他任何地方使用。我还尝试按类名和相同问题搜索元素。
    • 根据您的观察,该元素可见但未单击?在这些情况下对我有用的方法是调用 Driver.SwitchTo().DefaultContent();点击之前。它将确保该框架是默认框架(如果您之前正在处理警报/弹出窗口)。
    【解决方案5】:

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

    告诉我发生了什么事。

    【讨论】:

      【解决方案6】:

      我遇到了完全相同的问题,但只是在我将 selenium 库从 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));
      }
      

      【讨论】:

        【解决方案7】:

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

        在我的情况下,它与页面上的无效图像 src 属性有关(与我单击的按钮无关)。不管什么原因,修复图片链接解决了这个问题!

        我知道 OP 使用的是 Java 而不是 JS,但我自己的搜索把我带到了这里,所以其他使用 JavaScript 的人可能会以同样的方式出现。

        【讨论】:

          【解决方案8】:

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

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

          在我的情况下,几乎没有办法让元素没有准备好。我等了一会儿,但更重要的是我的测试用例正在填写一个非常大的表格,单击以启动下拉菜单的按钮非常简单,我可以看到它在我测试前将近半分钟加载与它交互,但每隔一段时间它仍然会失败。以至于我编写了一个愚蠢的 while 循环,每 100 毫秒单击一次,直到出现预期的下拉菜单。

          这都是猜测,但来自个人观察和该线程中其他人的一些 cmet - 例如一位用户提到他们在运行并行测试时注意到更多类似的问题,似乎表明似乎错过了事件的可能性,也许这是由于其架构引入的滞后。具体来说,我将此与赛普拉斯如何在没有中间服务器的情况下直接向浏览器提供本机命令的方式进行比较。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-11-03
            • 2021-03-15
            • 2022-01-14
            • 2021-12-31
            • 1970-01-01
            • 1970-01-01
            • 2019-05-23
            • 1970-01-01
            相关资源
            最近更新 更多