java - 构建对象列表时仅检索某些属性
问题描述
我最近从 C# 切换到 Java,但无法解决这个问题。我是使用 selenium 的自动化 UI。我喜欢为页面上的元素列表构建模型,检索属性,然后使用这些属性。在下面的示例中,我在 amazon.com 上搜索并获取结果列表。我有SearchResultsModel
代表返回的每个项目的类,public List<SearchResultModel> GetAllResults(bool title = false;bool isPrime = false;bool price = false)
从 UI 检索数据并将其放置在我的模型中的方法,它具有允许我操作我想要检索的数据而不是检索所有内容的默认参数。然后我在这个实例中调用, List<SearchResultModel> actual = myPage.GetAllResults(title:true,isPrime:true);
我得到一个 SearchResultsModel 列表,每个列表只包含 2 个属性——title 和 isPrime。
在理想的世界中,我应该从页面中检索所有数据,但是这样做需要花费大量时间,并且违背了自动化比手动测试更快的整个目的。
我可以使用方法重载,但最终我会使用数十甚至数百种方法。在这个例子中,我只有 3 个属性,所以我最终会有 9 个方法,如果一个对象有 10 个属性,我什至不敢做一个数学运算。我可以使用 varagrs,但随后建立一个论点将变得一团糟。我不确定如何在 Java 中解决这个问题。请指教
public class SearchResultsModel
{
//model that represents a single search result item
public string Title{get;set;}
public boolean IsPrime{get;set;}
public float Price {get;set;]
}
//method to retrieve all the search results from UI
public List<SearchResultModel> GetAllResults(bool title = false;bool isPrime = false;bool price = false)
{
List<SearchResultModel> toReturn = new List<SearchResultModel>();
IList<IWebElement> results = driver.FindElements(By.css("my locattors"))
foreach(IWebElement element in results)
{
SearchResultModel result = new SearchResultModel();
result.Title = title? element.FindElement(By.css("some locator")).GetText(): null;
result.IsPrime = isPrime? element.FindElement(By.css("some locator")).Selected(): false;
result.Price = price? element.FindElement(By.css("some locator")).GetText(): null;
toReturn.Add(result);
}
return toReturn;
}
//this is how I can invoke objects only with a specific properties
List<SearchResultModel> actual = myPage.GetAllResults(title:true,isPrime:true);
foreach(SearchResultModel model in actual)
{
Assert.That(model.isPrime == true);
}
解决方案
我会建立一个代表你想要搜索的选项的类。它基本上与您的SearchResultsModel
. 您将该类的一个实例传递给该GetAllResults
方法,然后检查每个属性的值以查看它是否应该被拉出。
选项类的示例
public class SearchResultsOptions
{
public boolean Title{get;set;}
public boolean IsPrime{get;set;}
public boolean Price {get;set;]
...
}
GetAllResults
您的方法的改编版本
public List<SearchResultModel> GetAllResults(SearchResultsOptions searchResultsOptions)
{
List<SearchResultModel> toReturn = new List<SearchResultModel>();
IList<IWebElement> results = driver.FindElements(By.css("my locattors"))
foreach(IWebElement element in results)
{
SearchResultModel result = new SearchResultModel();
result.Title = searchResultsOptions.Title? element.FindElement(By.css("some locator")).GetText(): null;
result.IsPrime = searchResultsOptions.IsPrime? element.FindElement(By.css("some locator")).Selected(): false;
result.Price = searchResultsOptions.Price? element.FindElement(By.css("some locator")).GetText(): null;
// add more fields here
toReturn.Add(result);
}
return toReturn;
}
您必须实例化选项类,然后将其传递给您的方法
SearchResultsOptions searchResultsOptions = new SearchResultsOptions(true, false, true);
List<SearchResultModel> searchResultsModel = GetAllResults(searchResultsOptions);
推荐阅读
- c++ - 将 libtensorflow_cc.so 文件链接到 QT 项目
- javascript - 当鼠标移回处理程序元素时防止滑动事件
- r - r ggplot2 Ignoring unknown aesthetics with geom_rect
- ios - 导航栏后面的 UISplitView 奇怪的背景
- json - 在不知道 FileMaker 16 或 17 中元素名称的情况下,如何从 JSON 字符串中获取第一个元素?
- batch-file - 批处理 - 如果延迟支出,如何用表达式替换感叹号?
- r - 带有 scale_x_break 的轴刻度:更多刻度,只有一些标记
- javascript - 具有缩放和可更新数据错误的分组条形图
- c# - 领域驱动设计如何在不同的有界上下文中显示审计属性?
- list - 为什么在此函数中在开头或结尾追加无关紧要?哈斯克尔