左側にメニューがあり、上部に通知などの機能がある Web アプリケーション (next.js) をテストしているときに、ドロップダウン ボタンをクリックすると問題が発生しました。手順:
- ロボットが左メニューのボタンをクリック
- サブページが表示されたら、ボタンをクリックしてボタンのリストを展開します
- その間、通知が表示され、展開されたボタンのリストが閉じます。- テストが失敗する
クリック後にページが完全にロードされるまでTestcafeで待機する最良の方法は何ですか? 私はwaitForReactを試しましたが、おそらくテストではいつでも使用できず、 beforeEach フック内でのみ使用できます。Java では、ページが読み込まれるのを待つために、カスタムの待機を使用しました。
public void waitAllRequest() {
waitUntilJSReady();
ajaxComplete();
waitUntilJQueryReady();
waitUntilAngularReady();
}
上記のメソッドの実装を次に示します (waitUntilAngularReady なし):
public class JSWaiter {
private static WebDriver jsWaitDriver;
private static WebDriverWait jsWait;
private static JavascriptExecutor jsExec;
//Get the driver
public static void setDriver (WebDriver driver) {
jsWaitDriver = driver;
jsWait = new WebDriverWait(jsWaitDriver, 10);
jsExec = (JavascriptExecutor) jsWaitDriver;
}
private void ajaxComplete() {
jsExec.executeScript("var callback = arguments[arguments.length - 1];"
+ "var xhr = new XMLHttpRequest();" + "xhr.open('GET', '/Ajax_call', true);"
+ "xhr.onreadystatechange = function() {" + " if (xhr.readyState == 4) {"
+ " callback(xhr.responseText);" + " }" + "};" + "xhr.send();");
}
private void waitForJQueryLoad() {
try {
ExpectedCondition<Boolean> jQueryLoad = driver -> ((Long) ((JavascriptExecutor) this.driver)
.executeScript("return jQuery.active") == 0);
boolean jqueryReady = (Boolean) jsExec.executeScript("return jQuery.active==0");
if (!jqueryReady) {
jsWait.until(jQueryLoad);
}
} catch (WebDriverException ignored) {
}
}
private void waitUntilJSReady() {
try {
ExpectedCondition<Boolean> jsLoad = driver -> ((JavascriptExecutor) this.driver)
.executeScript("return document.readyState").toString().equals("complete");
boolean jsReady = jsExec.executeScript("return document.readyState").toString().equals("complete");
if (!jsReady) {
jsWait.until(jsLoad);
}
} catch (WebDriverException ignored) {
}
}
private void waitUntilJQueryReady() {
Boolean jQueryDefined = (Boolean) jsExec.executeScript("return typeof jQuery != 'undefined'");
if (jQueryDefined) {
poll(20);
waitForJQueryLoad();
poll(20);
}
}
そのようなコードを Testcafe に実装する方法は?