Bootstrap Popover的Selenium ElementNotVisibleException

时间:2013-12-22 20:53:03

标签: java twitter-bootstrap selenium acceptance-testing

我正在使用Selenium 2.37.1和Chrome Driver 2.7(在Ubuntu 13.10上使用Chrome 31.0.1650.63)为我的基于Java / Spring / Boostrap的网站编写一些测试。

测试单击“登录”文本,然后在单击“提交”按钮之前尝试在表单中输入提供的用户名和密码。我已经分解了元素的发现并调用了sendKeys来确定Selenium的跟踪位置(它在username.sendKeys上)

public void login(final String user) {
    webDriver.findElement(By.id("login")).click();
    final WebElement loginForm = webDriver.findElement(By.id("loginForm"));
    final WebElement username = loginForm.findElement(By.id("username"));
    username.sendKeys(user);
    final WebElement password = loginForm.findElement(By.id("password"));
    password.sendKeys(dslConstants.PASSWORD);
    loginForm.submit();
}

成功找到用户名,但是当我实际显示时运行username.isDisplayed()

enter image description here

我假设这与Selenium无法正确处理Bootstrap popovers,并想知道是否有人对此有任何修复?

提前致谢。

编辑: 调试时可见loginForm.isDisplayed()也会返回false。我也试过添加一个等待条件,这也不能解决问题。

final WebDriverWait wait = new WebDriverWait(webDriver, TIME_OUT_IN_SECONDS);
wait.until(ExpectedConditions.visibilityOf(webDriver.findElement(By.id("username"))));

EDIT2: 这是页面的HTML / JSTL方面。

<div class="navbar">
        <ul class="nav navbar-nav">
            <li><a href="/">Home</a></li>
            <sec:authorize ifAnyGranted="ROLE_ANONYMOUS">
                <div class="hide" id="login-popover">
                    <form role="form" id="loginForm" method="post" action="j_spring_security_check">
                        <div class="control-group">
                            <label class="control-label" for="username">Username</label>
                            <div class="controls">
                                <input type="text" id="username" class="form-control" name="j_username" />
                            </div>
                        </div>
                        <div class="control-group">
                            <label class="control-label" for="password">Password</label>
                            <div class="controls">
                                <input type="password" id="password" class="form-control" name="j_password" />
                            </div>
                        </div>
                        &nbsp;
                        <div class="control-group">
                            <div class="controls">
                                <button class="btn btn-primary" type="submit">Login</button>
                            </div>
                        </div>
                    </form>
                </div>
                <li><a href="#" id="login">Login</a></li>
                <li><a href="/accounts/register">Register</a></li>
            </sec:authorize>
        </ul>
    </div>

编辑3: 使用FireFox 25

时也会发生这种情况

2 个答案:

答案 0 :(得分:0)

尝试移动到popover元素,使其在与之交互之前可见。类似的东西:

    WebElement element = webDriver.findElement(By.id("login-popover"));
    Actions actions = new Actions(driver);
    actions.moveToElement(element).build().perform();

然后做你的等待序列。如果你必须单击元素才能显示它,那么你可以在build()之前完成它。

答案 1 :(得分:0)

我设法解决了这个问题。在调试和检查网页(使用Chrome)时,我注意到实际上有两种登录表单。

enter image description here

我可以通过在另一个文件中声明登录表单html(或在单击Login链接时执行的Javascript中)来解决这个问题。无论哪种方式,通过执行webDriver.findElement(By.class(“popover-content”))然后在其中搜索表单解决了我的问题。

public void login(final String user) {
    webDriver.findElement(By.id("login")).click();
    final WebElement loginForm = webDriver.findElement(By.class("popover-content)).findElement(By.id("loginForm"));
    loginForm.findElement(By.id("username")).sendKeys(user);
    loginForm.findElement(By.id("password"))password.sendKeys(dslConstants.PASSWORD);
    loginForm.submit();
}

我想从中得到的教训是,我会回顾一下我在Web应用程序中使用的库是如何工作的!