我有一个父Web测试,由测试类调用,如下所示:
public class Webtest
{
protected static WebDriver driver;
@BeforeMethod
public static WebDriver openUrl(String URL)
{
driver = new FirefoxDriver();
driver.get(URL);
System.out.println("Driver started :"+ driver);
return driver;
}
public static WebDriver closeDriver(){
driver.quit();
System.out.println("Driver closed :"+ driver);
}
}
现在我在扩展它的测试类中实现了上述内容。
public class testClass extends WebTest
{
@Test
public void TC01()
{ System.out.println("Test1:" + driver);
// Do something using driver
}
@Test
public void TC02()
{
System.out.println("Test2:" + driver);
// Do something
}
}
现在结果:
Driver started :FirefoxDriver: firefox on MAC (dfe4e055-4555-0d4d-8a83-a9a802159ea7)
Test1:FirefoxDriver: firefox on MAC (dfe4e055-4555-0d4d-8a83-a9a802159ea7)
Driver closed :FirefoxDriver: firefox on MAC (dfe4e055-4555-0d4d-8a83-a9a802159ea7)
Driver started :FirefoxDriver: firefox on MAC (1370df47-483b-574c-9792-9bb5fa077364)
Test2:FirefoxDriver: firefox on MAC (1370df47-483b-574c-9792-9bb5fa077364)
[Error] resulted in an exception: The FirefoxDriver cannot be used after quit() was called.
基本上,我假设test2使用的是以前的驱动程序。我还没有打电话给第二个司机退出,但出现错误。我确实在每种方法之间都睡了一觉,并尝试过,但没有任何效果。有什么帮助吗?我正在使用火狐 46。
由于您将openUrl方法定义为@BeforeMethod因此它会在所有其他方法之前调用,因此当您的testClass调用TC01时,它会首先打开一个新的浏览器。 然后,当您调用TC02时,将再次调用该@BeforeMethod,并创建另一个新的WebDriver。 但是,这并不能解释最后一行错误。 我不确定为什么它会执行quit方法,因为closeDriver方法似乎从未被调用过。
这是您问题的解决方案:
您需要解决代码中的许多问题,如下所示:
-
在
Webtest
类中,在closeDriver()
方法中,您退出了驱动程序,driver.quit()
您仍然试图获得 WebDriver 作为回报public static WebDriver closeDriver()
。 因此,请将其更改为public static void closeDriver()
-
testClass
类中,您正在尝试扩展WebTest
但基类Webtest
。 所以把它改成public class testClass extends Webtest
-
要使用Selenium 3.4.0以及geckodriver v 0.16.1和最新的Mozilla Firefox 53.x,您需要下载最新的壁虎驱动程序,并在初始化驱动程序之前在代码
System.setProperty
中提及绝对路径,如下所示:System.setProperty("webdriver.gecko.driver", "C:\your_directory\geckodriver.exe"); driver = new FirefoxDriver();
-
在
Webtest
我可以看到您正在接受 URL 作为参数public static WebDriver openUrl(String URL)
但我没有看到您从Webtest
传递它。保持简单,在方法中定义openUrl()
String URL
,如下所示:String URL = "http://gmail.com"; System.setProperty("webdriver.gecko.driver", "C:\Utility\BrowserDrivers\geckodriver.exe"); driver = new FirefoxDriver(); driver.get(URL);
-
closeDriver()
,如果您System.out.println("Driver closed :"+ driver);
,您将在下一个driver.quit();
退出驱动程序,则不会获得驱动程序实例的任何实时值,而只会获得null
。 -
最后,创建了整个混乱,因为您添加了
@BeforeMethod
注释以打开驱动程序,但尚未使用@AfterMethod
注释将其释放closeDriver()
方法。添加批注@AfterMethod
。 -
这是您自己的工作代码以及一些简单的调整:
类网络测试:
public class Webtest
{
protected static WebDriver driver;
@BeforeMethod
public static WebDriver openUrl()
{
String URL = "http://gmail.com";
System.setProperty("webdriver.gecko.driver", "C:\Utility\BrowserDrivers\geckodriver.exe");
driver = new FirefoxDriver();
driver.get(URL);
System.out.println("Within openUrl() - Driver started :"+ driver);
return driver;
}
@AfterMethod
public static void closeDriver()
{
driver.quit();
System.out.println("Driver closed :"+ driver);
}
}
类测试类 :
public class testClass extends Webtest
{
@Test
public void TC01()
{
System.out.println("Within TC01 - Test1:" + driver);
// Do something using driver
}
@Test
public void TC02()
{
System.out.println("Within TC02 - Test2:" + driver);
// Do something
}
}
让我知道这是否回答了您的问题。