【问题标题】:retrieving only certain properties when building a list of objects构建对象列表时仅检索某些属性
【发布时间】:2020-04-11 11:40:24
【问题描述】:

我最近从 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);
}

【问题讨论】:

    标签: java c# selenium


    【解决方案1】:

    我会构建一个类来表示您想要搜索的选项。它基本上与您的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);
    

    【讨论】:

    • 感谢@JeffC,为了扩展您的逻辑,我可以在public List&lt;SearchResultModel&gt; GetAllResults(boolean title, boolean isPrime, boolean isPrice) 中提供布尔值,然后由GetAllResults(true, false,true) 调用。老实说,这不是一个理想的方法,因为如果模型很大,比如说 15 个属性,那么我需要以正确的顺序传递 15 个布尔值作为参数,这很容易搞砸。再次感谢您的回答,我希望有一种更清洁的方式(可能是语言限制)
    • 是的...在 C# 中,您可以使用命名参数,这使得所有内容都更易于阅读,因此您不太可能将值传递给错误的参数。 Java 没有。您可以使用 Java 中的构建器模式来创建您的选项实例,然后将其传递给方法。请参阅 this 了解一个很好的例子。
    • 第一点……是的,你可以这样做,但如果你将所有选项打包在一个类中,它是可重用的。我一直使用这种方法来分组说客户信息,如名字、姓氏、地址、电话号码、电子邮件等。我创建一个实例,然后我可以将同一个实例传递给 5 种不同的方法。一个巨大的优势和节省时间。创建实例可能会很痛苦,但实际上没有办法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多