Automated tests 页面对象模式以及如何实现一些最佳实践
从一个页面对象导航到另一个页面对象时,从一个页面对象返回下一个页面对象似乎是一种最佳做法Automated tests 页面对象模式以及如何实现一些最佳实践,automated-tests,ui-automation,microsoft-ui-automation,Automated Tests,Ui Automation,Microsoft Ui Automation,从一个页面对象导航到另一个页面对象时,从一个页面对象返回下一个页面对象似乎是一种最佳做法 如果导航到另一个页面,初始页面对象应为新页面返回另一个页面对象 “导航时,应返回下一页的页面对象” 我遇到的情况是,在第一个页面对象之后,一个简单的“OK”对话框通知用户状态。单击“确定”后,下一个页面对象出现。因为我经常在应用程序中处理这样简单的“OK”对话框,所以直到现在我都是以一种通用的方式来处理的(在“OK”对话框页面中找到对话框对象,然后按OK)。使用这种方法,我无法返回下一页对象 为了解
如果导航到另一个页面,初始页面对象应为新页面返回另一个页面对象
“导航时,应返回下一页的页面对象”
- 为每个“OK”对话框实现一个专用对话框,返回下一个特定页面对象
- 创建一个通用的简单对话框,其中类型参数是下一个页面对象,并注入逻辑以某种方式查找并返回下一个页面对象(可能?如何做?)
- 不要遵循最佳实践,使用当前方法,即简单的“确定”对话框页面对象不返回下一个页面对象,“测试逻辑”正在解析并调用下一个页面对象本身
- 让第一个页面对象处理简单的“OK”对话框页面对象的调用,然后从这里返回下一个页面对象;这对于一个简单的“OK”对话框来说是不错的,但是我假设如果它是一个更复杂的“是/否”对话框,我会有一个惊人的编码体验
ps:可能很重要:编程语言是C#Selenium guides,用于将PageObject返回到“通过我们的应用程序模拟用户的旅程” 根据行程类型,以下选项适用:
- 选项二:如果“Simple OK Dialog”是用户旅程的一部分(即,您将在测试中使用此页面对象),则可以使用通用类方法
公共类SimpleDialogPage
{
私人IWebDriver;
公共SimpleDialogPage(IWebDriver){
this.driver=driver;
}
公共T单击OK(){
返回新的T(驱动器);
}
}
从“第一页”调用SimpleDialogPage
public SimpleDialogPage ClickNext(){
返回新的SimpleDialogPage(驱动程序)
}
- 选项四:如果“Simple OK Dialog”不是用户旅程的一部分(即,您不打算在测试中使用此页面对象),只需将其隐藏在操作后面即可
下一页单击下一步并确认文件(){
SimpleDialogPage警报=_按钮下一步。单击();
alert.ClickOk();
返回新的下一页(驱动程序);
}
谢谢@Anatoly
我是按照你的建议用一种接近的方式做的。
当前的草案需要一些重构,但总体概念似乎还不错:
使用FlaUI.Core.AutomationElements;
使用制度;
命名空间Bvms.UiAutomation.SDK.Commons
{
///增强的简单对话框,允许指定两个代理来定义下一页对象
///对于确认和取消案例。
///确认时的下一页对象(确定)。
///取消时的下一页对象(取消)。
///
公共类GenericDialog:对话框,其中T:PageObject,其中TU:PageObject
{
受保护的只读函数确认命令;
受保护的只读Func\u取消命令;
公共常规对话框(窗口父窗口、字符串窗口标题、TimeSpan超时)
:此(父窗口、窗口标题、超时、null、null)
{
}
公共常规对话框(窗口父窗口、字符串窗口标题、TimeSpan超时、Func确认命令、Func取消命令)
:base(父窗口、窗口标题、超时)
{
_确认命令=确认命令;
_取消命令=取消命令;
}
公共新建虚拟(T,TU)EndDialog(DialogCompletion DialogCompletion)
{
开关(对话框完成)
{
案例完成。确认:
返回(ConfirmDialog(),默认值);
案例完成。取消:
返回(默认值,CancelDialog());
违约:
抛出新ArgumentOutOfRangeException(nameof(dialogCompletion),dialogCompletion,null);
}
}
公共虚拟T ConfirmDialog()
{
if(null==\u确认命令)
{
抛出新的NotImplementedException($“使用ConfirmDialog(Func confirmationCommand)或使用ctor:GenericDialog(窗口父窗口,字符串windowsTitle,TimeSpan超时,Func confirmationCommand,Func cancelCommand)”创建);
}
返回确认对话框(_confirmationCommand);
}
公共虚拟对话框()
{
如果(空==\u取消命令)
{
抛出新的NotImplementedException($“使用CancelDialog(Func cancelCommand)或使用ctor:GenericDialog(窗口父窗口、字符串windowsTitle、TimeSpan超时、Func确认命令、Func cancelCommand)创建”);
}
返回CancelDialog(_cancelCommand);
}
公共虚拟T确认对话框(Func确认命令)
{
base.EndDialog(DialogCompletion.Confirmation);
返回确认命令();
}
公共虚拟取消对话框(Func cancelCommand)
{
base.EndDialog(DialogCompletion.Cancellation);
返回cancelCommand();
}
}
}
您已经看到这个问题了吗?