我有一个PageObject startPage,其中有一个登录名和一个注销方法。 login方法可以正常工作,并在@BeforeScenario中执行:

@BeforeScenario
public void login() {
    // {..} Declaration of baseUrl,user,password...

    homeVM.setDefaultBaseUrl(baseUrl);
    homeVM.open();
    homeVM.login(user, password);
}
login(user,password)中的class homeVM像这样:
typeInto(find(By.id(getUserFieldId())), user);
typeInto(find(By.id(getPasswordFieldId())), password);
findBy(getLoginButtonXPath()).then().click();

所以没什么特别的,这一切都很好。
然后,我在不同的测试步骤中切换了几个PageObjects都没有问题。当代码到达@AfterScenario时,如下所示:
@AfterScenario
public void logout() {
        homeVM.logoff();
}

和带有class homeVM方法的logoff()看起来像:
WebElement btnLogout = getDriver().findElement(By.xpath("//a [contains(@class,'lnkLogout')]"));
btnLogout.click();

但这是行不通的(什么也没有发生,没有例外,没有点击。。。然后,我尝试使用以下命令记录有关getDriver()的一些信息:
System.out.println("WindowHandles:"+getDriver().getWindowHandles().size());
System.out.println("Title: "+getDriver().getTitle());

并且两个值都为空(“”)。因此,getDriver()似乎只是空的(甚至不是null,所以我没有得到NullPointerException)。为什么会这样呢?我尝试检查getDriver()以获取测试中使用的最后一个PageObject,但在那里我获得了所需的所有信息,只是getDriver()中的@AfterScenario为空。任何想法或解决方案下一步做什么或为什么会发生这种情况?我正在使用chromeDriver

编辑:
好的,我发现了一些出乎意料的事情:
我在最后一步中有一个assertThat(<something>)方法,此步骤实际上是导致分配失败(因为尚未实现该行为)...,如果我注释掉此assertThat(),则正确执行了@AfterScenario及其注销。因此,如果测试失败,webDriver将被“清空”?这是故意的吗?

编辑2:
如果我发现AssertionErrorException异常,则测试会再次正常运行,但是测试当然会标记为“Test Passed”。因此,如果引发异常,则确实有必要执行此操作,以清空当前的webDriver。但这似乎是错误的...

最佳答案

一旦Serenity(在这种情况下为Thucydides)发现测试失败(例如,由于断言错误),则测试将切换为“空运行”模式,因为它认为后续步骤受到了损害,并可能导致不必要的(且缓慢)网络驱动程序调用。

10-06 09:19