我有一个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)发现测试失败(例如,由于断言错误),则测试将切换为“空运行”模式,因为它认为后续步骤受到了损害,并可能导致不必要的(且缓慢)网络驱动程序调用。