我有一个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
答案 0 :(得分:0)
我发现您的代码存在很多问题。以下是一些:
@BeforeClass
进行注释,但在您的代码中没有使用@BeforeClass
注释功能,因为您的测试类都没有扩展BaseTest
。所以你可以在这堂课中完全摆脱这个注释。BaseTest
。这会导致@BeforeClass
运行。但是第二个<test name="Test2">
是最常见的,因为您的测试类TestPackageClasses.SignPageTest
基本上是通过类级别数据成员查询BaseTest.setBrowser()
。这意味着,只要TestNG为setBrowser()
创建实例,就会调用SignPageTest
。 TestNG之前很久就实例化了测试类,并且稍后它才调用@BeforeClass
。所以这里有一些代码的快速修复。
BaseTest
。这样他们就不需要做任何额外的操作来获取webdriver对象,因为它可以从基类中获得。 webdriver逻辑的实例化仍然可以是@BeforeClass
方法的一部分。但请记住,这样做会严重限制您并行运行测试的能力。如果您希望在方法级别执行此操作并准备好并行性,则需要使用@BeforeMethod
+ ThreadLocal
(或)使用TestNG侦听器。您可以在我的博文here BaseTest
类中删除所有同步逻辑和单例方法。