这可能类似于5660956,但我先做一个 GET ......
我认为这里的关键是 Selenium,因此是标签。以防万一:我正在使用 Java,使用 NinjaFramewor、FluentLenium 和 Firefox。它在本地运行,也可以在带有 Xvfb 的无头 CI 盒上运行。我通过了一些 FluentLenium 测试,所以整个事情都没有坏掉!
我有一个网页,带有一个简单的登录表单,该表单执行对执行 AJAX POST 的 JavaScript 的调用。AJAX 响应被 JavaScript 捕获并导致页面的某些主体更新,登录、注册和失败的结果不同。当我手动测试时,甚至当我在本地运行这些测试时,我都可以看到这种情况。
测试看起来像这样:
import org.fluentlenium.adapter.util.SharedDriver;
import org.fluentlenium.core.annotation.Page;
import org.junit.Test;
@SharedDriver(deleteCookies=true)
public class UserControllerTest extends JSTest {
@Page
HomePage home;
@Page
LoginPage login;
@Test
public void test_cantLoginUntilReg() {
goTo(login);
login.fillOutReg("test_cantLoginUntilReg");
login.chooseLogin(); // script that POSTS and does AJAX update
login.isErrorResult(); // errors
goTo(login);
login.fillOutReg("test_cantLoginUntilReg");
login.chooseRegister(); // script that POSTS and does AJAX update
login.isWelcomeResult(); // errors
login.chooseHome(); // GET on home
home.isLoggedIn(); // this works
}
// more tests
}
而我遇到麻烦的 LoginPage 看起来像(包含一个包含常量的超类):
public class LoginPage extends FluentPage {
protected static final String HOME_PAGE = "http://localhost:8080";
private static final String PAGE = HOME_PAGE + "/login";
@AjaxElement
FluentWebElement welcomeDiv;
@AjaxElement
FluentWebElement errorDiv;
@Override
public String getUrl() {
return PAGE;
}
@Override
public void isAt() {
assertTrue("url is " + url(), url().contains("login"));
assertTrue("h1 is " + find("h1").getText(), find("h1").getText().contains("Login"));
assertTrue("h1 is " + find("h1").getText(), find("h1").getText().contains("Register"));
}
public void isErrorResult() {
assertTrue("h1 is " + find("h1").getText(), find("h1").getText().contains("Failed"));
assertNull("cookie is " + getCookie(SESSION_COOKIE_NAME), getCookie(SESSION_COOKIE_NAME));
}
public void fillOutReg(String testName) {
fill("#email").with(testName + "@UserControllerJSTests.test.com"); // this passes the minimal validation in place so far
fill("#password").with("reallyBadPassword");
fill("#identName").with(testName);
}
public void chooseLogin() {
executeScript(LOGIN_SCRIPT); // I'd prefer click on the form, but that seemed to be a source of trouble as well
}
// and so on
}
isErrorResult() 方法永远不会满足!查找 h1 显示 h1 文本仍然与第一次加载页面时一样。清除会话 cookie 会在不同的机器上显示不同的行为(可能需要等待某些东西)。我也试过测试welcomeDiv 的内容。我觉得我应该能够在这里使用@AjaxElement 来提供帮助,但我还没有完全弄清楚如何做。
我不想检查返回的 JSON。我已经进行了不涉及 Selenium 的测试,这些测试已经非常接近了。
我想要做的是自动检查用户是否会在 POST 后在浏览器端看到正确的内容。即使有这个代码的变通方法,其他功能也会有足够大的上传,GET 真的是不明智的;可测试的 AJAX 似乎是一种合理的需求。
请问有什么想法吗?