【问题标题】:Run tests in different browser sessions but always get 'NoSuchSessionException: Session ID is null. Using WebDriver after calling quit()?'在不同的浏览器会话中运行测试,但总是得到“NoSuchSessionException:会话 ID 为空”。调用 quit() 后使用 WebDriver?
【发布时间】:2019-11-15 19:58:30
【问题描述】:

我的测试项目在 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:会话 ID 为空。调用 quit() 后使用 WebDriver?

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

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

【问题讨论】:

    标签: java selenium webdriver testng pageobjects


    【解决方案1】:

    看起来你的问题是:

    @BeforeClass(groups = {"first"})
    

    @AfterClass(alwaysRun = true)
    

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

    @BeforeClass(alwaysRun = true)
    

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

    【讨论】:

    • 试过了。实际上我已经尝试了很多@Before@After 组合的配置。并且没有成功:('旧'页面对象中的根本原因有'旧' sessionId 我猜......
    • 如何在测试中获取驱动程序对象?您上面的描述听起来像是引用了错误的驱动程序对象。
    • 只使用静态 getDriver();
    • 您的 PageObject 是否也在使用静态 getDriver(); ?
    • 是的。我已经更新了描述。请检查一下。
    猜你喜欢
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    相关资源
    最近更新 更多