当您自动化Web UI测试时,您希望组织测试以使其可维护并尽可能减少代码重复。要走的路是Page Object pattern。
你在现实世界的项目中尝试过吗?还有其他选择吗?你如何模拟复杂的网站(几个嵌套的母版页,弹出窗口,大型表格与疯狂的验证)?我对一般模式以及特定情况(Selenium / ASP.NET MVC / NUnit)感兴趣。
答案 0 :(得分:5)
你问过很多问题,我会尝试回答其中的一些问题。
我在使用Selenium和桌面WinForms应用程序的Web应用程序中使用了Page Object(虽然这不是严格的Page Object,但我以相同的方式使用它 - 也许是View Object)。我的判决是它很有效,我肯定会推荐它。
这是一个简短的例子,说明测试的样子,我们编写它的方式:
[Test]
public void AccountPageNameIsLoggedInUsersName()
{
FirstPage() // Returns FirstPage
.LoginAs("tobbe", "s3cr3t") // Returns LoggedInPage
.ClickOnMyAccount() // Returns MyAccountPage
.AssertThat(p => p.Name, Is.EqualTo("tobbe")); // p is of type MyAccountPage
}
这里,Selenium magic放在FirstPage()方法和页面内。这样,您可以隐藏测试中所有不必要的实现细节。我想你可以弄清楚这些方法是如何实现的。
将Selenium内容隐藏在页面中的一个好处是,您可以在不更改测试的情况下将其转换为例如一个Model-View-Presenter测试,其中PageObject表示视图(类似于我在WinForms应用程序中所做的那样)。
关于母版页,我们所做的是用界面装饰页面并在这些界面上创建扩展方法:
public class LoggedInPage : Page<LoggedInPage>, IMainMenuHolder { ... }
public static class MainMenuHolderExtensions
{
public static MyAccountPage ClickOnMyAccount(this IMainMenuHoder me) { ... }
}
答案 1 :(得分:2)
答案 2 :(得分:1)
我在博客上写过关于复杂页面对象的文章。见http://burdettelamar.wordpress.com/2014/03/21/keep-your-page-objects-dry/
这个想法是与继承共享公共页面元素(我用C#编写)。在Ruby中,您可以使用混合;在Python,模块等