2

有人可以推荐在@AfterClass 中使用testng 'tearDown' 的最佳方法吗?我偶尔会收到一个挂起的窗口或弹出窗口,并且无法返回主页以优雅地注销以开始下一个课程并避免模态对话框错误。

我尝试在主页上获取窗口句柄,然后在弹出窗口中获取一个窗口句柄,然后在我的 @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>

但是总是会创建两个 Web 驱动程序,一个接一个,在测试运行的最开始,在执行任何其他代码之前。断点显示代码肯定会从第 1 类的开头跳过到第 2 类的开头,然后再运行第 1 类测试...

4

3 回答 3

4

从您写的内容来看,您似乎是在整个测试套件之前创建浏览器(实例化 WebDriver),然后使用相同的浏览器实例执行所有测试。尽管它的执行时间更快,但它也引入了像您现在遇到的问题。

我建议在执行每个测试类(甚至测试方法)之前创建一个新的浏览器实例。在这种情况下,您可以安全地driver.quit()在 @AfterClass 方法中使用。每次测试都重新启动浏览器将使您的测试更加稳定。

编辑对您新添加的代码的评论

  • 您实例化 WebDriver 的方式不正确。如果您有多个测试类,您最终会在执行任何测试之前打开多个浏览器窗口
  • 您使用 @Test 和 @BeforeClass 注释了一个方法 - 这将导致该方法连续执行两次

它应该(或多或少)的样子是

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

利用

@tearDown{
driver.quit();

}

它将关闭测试类打开的所有窗口。

并在 Next 类中创建 Webdriver() 的新实例,如下所示

Webdriver driver = new FireFoxDriver(); //或其他一些驱动程序

于 2013-08-30T06:12:03.603 回答
0

我相信调用driver.close()ordriver.quit()然后创建一个新的 WebDriver 并将其分配给您的驱动程序应该可以解决问题。您可能希望在类的开始和结束时调用相同的函数来创建驱动程序。

于 2013-08-29T20:19:32.910 回答