2017-04-23 49 views
0

我正在使用Java中的WebDriver编写测试套件。重要的是,测试是功能测试,而不是单元测试。通常,相同的测试用例将按不同的数据依次运行几次 - 例如,为每个应用程序使用不同名称和组件的“创建应用程序”。Java,WebDriver,断言/异常和UI状态

测试用例executon路径包含几个对话框。在每个对话框中,都会发生错误(例如,“未找到组件”)。目前,我的代码处理错误旁边他们碰巧在那里 - 例如:(这是一个简化的例子不是一块的生产代码,它并没有进行测试,所以请原谅微不足道的失误)

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(); 

这是对于错误处理来说不是很像Java。如果我将来选择使用TestNG,可能很难融入TestNG。

但我不能就这么离开这个测试用例一般NoSuchElementException异常处理程序。大多数时候,NoSuchElementException意味着UI已经改变(或者我在测试代码中犯了一个错误)。在这种情况下,这意味着这个测试用例的特定配置是错误的。并且该配置由用户设置。这是一个不同的错误,应该以不同的方式报告。

所以我可以只捕获异常,并再多问,用正确的信息......但要注意的地方Escape键被按下的部分。我关闭组件选择对话框,以便UI的状态与组件选择成功相同。在这个测试案例的其余部分中,这个特定的对话框并没有打开。那么,异常处理程序(在测试用例方法或调用程序结束时)如何知道UI当前处于什么状态以及需要做什么来恢复?

(自动检测是可能的,但片状,因为这将依赖于检测一些元件独特为每个可能的对话框的存在下)。

所以,我该怎么办在这里,为了使错误处理的立即执行流之外?在某处保留一些状态跟踪变量?这似乎很容易出错。

我当然可以尝试切换到页面对象模型。这个模型让我感觉非常重量级,要求增加一行代码量,并且只有在许多不同的测试用例使用相同的控件时才能获得回报。 (通常,在我的情况下,迄今为止,不同的用例使用不同的UI元素,所以我不明白这个模型会如何回报)。

也许这个印象是错误的。但即使我使用模型,每个页面都是不相关的对象 - 我怎么知道当时哪个页面实际上处于活动状态?在另一个页面处于活动状态时调用页面的方法只会导致无意义的异常(在没有复杂的检测逻辑的情况下)。

回答

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(通过),并断言零长度响应代替。

哦......和你有关页面对象评论。它不应该需要额外的代码......如果做得对,绝对不会有更多的数量级。它的功能是更好地组织,更好地重用代码,减轻维护负担等等。将所有的页面或对话框代码放到一个类中,当事情发生变化或需要修正错误时,更容易更新脚本。这将大大减少您的维护工作量。

+0

将findElement方法更改为findElements – Grasshopper

+0

为了让您的示例与我的示例工作相同,我们需要将最后一行移到else块中。请注意我的示例中的return语句。 –

+0

而在现实生活中,单击添加按钮不会结束测试用例。在测试用例中有几个这样的检查,所以我最终会将它的最后一部分缩小很多。我使用return语句来避免这种情况。 –