对于@AfterScenario,Selenium getDriver()为空(在AssertionError之后)

时间:2015-07-17 10:14:25

标签: java selenium selenium-webdriver selenium-chromedriver jbehave

我有一个PageObject startPage,我有登录和注销方法。登录方法工作正常,并在@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()只是空的(甚至不是空的,所以我没有得到NullPointerException)。为什么会这样?我尝试检查getDriver()我在测试中使用的最后PageObject但是我得到了我需要的所有信息,getDriver()中的@AfterScenario为空。任何想法或解决方案下一步做什么或为什么会发生这种情况?我正在使用chromeDriver

修改 好的,我意识到了一些意外的事: 在我的最后一步中我有一个assertThat(<something>)方法,这一步实际上产生了一个赋值失败(因为行为尚未实现)......如果我对此assertThat()发表评论,那么{{1并且它的注销正确执行。如果测试失败,@AfterScenario会被“清空”吗?这是故意的吗?

EDIT2: 如果我抓住webDriver异常,测试再次运行正常,但当然测试将被标记为“测试通过”。因此,如果抛出异常,当前AssertionErrorException被清空,它确实有一些事情要做。但这似乎是错误的......

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

正如我从 John Smart 中发现的那样,一旦Serenity发现测试失败,测试就会切换到“干运行”模式,因此无法调用Web驱动程序我不得不找到另一种方法来执行注销。 由于我的chromedriver默认运行在同一会话和浏览器中的所有场景,我必须在每个场景后执行手动注销。但是通过设置

System.setProperty("restart.browser.each.scenario", "true");

可以在每个方案之后重新启动浏览器并清理会话。这对我有用,所以我不再需要@AfterScenariologoff();

答案 2 :(得分:0)

克服黄瓜watir框架中的问题

filename = DateTime.now.strftime(“%Y-%m-%d - %Hh_%Mm_%Ss”)

@ browser.driver.save_screenshot(“#{filename} .png”)

注意:   filename是屏幕截图文件的名称

你可以像这样传递截图文件的位置

@ browser.driver.save_screenshot(“/ Screenshots /#{filename} .png”)