これは5660956に似ているかもしれませんが、最初に GET を実行しています...
ここでの鍵は Selenium、つまりタグだと思います。念のため: 私は Java で作業しており、NinjaFramewor、FluentLenium、Firefox を使用しています。ローカルで実行されますが、Xvfb を使用したヘッドレス CI ボックスでも実行されます。私はいくつかの FluentLenium テストに合格しているので、すべてが壊れていません!
AJAX POST を実行する JavaScript への呼び出しを実行する単純なログイン フォームを含む Web ページがあります。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 は合理的に必要なようです。
何かアイデアはありますか?