我有一个名为 startPage
的PageObject
,其中包含登录和退出方法。登录方法可以正常工作,并在 @BeforeScenario
中执行:
@BeforeScenario
public void login() {
// {..} Declaration of baseUrl,user,password...
homeVM.setDefaultBaseUrl(baseUrl);
homeVM.open();
homeVM.login(user, password);
}
homeVM
类中的 login(user,password)
方法类似于:
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
)。为什么会这样?我试图检查我测试中上一个PageObject
中的getDriver()
,但是那里我得到了所有我需要的信息,只有在@AfterScenario
中getDriver()
为空。有什么想法或解决方案该如何处理或者为什么会发生这种情况?我正在使用chromeDriver
。编辑:好吧,我意识到了一些意外的事情:我在最后一步中有一个
assertThat(<something>)
方法,实际上这一步正在产生一个分配失败(因为行为还没有实现)...如果我注释掉这个assertThat()
,那么@AfterScenario
和它的注销将被正确执行。所以如果测试失败,webDriver
会被"清空"? 这是有意的吗?编辑2:如果我捕获
AssertionErrorException
异常,测试就会再次运行良好,但当然测试将被标记为“测试通过”。所以如果抛出异常,则当前的webDriver
会被清空。但这似乎是错误的...
@AfterScenario
方法中使用 Web Driver 调用(例如执行注销,因为我始终希望从登录开始我的场景),我该怎么办? - spcial