Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Automated tests 页面对象模式以及如何实现一些最佳实践_Automated Tests_Ui Automation_Microsoft Ui Automation - Fatal编程技术网

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”对话框页面中找到对话框对象,然后按OK)。使用这种方法,我无法返回下一页对象

为了解决这个问题,我看到了这些机会,我想从中获得一些反馈,其中哪些可能是“最好的”,以及您还有哪些其他想法

  • 为每个“OK”对话框实现一个专用对话框,返回下一个特定页面对象
  • 创建一个通用的简单对话框,其中类型参数是下一个页面对象,并注入逻辑以某种方式查找并返回下一个页面对象(可能?如何做?)
  • 不要遵循最佳实践,使用当前方法,即简单的“确定”对话框页面对象不返回下一个页面对象,“测试逻辑”正在解析并调用下一个页面对象本身
  • 让第一个页面对象处理简单的“OK”对话框页面对象的调用,然后从这里返回下一个页面对象;这对于一个简单的“OK”对话框来说是不错的,但是我假设如果它是一个更复杂的“是/否”对话框,我会有一个惊人的编码体验
感谢您的帮助和反馈


ps:可能很重要:编程语言是C#

Selenium guides,用于将PageObject返回到“通过我们的应用程序模拟用户的旅程” 根据行程类型,以下选项适用:

  • 选项二:如果“Simple OK Dialog”是用户旅程的一部分(即,您将在测试中使用此页面对象),则可以使用通用类方法
SimpleDialogPage声明:

公共类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();
}
}
}

您已经看到这个问题了吗?