Selenium的getDriver()在@AfterScenario(断言失败后)中为空

3

我有一个名为 startPagePageObject,其中包含登录和退出方法。登录方法可以正常工作,并在 @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(),但是那里我得到了所有我需要的信息,只有在@AfterScenariogetDriver()为空。有什么想法或解决方案该如何处理或者为什么会发生这种情况?我正在使用chromeDriver
编辑:好吧,我意识到了一些意外的事情:我在最后一步中有一个assertThat(<something>)方法,实际上这一步正在产生一个分配失败(因为行为还没有实现)...如果我注释掉这个assertThat(),那么@AfterScenario和它的注销将被正确执行。所以如果测试失败,webDriver会被"清空"? 这是有意的吗?
编辑2:如果我捕获AssertionErrorException异常,测试就会再次运行良好,但当然测试将被标记为“测试通过”。所以如果抛出异常,则当前的webDriver会被清空。但这似乎是错误的...
3个回答

2

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


谢谢您的回答!但是如果我需要在 @AfterScenario 方法中使用 Web Driver 调用(例如执行注销,因为我始终希望从登录开始我的场景),我该怎么办? - spcial

1

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

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

在每个场景之后重新启动浏览器并清除会话是可行的。这对我起作用,所以我不再需要@AfterScenariologoff();了。


0

解决Cucumber 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")


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接