java - 在不同的浏览器 session 中运行测试,但始终得到 'NoSuchSessionException: Session ID is null. Using WebDriver after calling quit()?'

标签 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. 转到网址
  5. 当开始与“第一个”组运行期间实例化的页面上的第一个 WebElement 交互时,会返回错误:

    org.openqa.selenium.NoSuchSessionException: Session ID is null. Using WebDriver after calling quit()?

到目前为止,我正在使用页面对象模型,并且我在“第二”组中使用与“第一”组中已初始化的相同页面,我猜它们以某种方式“记住”了第一个 session ID变成“空”。 虽然我在 ModuleTest.test1() 中重新初始化了它们...

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

最佳答案

看来您的问题是:

@BeforeClass(groups = {"first"})

@AfterClass(alwaysRun = true)

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

@BeforeClass(alwaysRun = true)

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

关于java - 在不同的浏览器 session 中运行测试,但始终得到 'NoSuchSessionException: Session ID is null. Using WebDriver after calling quit()?',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56898726/

相关文章:

java - Java 求数组之和

java - 尝试在 TestNG 中使用 ExtentReports 生成测试报告时获取 NullPointerException

selenium - 在 Eclipse 之外运行 TestNG Selenium 测试时,不会创建 'test-output' 文件夹

python - 使用Selenium截图时的"TypeError: get_screenshot_as_file() takes exactly 2 arguments (1 given)"

java - WebDriver - 捕获的屏幕截图似乎具有红色或橙色色调

java - webdriver.get() 和 webdriver.navigate() 的区别

java - 为组 xxx 提交偏移量时发生错误 UNKNOWN_MEMBER_ID

java - 如何获取每个星期日的日期

java - 在不下载 DTD 的情况下解析 XML 文档的标准方法

java - 并行执行 TestNG 测试,一个浏览器不会关闭