在不同的浏览器会话中运行测试,但始终得到'NoSuchSessionException:会话ID为null。在调用quit()之后使用WebDriver吗?

时间:2019-07-05 07:46:04

标签: java selenium webdriver testng pageobjects

我的测试项目在BaseTest.class中具有@BeforeClass和@AfterClass:

public class BaseTest {

  @BeforeClass(groups = {"first"})
  public void beforeTest() {
    getDriver().get("URL");
  }

  @AfterClass(alwaysRun = true)
  public void afterTest() {
    getDriver().close();
    removeDriver();
  }
}

及其FirstTest.Class:

public class SmokeTest extends BaseTest {

  private PageOne pageOne = PageFactory.initElements(getDriver(), PageOne.class);
  @Test(testName = "test1", groups = { "first" })
  public void firstTest() {
    pageOne.goSomething();
  }

  @Test(testName = "test2", groups = { "first" })
  public void secondTest() {
    pageOne.goSomethingElse();
  }
}

WebDriver单例:

public class WebDriverSingleton {

  private static WebDriver driver;

  public static WebDriver getDriver() {
    if (driver == null) {
      driver = new ChromeDriver();
    }
    return driver;
  }

  public static void removeDriver() {
    driver.quit();
    driver = null;
  }
}

它工作正常。直到我添加了要在新的浏览器实例中开始的新案例。

我添加的内容:

public class BaseModuleTest {
  @BeforeClass(groups = {"second"})
  public void beforeClass() {
    getDriver().get("another URL");
  }
}
public class ModuleTest extends BaseModuleTest {

  private PageTwo pageTwo = PageFactory.initElements(getDriver(), PageTwo.class);
  private PageOne pageOne = PageFactory.initElements(getDriver(), PageOne.class);

  @Test(testName = "test1", groups = {"second"})
    public void testUp() {
      pageTwo.goToPageOne();
      pageOne.doSomething(); // getting fail here
  }
}

当我使用testgnconfiguration.xml开始测试

  1. “第一”组通过
  2. 浏览器窗口关闭
  3. WebDriver的新实例打开新的浏览器窗口
  4. 转到URL
  5. 当开始与在“首次”组运行期间实例化的页面上的第一个WebElement进行交互时,将返回错误:
      
        
          

    org.openqa.selenium.NoSuchSessionException:会话ID为null。调用quit()后使用WebDriver吗?

        
      

就我使用的页面对象模型和在“第二个”组中使用的“第一”组中初始化的相同页面而言,我猜它们以某种方式“记住”了第一个会话ID变成“ null”。 尽管我在ModuleTest.test1()中重新初始化了它们。

无论如何,如果我的建议是正确的,如何将新的sessionId传递给实例化的页面对象?还是重新初始化它们的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

看起来您的问题是:

@BeforeClass(groups = {"first"})

@AfterClass(alwaysRun = true)

完成类后,您始终会销毁驱动程序对象,但是您只是为特定组中的类创建驱动程序对象。我建议将您的@BeforeClass调整为:

@BeforeClass(alwaysRun = true)

@BeforeClass(groups = {"first, "second"})