You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# Selenium Page Object模式链式调用访问非静态类属性实现方案

解决方案

报错说明

你遇到的报错There is no argument given that corresponds to the required formal parameter getTitle翻译为:未提供与所需形参getTitle对应的实参。
该报错的核心原因是你编写的泛型扩展方法未给参数T添加继承约束,C#编译器无法识别lambda表达式中参数p的类型,导致签名匹配失败。

修正实现

方案1:泛型扩展方法修正版

给泛型参数添加约束即可解决报错,同时扩展支持自定义存储键,适配不同属性的存储需求:

// 给泛型参数T添加对应约束
public static NavPage<T> Remember<T>(this NavPage<T> page, Func<NavPage<T>, string> valueSelector, string dictKey = "LastPageTitle") 
    where T : NavPage<T>
{
    var extractedValue = valueSelector(page);
    // 写入你全局维护的参数字典即可
    GlobalTestParameters.ParameterDict[dictKey] = extractedValue;
    return page;
}

调用方式完全符合链式要求:

var page = Login()
    .OpenPage()
    .Remember(p => p.Title, "LoginPageTitle")
    .Remember(p => p.OtherProperty, "LoginPageCustomVal")
    .MoreActions()
    .MoreNavigation();

方案2:基类内置实现(更符合全局调用需求)

直接在Page<T>基类中实现方法,无需额外引入扩展类:

public abstract class Page<T> where T : Page<T>
{
    // 基类原有逻辑省略
    
    public T Remember(Func<T, string> valueSelector, string dictKey)
    {
        var extractedValue = valueSelector((T)this);
        GlobalTestParameters.ParameterDict[dictKey] = extractedValue;
        return (T)this;
    }
}

调用逻辑和扩展方法完全一致,无需调整调用代码。

兼容性说明

两种实现均满足所有限制要求:

  • 不破坏链式调用结构,所有方法返回当前页面对象
  • 无需修改子类页面实现,全局仅需实现一次逻辑
  • 支持提取页面任意属性存入参数字典,无需单独编写对应存储方法
  • 不依赖静态类访问页面,完全兼容现有继承重载的页面结构

内容的提问来源于stack exchange,提问作者Ioana Nicu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 09:45:05