【发布时间】:2017-12-07 19:44:58
【问题描述】:
我有一个基本测试类,我在其中编写了使用单例模式实例化浏览器的代码
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;
}
}
现在我的代码运行成功,直到我使用退出或关闭方法关闭浏览器 现在我第二次重新执行相同的代码,它给了我
nosuchSession 异常
这是我的测试类
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;”在此之后
现在在我的第二个测试班
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
【问题讨论】:
-
我可以使用 appium 执行相同类型的框架
-
有什么理由将测试放在页面对象 (SimpleBase1) 中?
-
这完全是另一个想法,我想将我的 webElements 作为参数发送给我的页面类中的另一个方法,我只想重新使用它但是我得到空指针作为webElement 为 null 你能告诉我你在关闭或退出浏览器后如何重新实例化浏览器吗
-
您将 SimpleBase1 类的实例变量驱动程序设置为空,而不是 BaseTest 类的静态类变量驱动程序。请改用此 BaseTest.driver = null 。混合页面对象和测试绝不是一个好主意。还要查看访问修饰符,一切都是公共的或包的。 singelton的目的是什么? setBrowser() 方法有一个 BeforeClass 注释,除非该类中有测试,否则它永远不会被 testNg 触发。无论如何,您都在明确地调用它。
标签: java selenium automated-tests testng