问题描述
 
     我有一个PageObject startPage ,我有一个登录和一个注销方法。 
     登录方法工作正常,并在@BeforeScenario执行: 
@BeforeScenario
public void login() {
    // {..} Declaration of baseUrl,user,password...
    homeVM.setDefaultBaseUrl(baseUrl);
    homeVM.open();
    homeVM.login(user, password); 
}
 
     class 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();
}
 
     使用方法logoff() class homeVM如下所示: 
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 ,但是我得到了我需要的所有信息,只是@AfterScenario中的getDriver()为空。 
     任何想法或解决方案下一步做什么或为什么会发生这种情况? 
     我正在使用chromeDriver 。 
 
     编辑:好的,我认识到了一些意想不到的事情:我在上一步中有一个assertThat(<something>)方法,这一步实际上产生了一个赋值失败(因为行为尚未实现)......如果我评论这个assertThat() out, @AfterScenario及其注销正确执行。 
     如果测试失败, webDriver会“清空”吗? 
     这是故意的吗? 
 
     EDIT2:如果我捕获AssertionErrorException异常,测试再次运行正常,但当然测试将被标记为“Test Passed”。 
     因此,如果抛出异常,当前的webDriver被清空,它确实有一些事情要做。 
     但这似乎是错误的...... 
1楼
一旦Serenity(或在这种情况下为Thucydides)发现测试失败(例如来自断言错误),测试将切换到“干运行”模式,因为它认为后续步骤受到损害并可能导致不必要(和缓慢)网络驱动程序调用
2楼
正如我从John Smart发现的那样,一旦Serenity发现测试失败,测试就会切换到“ 干运行 ”模式,因此不再需要Web驱动程序调用,我必须找到另一种方法来执行注销。 由于我的chromedriver默认运行在同一会话和浏览器中的所有场景,我必须在每个场景后执行手动注销。 但通过设置
System.setProperty("restart.browser.each.scenario", "true");
 
     可以在每个方案之后重新启动浏览器并清理会话。 
     这对我@AfterScenario ,所以我不需要@AfterScenario和logoff(); 
     了。 
3楼
克服黄瓜watir框架中的问题
filename = DateTime.now.strftime(“%Y-%m-%d - %Hh_%Mm_%Ss”)
@ browser.driver.save_screenshot(“#{filename} .png”)
注意:filename是屏幕截图文件的名称
您也可以像这样传递屏幕截图文件的位置