2

@AfterClass で testng を使用して「ティアダウン」する最良の方法を誰かが推奨できますか? ウィンドウやポップアップがハングすることがあり、ホームページに戻って次のクラスを開始し、モーダル ダイアログ エラーを回避するために適切にログアウトすることができません。

ホームページでウィンドウハンドルを取得してから、ポップアップでウィンドウハンドルを取得してから、 @AfterClass に switchTo を入れてみましたが、うまくいきません。driver.close() も試しました。しかし、次のクラスは到達不能ブラウザ エラーでスキップされます。

ページ上にあるエラーやポップアップから抜け出すことができ、次のテストクラスを実行するためにログインページにクリーンなブラウザーウィンドウを残すことができる、適切な tearDown @AfterClass メソッドが本当に必要です。

編集: コードの追加:

package TestPackage;

import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.*;
import org.testng.annotations.Test;    

//@Test (priority = 1)
public class test1 {
    public static WebDriver driver = new FirefoxDriver();
    Environment environment = Environment.QA03();
    User testUser = User.ns_system();
    AxUtilities axUtilities;

    @BeforeClass
    @Parameters("environment")
    @Test
    public void login(String environment1){

//        environment = new Environment(environment1);
        axUtilities  = new DAxUtilities(environment1, driver);
//        DAxUtilities dAxUtilities = new DAxUtilities(environment);
        Login login = new Login();
        login.getLogin(testUser, axUtilities, driver);
        axUtilities.sleep(5000);
    }

    @Test
    public void testNothing(){
        String s = "public void testNothing() reached...";
        System.out.println(s);
    }


    @AfterClass
    public void verifyOKAndLogout() {

        driver.quit();
//        DAxUtilities dAxUtilities;

    }

}

テストクラス 1 と 2 は、クラス名を除いて同じです...

テストはxmlファイルから実行されます。そして、各テストを独自のxmlファイルに入れても、xmlファイルの多くのバリエーションを試しました。

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name="TestSuite1" verbose="1">
    <parameter name="environment" value="QA03"/>

<test name="Test1">
    <classes>
        <class name="TestPackage.test1"/>
        <!--<class name="TestPackage.test2"/>-->
    </classes>
</test>
<test name="Test2">
    <classes>
        <class name="TestPackage.test2"/>
    </classes>
</test>

</suite>

ただし、常に 2 つの Web ドライバーが、他のコードが実行される前に、テスト実行の最初に次々と作成されます。そして、ブレークポイントは、コードがクラス 1 のテストを実行する前に、クラス 1 の最初からクラス 2 の最初まで確実にスキップしていることを示しています...

4

3 に答える 3

4

あなたが書いたことから、テスト スイート全体の前にブラウザを作成 (WebDriver をインスタンス化) し、同じブラウザ インスタンスを使用してすべてのテストを実行しているようです。実行時間は短縮されますが、現在発生しているような問題も発生します。

各テスト クラス (またはテスト メソッド) を実行する前に、ブラウザーの新しいインスタンスを作成することをお勧めします。そのような場合driver.quit()、 @AfterClass メソッドで安全に使用できます。テストごとにブラウザを再起動すると、テストがより安定します。

新しく追加したコードのコメントを編集します

  • WebDriver をインスタンス化する方法が正しくありません。いくつかのテスト クラスがある場合、テストが実行される前に複数のブラウザ ウィンドウが開かれることになります。
  • 1 つのメソッドに @Test と @BeforeClass の両方でアノテーションを付けた - これにより、メソッドが続けて 2 回実行されます。

それが(多かれ少なかれ)どのように見えるかは次のとおりです

public class MyTest {
   protected WebDriver driver;

   @BeforeClass   //I would even suggest to use @BeforeMethod but that's up to you
   public void setUp() {
      driver = new FirefoxDriver();
      //other instantiations and assignments if necessary
   }

   @Test
   public void login() {
      driver.get("http://watever.com");
      //do whatever
   }

   @Test
   public void someOtherTest() {
      //do something else
   }

   @AfterClass   //or @AfterMethod
   public void tearDown() {
      driver.quit();
   }
}
于 2013-08-29T21:07:26.120 に答える
0

呼び出すdriver.close()driver.quit()、新しい WebDriver を作成してドライバーに割り当てるとうまくいくと思います。おそらく、クラスの最初と最後に同じ関数を呼び出してドライバーを作成したいと思うでしょう。

于 2013-08-29T20:19:32.910 に答える