如何处理页面对象模式中 HTMLControl 内部文本的变化?
How do I handle variations in HTMLControl Inner Text in a Page Object Pattern?
这里有一些关于我的项目规格的背景信息:
- 我们使用 Specflow 和 Microsoft CodedUI 框架 UI 自动化
- 我构建了一个 PageFactory,它结合了三个抽象基础 类:所有地图、页面和验证器都继承的 BasePage、BaseMap 和 BaseValidator
- 我们正在自动化的应用程序有许多定义的工作流 HTML 控件具有不同的 InnerText 值(例如 HTMLComboBoxes)
- 一切都需要从页面对象模式中的实际 Specflow 测试代码中抽象出来,Specflow 步骤中不能存在唯一的代码
在我的地图中,我有一些控件,例如组合框,如果选择了某个工作流程,它的 InnerText 会发生变化。我需要构建断言和验证语句以确保 InnerText 对于所选工作流是正确的。这不是问题。但是,我不想为每个 InnerText 更改定义一个新变量(有很多)。
有什么方法可以解释页面对象模式中的 InnerText 变体,而不必为每个变体编写一个新变量?
这是地图条目的示例:
public HtmlComboBox NextActionControlDropDownList()
{
var NextActionControlDropDownList = new PropertyExpressionCollection {
new PropertyExpression(HtmlComboBox.PropertyNames.Id, "MEDCHARTContent_EmmpsContent_nextActionControl_ActionDropDownList", PropertyExpressionOperator.EqualTo)
};
return Window.Find<HtmlComboBox>(NextActionControlDropDownList);
}
这是基本控件定义。也可以是这样的:
public HtmlComboBox NextActionControlARFormalComplReview()
{
var NextActionControlARFormalComplReview = new PropertyExpressionCollection {
new PropertyExpression(HtmlComboBox.PropertyNames.Id, "MEDCHARTContent_EmmpsContent_nextActionControl_ActionDropDownList", PropertyExpressionOperator.EqualTo),
new PropertyExpression(HtmlComboBox.PropertyNames.InnerText, "--Select Action-- Return to USARC ", PropertyExpressionOperator.EqualTo)
};
return Window.Find<HtmlComboBox>(NextActionControlARFormalComplReview);
}
到目前为止我的想法是制作另一张地图并继承它?但这并不能解决我最初的单个控件变量太多的问题。我看不出 If 语句有何帮助,因为需要为框架定义它才能找到控件。也许我可以将不同的值存储在一个集合中,并有一个参数键值来访问它们……但这似乎我会 运行 陷入很多问题。
如果您尝试查看 PropertyExpressionOperator
下的方法,您会看到名为 Contains
.
的内容
new PropertyExpression(HtmlComboBox.PropertyNames.InnerText, "--Select Action--", PropertyExpressionOperator.Contains)
这里有一些关于我的项目规格的背景信息:
- 我们使用 Specflow 和 Microsoft CodedUI 框架 UI 自动化
- 我构建了一个 PageFactory,它结合了三个抽象基础 类:所有地图、页面和验证器都继承的 BasePage、BaseMap 和 BaseValidator
- 我们正在自动化的应用程序有许多定义的工作流 HTML 控件具有不同的 InnerText 值(例如 HTMLComboBoxes)
- 一切都需要从页面对象模式中的实际 Specflow 测试代码中抽象出来,Specflow 步骤中不能存在唯一的代码
在我的地图中,我有一些控件,例如组合框,如果选择了某个工作流程,它的 InnerText 会发生变化。我需要构建断言和验证语句以确保 InnerText 对于所选工作流是正确的。这不是问题。但是,我不想为每个 InnerText 更改定义一个新变量(有很多)。
有什么方法可以解释页面对象模式中的 InnerText 变体,而不必为每个变体编写一个新变量?
这是地图条目的示例:
public HtmlComboBox NextActionControlDropDownList()
{
var NextActionControlDropDownList = new PropertyExpressionCollection {
new PropertyExpression(HtmlComboBox.PropertyNames.Id, "MEDCHARTContent_EmmpsContent_nextActionControl_ActionDropDownList", PropertyExpressionOperator.EqualTo)
};
return Window.Find<HtmlComboBox>(NextActionControlDropDownList);
}
这是基本控件定义。也可以是这样的:
public HtmlComboBox NextActionControlARFormalComplReview()
{
var NextActionControlARFormalComplReview = new PropertyExpressionCollection {
new PropertyExpression(HtmlComboBox.PropertyNames.Id, "MEDCHARTContent_EmmpsContent_nextActionControl_ActionDropDownList", PropertyExpressionOperator.EqualTo),
new PropertyExpression(HtmlComboBox.PropertyNames.InnerText, "--Select Action-- Return to USARC ", PropertyExpressionOperator.EqualTo)
};
return Window.Find<HtmlComboBox>(NextActionControlARFormalComplReview);
}
到目前为止我的想法是制作另一张地图并继承它?但这并不能解决我最初的单个控件变量太多的问题。我看不出 If 语句有何帮助,因为需要为框架定义它才能找到控件。也许我可以将不同的值存储在一个集合中,并有一个参数键值来访问它们……但这似乎我会 运行 陷入很多问题。
如果您尝试查看 PropertyExpressionOperator
下的方法,您会看到名为 Contains
.
new PropertyExpression(HtmlComboBox.PropertyNames.InnerText, "--Select Action--", PropertyExpressionOperator.Contains)