我正在使用Java中的WebDriver编写测试套件。重要的是,测试是功能测试,而不是单元测试。通常,相同的测试用例将按顺序运行几次,使用不同的数据 - 例如,"创建应用程序"每个应用程序都有不同的名称和组件。
测试用例执行路径包括一些对话框。在每个对话框中,都可能发生错误(例如,"未找到组件")。目前,我的代码会在错误发生的地方处理错误 - 例如:(这是一个简化的示例,而不是一段生产代码,它没有经过测试,所以请原谅琐碎的错误)
WebElement component;
try {
component = componentsDialog.findElement(By.xpath("@class='component' and @componentId = '" + componentId + "']"));
} catch ( NoSuchElementException nse ) {
log.error("Component not found");
driver.switchTo().activeElement().sendKeys(Keys.ESCAPE);
stoppedOnError = true;
return;
}
component.click();
WebElement buttonAdd =
componentsDialog.findElement(By.className("addbutton"));
buttonAdd.click();
这与错误处理不同。如果我将来选择使用它,可能很难集成到TestNG中。
但是我不能将它留给测试用例的一般NoSuchElementException处理程序。大多数情况下,NoSuchElementException意味着UI已经改变(或者我在测试代码中犯了错误)。在这种情况下,这意味着此测试用例实例的特定配置是错误的。该配置由用户设置。这是一个不同的错误,应该以不同的方式报告。
所以我可以抓住异常并使用正确的消息引发另一个异常......但请注意按下Esc键的部分。我关闭组件选择对话框,以便UI的状态与组件选择成功时相同。在此测试用例的其余部分中,此特定对话框未打开。那么异常处理程序(在测试用例方法的末尾或调用者中)如何知道UI当前处于什么状态以及恢复需要做什么?
(自动检测是可能的但是片状,因为它将依赖于检测每个可能的对话框中是否存在某些独特的元素。)
那么我该怎么做才能在即时执行流之外启用错误处理?在某处保留一些状态跟踪变量?这似乎非常容易出错。
我当然可以尝试切换到页面对象模型。该模型让我觉得非常重量级,需要将代码行增加一个数量级,并且只有在许多不同的测试用例使用相同的控件时才能获得回报。 (通常,在我的情况下,到目前为止,不同的用例使用不同的UI元素,因此我不了解该模型将如何得到回报)。
也许这种印象是错误的。但即使我使用该模型,每个页面都是一个不相关的对象 - 我如何知道当时哪个页面实际处于活动状态?当另一个页面处于活动状态时调用页面的方法只会导致无意义的异常(在没有复杂的检测逻辑的情况下)。
答案 0 :(得分:0)
如果我要写这段代码,我会这样写。
List<WebElement> component = componentsDialog.findElements(By.xpath("@class='component' and @componentId = '" + componentId + "']"));
if (component.isEmpty())
{
log.error("Component not found");
driver.switchTo().activeElement().sendKeys(Keys.ESCAPE);
componentsDialog.findElement(By.className("addbutton")).click();
}
else
{
component.get(0).click();
}
你不需要(和IMO不应该)抛出任何例外。如果您查看the docs,请说明
不应该使用findElement来查找不存在的元素,使用findElements(By)并断言零长度响应。
哦......以及关于页面对象的评论。它不应该需要更多的额外代码......如果做得对,绝对不会更多。它的作用是更好的组织,更好地重用代码,减轻维护负担等等。将页面或对话框的所有代码放入单个类中可以在事情发生变化或需要修复错误时更轻松地更新脚本。它将大大减少您的维护工作。