3

機能テストには webdriver を使用しています。しかし、私たちのアプリケーションはshowModalDialogポップアップを開くために JS 関数を多用しています。この機能を webdriver でテストしようとすると、ポップアップが開いた瞬間からハングします。

これをテストするために、いくつかのことを試しました。

  • こちらで説明されている回避策を使用してください。しかし、これはウェブドライバーではなくセレンの修正のようです。試してみましたが、うまくいきませんでした。
  • 良い代替手段を探して、HtmlUnit はモーダル ダイアログを開いて操作できましたが、特定のテストを修正するための視覚的なヘルプがなく、使用しなければならないが持っている JS ライブラリで JS エラーを検出すると実行を停止するなどの欠点があります。制御できません。

これをどのようにテストしたり、この問題を回避したりできますか?

4

11 に答える 11

2

答えはどれも質問に答えません。ドライバーがハングした場合、そのドライバーでメソッドを呼び出すことはできません。問題は、ポップアップを見つけることではなく、ドライバーのハングを止める方法です。私が見つけた唯一の方法は、使用しないことshowModalDialogです。これは、テスト コードに以下を追加することで実行できます。

((JavascriptExecutor) driver).executeScript("window.showModalDialog = window.open;");

JavaScript がを呼び出すwindow.openたびに呼び出されますwindow.showModalDialog

于 2014-04-30T09:39:35.590 に答える
2

window.showModalDialog()さまざまな自動化ツールに関する私の経験から、またはを使用して IE から開いた「Web ページ ダイアログ」ウィンドウとの対話window.showModelessDialog()利用できません

ウィンドウは「真の」ウィンドウではないため (タスクバーを見てください。表示されません)、ほとんどのツールはそれを「検査」したり操作したりできません。

ただし、そのようなツールを見つけた場合は、アドバイスしてください。そのような獣を探している人はたくさんいます。

とはいえ、これら 2 つの独自の方法のいずれかを使用しないようにすることができれば、より幸運に恵まれるでしょう。

(そして、はい、うるさい人のために、Firefox と Chrome はこの種のダイアログを採用していますが、まったく同じようには機能しません)

于 2010-12-06T14:03:41.163 に答える
1

まず、アクティブな要素に切り替える必要があります。

driver.switchTo().activeElement();

実際に正しいアクティブ要素に切り替えたかどうかを確認するには、次の手順に従います。

driver.switchTo().activeElement().getText(); 
于 2012-12-12T10:49:12.867 に答える
1

ウィンドウに名前がなくても、uは使用できます

driver.switchTo.defaultcontent();

実行したい操作を実行するか、以下のコマンドを使用してウィンドウハンドル名を取得できます

for (String handle : driver.getWindowHandles()) { 
    driver.switchTo().window(handle); }

これがあなたのために働くことを願っています。

于 2012-05-23T10:55:15.040 に答える
1

メソッドを使用してwebdriver.SwitchTo().Window()いますが、ポップアップウィンドウに「名前」がないことが懸念されます

使用するwebdriver.WindowHandlesとハンドルが 1 つだけ返されるため、ポップアップ ウィンドウが開いた後にこのステートメントを使用しています。

名前/ハンドルがないため、親ウィンドウから子ウィンドウに切り替えることができません。

同じ機能を実行する他のソリューション

于 2012-01-03T15:18:52.990 に答える
0

私が使用していて、IE と Firefox でうまく機能するのは、ポップアップを調べて、対話しようとしているポップアップで一意のテキストを探すことです。これがその方法です、それがあなたのために働くかどうか私に知らせてください。行 driver = driver.switchTo().window(windowHandle); に注意してください。

public void switchWindow(文字列を含む文字列、WebDriver ドライバー) は例外をスローします {

    if ( StringUtils.isEmpty(containingText))
        return;

    int counter = 1;
    int numOfpopups = driver.getWindowHandles().size();
    System.out.println("Waiting for popup to load..... # handles:" + numOfpopups);
    while ( numOfpopups  < 2 && ((counter%10) != 0) ) {
        counter++;
        try{Thread.sleep(1000);}catch (Exception e) {}
    }
    System.out.println("Done waiting for..... " + counter + " seconds");

    if (driver.getWindowHandles().size() < 2)
          throw new BrowserException("Timeout after " + counter + " secs. No popup present. ");

    System.out.println("Going through window handles...");

    for (String windowHandle : driver.getWindowHandles()) { 
                driver = driver.switchTo().window(windowHandle);
        if ( driver.getPageSource().contains(containingText) 
        return;
         else 
        continue;
    }

    throw new Exception("Window containing text '" + containingText + "' not found");

}
于 2013-05-30T18:57:01.353 に答える
0

私の知る限り、webdriver にはモーダル ウィンドウを処理する機能が組み込まれていません。モーダル ウィンドウを開くボタンをクリックすると、Webdriver がハングします。これは、子ウィンドウが閉じられるまで親ウィンドウの JS が停止するために発生します。

このようなモーダル ウィンドウを処理するには、Java で記述された可能な回避策について以下を参照してください。主なアイデアは、新しいスレッドでモーダル ウィンドウを開く (ボタンをクリックする) アクションを実行することです。

/**
 * Click button to open modal window and switch to it
 * @param we webElement handle of a button
 */
public void clickToOpenModal(final WebElement we) {
    //Get handles of all opened windows before opening modal window
    Set<String> initWindowHandles = getDriverInstance().getWindowHandles();

    //Create new thread and click button to open window
    Thread thread1 = new Thread() {
            @Override
            public void run() {
            //Click button
            click(we);
        }
    };
    thread1.start();

    //Wait for window to appear
    waitForWindow(initWindowHandles, pauseL);
    thread1.interrupt();
    thread1 = null;

    //Get handles of all opened windows after opening modal window
    Iterator<String> it = getDriverInstance().getWindowHandles().iterator();

    //Select handle of modal window
    String windowHandle = "";
    while(it.hasNext()){
        windowHandle = it.next();
    }

    //Switch focus and work on the modal window
    getDriverInstance().switchTo().window(windowHandle);
}
于 2013-07-06T13:52:20.863 に答える
0

問題 284は WebDriver 用です。Issue 27が実装されてから実装されるようですので、修正は WebDriver の Beta 1 または 2 にあるはずです。

于 2010-12-06T11:09:45.203 に答える
0
Set<String> beforePopup = driver.getWindowHandles();

Set<String> afterPopup = driver.getWindowHandles();

afterPopup.removeAll(beforePopup);

if(afterPopup.size()==1){
    System.out.println(afterPopup.toArray()[0]);
}

driver.switchTo().window((String) afterPopup.toArray()[0]);
于 2012-12-10T17:51:08.800 に答える