Selenium getDriver() 对于@AfterScenario 是空的(在 AssertionError 之后)
Selenium getDriver() is empty for @AfterScenario (after AssertionError)
我有一个 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();
}
和 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
但是我得到了我需要的所有信息,只是 @AfterScenario
中的 getDriver()
是空的。任何想法或解决方案下一步该做什么或为什么会发生这种情况?我正在使用 chromeDriver
.
编辑:
好吧,我意识到了一些意想不到的事情:
我在最后一步有一个 assertThat(<something>)
方法,这一步实际上产生了一个赋值失败(因为行为尚未实现)......如果我评论这个 assertThat()
, @AfterScenario
并且其注销已正确执行。那么如果测试失败,webDriver
会得到 "emptied"?这是故意的吗?
编辑2:
如果我捕捉到 AssertionErrorException
异常,测试将再次正常运行,但当然测试将被标记为 "Test Passed"。因此,如果抛出异常,当前 webDriver
被清空,它确实有一些事情要做。但这似乎是错误的...
一旦 Serenity(或本例中的 Thucydides)发现测试失败(例如断言错误),测试将切换到 "dry-run" 模式,因为它认为后续步骤已被破坏并可能导致不必要的(和缓慢的)网络驱动程序调用。
正如我从 John Smart 那里发现的那样,一旦 Serenity 发现测试失败,测试就会切换到“dry-运行" 模式,因此无法再调用 Web 驱动程序,我不得不寻找另一种方法来执行注销。
作为我的 chromedriver 运行s 默认情况下,所有场景都在同一会话和浏览器中,我必须在每个场景后执行手动注销。但是通过设置
System.setProperty("restart.browser.each.scenario", "true");
可以在每个场景后重新启动浏览器并清理会话。这对我有用,所以我不再需要 @AfterScenario
和 logoff();
。
克服 Cucumber watir 框架中的问题
文件名=DateTime.now.strftime("%Y-%m-%d--%Hh_%Mm_%Ss")
@browser.driver.save_screenshot ("#{filename}.png")
注意:
filename 为截图文件名
你也可以这样传递截图文件的位置
@browser.driver.save_screenshot ("/Screenshots/#{filename}.png")
我有一个 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();
}
和 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
但是我得到了我需要的所有信息,只是 @AfterScenario
中的 getDriver()
是空的。任何想法或解决方案下一步该做什么或为什么会发生这种情况?我正在使用 chromeDriver
.
编辑:
好吧,我意识到了一些意想不到的事情:
我在最后一步有一个 assertThat(<something>)
方法,这一步实际上产生了一个赋值失败(因为行为尚未实现)......如果我评论这个 assertThat()
, @AfterScenario
并且其注销已正确执行。那么如果测试失败,webDriver
会得到 "emptied"?这是故意的吗?
编辑2:
如果我捕捉到 AssertionErrorException
异常,测试将再次正常运行,但当然测试将被标记为 "Test Passed"。因此,如果抛出异常,当前 webDriver
被清空,它确实有一些事情要做。但这似乎是错误的...
一旦 Serenity(或本例中的 Thucydides)发现测试失败(例如断言错误),测试将切换到 "dry-run" 模式,因为它认为后续步骤已被破坏并可能导致不必要的(和缓慢的)网络驱动程序调用。
正如我从 John Smart 那里发现的那样,一旦 Serenity 发现测试失败,测试就会切换到“dry-运行" 模式,因此无法再调用 Web 驱动程序,我不得不寻找另一种方法来执行注销。 作为我的 chromedriver 运行s 默认情况下,所有场景都在同一会话和浏览器中,我必须在每个场景后执行手动注销。但是通过设置
System.setProperty("restart.browser.each.scenario", "true");
可以在每个场景后重新启动浏览器并清理会话。这对我有用,所以我不再需要 @AfterScenario
和 logoff();
。
克服 Cucumber watir 框架中的问题
文件名=DateTime.now.strftime("%Y-%m-%d--%Hh_%Mm_%Ss")
@browser.driver.save_screenshot ("#{filename}.png")
注意: filename 为截图文件名
你也可以这样传递截图文件的位置