如何多次运行@BeforeClass

时间:2017-12-07 19:44:59

标签: java selenium automated-tests testng

我有一个basetest类,我在其中编写了使用singelton模式实例化浏览器的代码

public class BaseTest {
    public static  WebDriver driver;
    @BeforeClass(alwaysRun=true,groups={"dependx"})
    public static  WebDriver setBrowser()// double checked login using synchronized keyword will increase the time by 100
    {
        if(driver==null){
            synchronized(BaseTest.class){
                System.setProperty("webdriver.chrome.driver","/home/user/Downloads/driver/chromedriver");
                 driver = new ChromeDriver();   
            }
        }
        return driver;
    }
}

现在我的代码运行成功,直到我使用quit或close方法关闭浏览器 现在第二次当我重新执行相同的代码时,它给了我

nosuchSession例外

这是我的TestClass

public class SimpleBase1 {
    public SimpleBase1() {
        PageFactory.initElements(driver, this);
    }

    SimpleBase2 obj;
    FullLafdefy obj2;
    public WebDriver driver = BaseTest.setBrowser();

    @FindBy(xpath ="//a[@id ='yourRooms']/span[contains(text(),'Rooms: ')]")
    WebElement cartButton;
    @FindBy(xpath ="//a[@id='aLamps']")
    WebElement Lamps;

    @BeforeClass
    public void before(){
        obj = new SimpleBase2(driver);
        obj2 = new FullLafdefy(driver);
    }
    @Test(priority=1)
    public void navigateToSite(){
        System.out.println("Here it is  "+Constants.url.value);
        FullLafdefy.navigateToUrl(driver, Constants.returnUrl());
        System.out.println("pretty Please ");
    }

    @AfterClass
    public void tearDown(){
        driver.close();
        driver=null;
    }
}

一切正常,我想确保驱动程序值应该等于null,所以我插入了一行额外的行“driver = null;”在此之后

现在我的第二个testClass

public class SignPageTest {
    public WebDriver driver = BaseTest.setBrowser();
    SignPage obj ;
    Boolean stu;


    @Test
    public void navigateToSignPage(){
    obj = new SignPage(driver);
    stu = obj.navigateToSignIn();
    }
    @Test(priority=2)
    public void getHandles(){
        stu = obj.handlingWindows();
    }

}

这是我的testNG.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
    <test name="Test1">
    <classes>
          <class name="TestPackageClasses.BaseTest"/>
          <class name="trialPackage.SimpleBase1"/>  
    </classes>
    </test>
    <test name="Test2">
    <classes>
         <class name="TestPackageClasses.BaseTest"/>
         <class name="TestPackageClasses.SignPageTest"/> 
    </classes>
    </test>
</suite>

有人可以告诉我如何重复执行@BeforeClass的代码,或者多次@BeforeTest

1 个答案:

答案 0 :(得分:0)

我发现您的代码存在很多问题。以下是一些:

  1. 如果您决定开始并行运行测试,那么您的单例方法就是灾难的一个方法。我建议将其更改为Factory方法,该方法在调用时将生成webdriver实例。因此,您的测试可以直接调用工厂方法并使用webdriver。
  2. 您的单例使用@BeforeClass进行注释,但在您的代码中没有使用@BeforeClass注释功能,因为您的测试类都没有扩展BaseTest。所以你可以在这堂课中完全摆脱这个注释。
  3. 您的套件xml明确指的是BaseTest。这会导致@BeforeClass运行。但是第二个<test name="Test2">是最常见的,因为您的测试类TestPackageClasses.SignPageTest基本上是通过类级别数据成员查询BaseTest.setBrowser()。这意味着,只要TestNG为setBrowser()创建实例,就会调用SignPageTest。 TestNG之前很久就实例化了测试类,并且稍后它才调用@BeforeClass
  4. 所以这里有一些代码的快速修复。

    1. 让所有测试类扩展BaseTest。这样他们就不需要做任何额外的操作来获取webdriver对象,因为它可以从基类中获得。 webdriver逻辑的实例化仍然可以是@BeforeClass方法的一部分。但请记住,这样做会严重限制您并行运行测试的能力。如果您希望在方法级别执行此操作并准备好并行性,则需要使用@BeforeMethod + ThreadLocal(或)使用TestNG侦听器。您可以在我的博文here
    2. 中详细了解相关信息
    3. BaseTest类中删除所有同步逻辑和单例方法。