【问题标题】:Accessing a property of a non-static class without assigning it to a variable访问非静态类的属性而不将其分配给变量
【发布时间】:2021-11-20 12:57:15
【问题描述】:

我正在使用 Selenium、C# 和页面对象模式编写自定义自动化框架。 我试图在不停止语句的情况下从页面中提取一些值。

基本上我想转这个:

    var page = Login()
        .OpenPage();

    page.Remember(page.Title);
    page.MoreActions()
        .MoreNavigation();

进入这个:

    var page = Login()
        .OpenPage()
        .Remember(???.Title)
        .MoreActions()
        .MoreNavigation();

不确定这是否可能以及我当时如何访问该课程。

注意事项:

  • 所有方法都返回页面
  • 有一个基本的 Page 类和很多 PageName : Page<PageName> 类,代表我在测试中使用的实际类
  • 我想在Page 类中实现Remember 方法,以便我可以在任何地方使用它。
  • 类具有我想用来记住值的属性
LoginPage : NavPage<LoginPage>
{
    public override string Title => "Hardcoded Title";
    public string OtherProperty => pageContent.GetSomeValue();
...
}
  • 我有一个测试参数字典。我想记住其中一个参数的值。

我无法使用的解决方案:

  • 将类设为静态并使用类名不是一种选择,因为我们的页面结构基于继承和重载方法。
  • 在所有页面上创建 RememberTitle 方法不是一个选项,因为我想将值记住到参数字典中,并且这样的参数不能通过引用传递。

更新: 根据 cmets,我尝试实现 lamda 表达式:

        public static NavPage<T> Remember(this NavPage<T> page, Func<NavPage<T>, string> getTitle)
        {
            var title = getTitle(page);                      
            //use Title
            return page;
        }
  .Remember(p => p.Title);

新的错误是There is no argument given that corresponds to the required formal parameter getTitle

【问题讨论】:

  • 如果这些方法不返回您所追求的对象,这是不可能的。为了使这成为可能,库和这些方法中的每一个都需要具有某种流畅的 API 支持,例如。通过返回具有您尝试链接的下一个方法的对象类型。检查.Remember()方法是否有允许你传入一个lamda如.Remember(r =&gt; r.Page)的重载
  • 我不熟悉这个框架,但是我假设你可以为页面类型写一个扩展方法,叫做 smth,比如RememberTitle,调用里面的Remember 方法并返回页面。其他方法也一样。
  • 也许这需要一点澄清:这是一个使用页面对象模型的自定义框架。所有方法都返回对象,包括Remember()。 @DavidOganov为我们想要记住的所有事情创建类似RememberTItle的方法的问题是1)页面类中有很多额外的方法2)我想将值记住到超出范围的自定义参数字典中在页面上。 @Stefanos lamda 似乎是要走的路;我正在尝试做类似的事情,但我不确定r 应该是什么
  • @IoanaNicu 无论是自定义框架还是您编写的都没有关系。我打算做的是有一个这样的方法:public static Page Remember(this Page page, Func&lt;Page, string&gt; getTitle) { var title = getProperty(page); // Use the title return page; } 我会把这个作为更好的格式和可读性的答案发布

标签: c# selenium pageobjects


【解决方案1】:

你可以做的是写一个extension method来达到你想要的结果。 假设您提到的 pagePage 类型,而您提到的 Titlestring 类型。那么就可以有如下扩展方法:

public static Page Remember(this Page page, Func<Page, string> getTitle)         
{             
    var title = getTitle(page);             
    // Use the title
    page.Remember(page.title);

    // Return page object for further chaining
    return page;         
}

那么你可以通过以下方式使用这个扩展方法:

 var page = Login()
    .OpenPage()
    .Remember(p => p.Title)
    .MoreActions()
    .MoreNavigation();

【讨论】:

  • 这听起来像是一个很好的解决方案,但我无法让它发挥作用。我添加了有关页面内部的更多详细信息。也许在尝试简化代码时我忽略了一些关键信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 2023-03-06
  • 2022-07-21
  • 1970-01-01
相关资源
最近更新 更多