3

私の会社は、JBehave と Selenium を使用して「ビジュアル」GUI スタイルの BDD 関数を開発することを望んでいます。これは、javascript アラート/確認ポップアップ ウィンドウを使用して、実行中のテストが到達する正確なステップをユーザーに促します。たとえば、次のようになります。

  • 「www.google.com」に移動した場合
  • ログインすると

そこで、自動化テスト中にポップアップする Javascript 警告ウィンドウを追加したいと思います。ポップアップ ウィンドウには「OK」ボタンがあり、ユーザーが [OK] ボタンをクリックすると、テストは次のステップに進みます。

私の問題は次のとおりです。ポップアップ警告ウィンドウを呼び出す Selenium の executeScript API を使用して JavaScript 関数を作成しました。

public void stepText(String step) {
  executeScript("alert('"+step+"');");
}

OKボタンをクリックすると、ポップアップウィンドウが消え、テストが次のステップに進むと思います...しかし、私がショックを受けたのは、それをクリックすると、テストが例外をスローしてクラッシュしたことです...

例外は次のとおりです。selenium.WebDriverException

しかし、次のコードを追加して、テストでアラートウィンドウを自動的に検出し、次の通常のセレンアラートハンドル関数を使用してそれを受け入れるようにするとわかりました。

Alert alert=switchTo().alert();
alert.accept();

これにより、テストがうまく実行されるため、アラートを手動でクリックすることはできないようです (手動でクリックした後、セレンはまだブラウザーに戻ることができません...ブラウザーへの接続が失われましたか?) が、自動化アラートはコードを処理します作品...

もちろん、オートメーション ハンドル アラートではなく、ユーザーがアラート ウィンドウを手動でクリックしてテストの実行を制御できるようにしたいと考えています。

私はしばらくここで立ち往生し、グーグルで検索しましたが、オンラインで同様の例を見つけることができませんでした.JBehaveとSeleniumの私よりもはるかに優れているので、あなたが私に光を当ててくれることを願っています.

あなたが私を助けることができれば、私はとても感謝しています.

4

1 に答える 1

3

Selenium はブラウザ自動化ツールであり、ユーザーの操作を想定していません。

したがって、単純な Java GUI ウィンドウを使用して、ユーザーにメッセージ/オプションを表示します。結局、ブラウザーで Web アプリケーションをテストしていますが、プログラム自体は Java であり、ブラウザーとは何の関係もありません。通常の Swing オプション ダイアログで十分です。

  • JOptionPane.showMessageDialog(null, "Login successful.");
  • String loginAs = JOptionPane.showInputDialog("Login as:", "admin");
  • int choice = JOptionPane.showConfirmDialog(null, "Use production data?");

EventQueue.invokeLater()(ダイアログをブロックしたいので、ブロックでこれを呼び出したくないことに注意してください)

この方法では、Selenium やブラウザーと対話することはなく、混乱することもなく、ユーザー入力をきれいに取得できます。


そうは言っても、アラートの使用を主張する場合は、間違いなく実行可能だと思いますが、現在 (2013 年 6 月、Selenium 2.33.0) の時点では、方法がわかりません。

  1. この問題は IE8 では再現できません。呼び出しの後executeScript("alert('Something.')");、Selenium は呼び出しが何かを返すのを待ってから、通常どおりに処理を進めます。だからあなたはIEが得意です。

  2. ただ、FF21ではおっしゃる通りSeleniumがすぐに失敗しUnhandledAlertExceptionます。

    私は2つの明白な解決策を試しました:

    js.executeScript("alert('something')");
    new WebDriverWait(driver, 10)
        .pollingEvery(100, TimeUnit.MILLISECONDS)
        .ignoring(UnhandledAlertException.class)
        .until(ExpectedConditions.not(ExpectedConditions.alertIsPresent()))
        .wait();
    

    js.executeScript("alert('something')");
    boolean alertVisible = true;
    while (alertVisible) {
        try {
            driver.switchTo().alert();
        } catch (NoAlertPresentException ignored) {
            alertVisible = false;
        }
    }
    

    どちらも内部 JavaScript 例外で FF を恐ろしく失敗させます。おそらく修正される可能性のあるバグです(テストして、報告れているかどうかを確認し、興味がある場合は報告してください)、将来の世代のために解決策をここに残します.

    しかし、前に述べたように、Selenium はユーザーの手動操作を考慮していないため、修正されない可能性があります。

  3. これが他のブラウザでどのように動作するかはわかりません。

于 2013-06-11T00:03:53.630 に答える