web-dev-qa-db-ja.com

webDriverをアクティブにしたままブラウザーウィンドウ全体を閉じる方法

私のバッチ実行では、最初のシナリオで複数のタブを持つ複数のブラウザーが開かれています。 2番目のシナリオを開始する前に、これらのブラウザーをすべて閉じたいと思いました。

Driver.close()はブラウザの1つのタブを閉じているだけです。 Driver.quit()はすべてのブラウザを閉じ、WebDriverセッションも終了しています。そのため、バッチ実行を実行できません。これに対する解決策を提供してください。

14
Rahul

以下の説明では、WebDriverのdriver.closedriver.quitメソッドの違いを説明する必要があります。それがあなたのお役に立てば幸いです。

driver.closedriver.quitは、Selenium WebDriverでブラウザーセッションを閉じるための2つの異なる方法です。

これらの両方を理解し、各メソッドをいつ使用するかを知ることは、テストの実行において重要です。したがって、私はこれらの両方の方法に光を当てようとしました。

driver.close-このメソッドは、フォーカスが設定されているブラウザーウィンドウを閉じます。 driver.quit webdriverのセッションを閉じますdriver.close他のウィンドウが開かれていない場合、Seleniumコントロールが存在するがwebdriverセッションがまだ閉じていない現在のウィンドウのみを閉じ、 driver.closeを呼び出すと、webdriverのセッションも閉じます。

driver.quit –このメソッドは基本的にdriver.disposeを呼び出します。このメソッドはすべてのブラウザーウィンドウを閉じ、WebDriverセッションを正常に終了する内部メソッドを呼び出します。

driver.dispose-前述のように、WebDriverの内部メソッドは、別の回答に従って静かにドロップされました-検証が必要です。通常のテストワークフローでは、この方法には実際にはユースケースがありません。前の方法のいずれかがほとんどのユースケースで機能するはずです。

ユースケースの説明:プログラムを終了するときは、常にdriver.quitを使用する必要があります。開いているすべてのブラウザーウィンドウを閉じ、WebDriverセッションを終了します。プログラムの最後でdriver.quitを使用しない場合、WebDriverセッションは適切に閉じられず、ファイルはメモリから消去されません。これにより、メモリリークエラーが発生する場合があります。

............

今その場合、特定のブラウザが必要です。以下は、メインウィンドウを除くすべての子ウィンドウを閉じるコードです。

String homeWindow = driver.getWindowHandle();
Set<String> allWindows = driver.getWindowHandles();

//Use Iterator to iterate over windows
Iterator<String> windowIterator =  allWindows.iterator();

//Verify next window is available
while(windowIterator.hasNext())
{
    //Store the Recruiter window id
    String childWindow = windowIterator.next();
}

//Here we will compare if parent window is not equal to child window 
if (homeWindow.equals(childWindow))
{
    driver.switchTo().window(childWindow);
    driver.close();
}

ここで、必要に応じて条件を変更または追加する必要があります

if (homeWindow.equals(childWindow))
{
    driver.switchTo().window(childWindow);
    driver.close();
}

現在、ホームウィンドウがchildwindowと等しいかどうかのみをチェックしています。ここで、どのidを閉じるかなどの条件を指定する必要があります。試したことがないので、要件を達成する方法を提案しただけです。

6
Shubham Jain

driver.close()driver.quit()の違いを理解する必要があります

driver.close()driver.quit()は、Selenium WebDriverでブラウザーセッションを閉じるための2つの異なる方法です。それらの両方を理解し、テストの実行に重要なメソッドをいつ使用するかを把握します。

driver.close() –フォーカスが設定されているブラウザーウィンドウを閉じます。

driver.quit() –基本的にdriver.disposeメソッドを呼び出し、すべてのブラウザーウィンドウを閉じてWebDriverセッションを正常に終了します。

プログラムを終了するときはいつでもdriver.quit()を使用する必要があります。開いているすべてのブラウザーウィンドウを閉じ、WebDriverセッションを終了します。プログラムの最後でdriver.quitを使用しない場合、WebDriverセッションは適切に閉じられず、ファイルはメモリから消去されません。これにより、メモリリークエラーが発生する場合があります。

あなたの場合、現在のウィンドウを閉じてドライバをアクティブに保つdriver.close()を使用する必要があります。

ただ追加する-ブラウザウィンドウのみが開いていてdriver.close()を使用している場合、webdriverセッションを終了します。 Webdriverはアクティブのままになりません。

33
Sanjay Bhimani

このコードは、開いているすべてのウィンドウを閉じ、メインウィンドウに制御を戻します。

public static void switchTab() {            
    try {
        Set<String> windows = webDriver.getWindowHandles();
        Iterator<String> iter = windows.iterator();
        String[] winNames=new String[windows.size()];
        int i=0;
        while (iter.hasNext()) {
            winNames[i]=iter.next();
            i++;
        }

        if(winNames.length > 1) {
            for(i = winNames.length; i > 1; i--) {
                webDriver.switchTo().window(winNames[i - 1]);
                webDriver.close();
            }
        }
        webDriver.switchTo().window(winNames[0]);
    }
    catch(Exception e){         
        e.printStackTrace();
    }
}
1
Rahul