硒使用以前的退出驱动器,即使我打开一个新的驱动器.抛出错误:调用 quit() 后无法使用 FirefoxDriver



我有一个父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方法似乎从未被调用过。

这是您问题的解决方案:

您需要解决代码中的许多问题,如下所示:

  1. Webtest类中,在closeDriver()方法中,您退出了驱动程序,driver.quit()您仍然试图获得 WebDriver 作为回报public static WebDriver closeDriver()。 因此,请将其更改为public static void closeDriver()

  2. testClass类中,您正在尝试扩展WebTest但基类Webtest。 所以把它改成public class testClass extends Webtest

  3. 要使用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();
    
  4. 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);
    
  5. closeDriver(),如果您System.out.println("Driver closed :"+ driver);,您将在下一个driver.quit();退出驱动程序,则不会获得驱动程序实例的任何实时值,而只会获得null

  6. 最后,创建了整个混乱,因为您添加了@BeforeMethod注释以打开驱动程序,但尚未使用@AfterMethod注释将其释放closeDriver()方法。添加批注@AfterMethod

  7. 这是您自己的工作代码以及一些简单的调整:

类网络测试:

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
}
}

让我知道这是否回答了您的问题。

最新更新