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

C#流畅接口中条件方法链式调用的实现问题(Selenium场景)

问题分析与解决:.NET Core Selenium流畅接口中的条件调用错误

错误原因

  1. IsDriverFound方法返回值不匹配:该方法当前返回HomePage类型,但If扩展方法的第一个参数需要布尔值(bool)作为判断条件,类型直接不兼容导致编译错误。
  2. 实例方法调用方式错误:IsDriverFound是HomePage的实例方法,在Build方法中直接调用IsDriverFound(company)未指定所属实例,编译器无法识别该方法。
  3. 流畅接口状态丢失:FillPostingInformationForm和原IsDriverFound方法每次返回new HomePage(WebDriver),会创建新的页面实例,导致之前的操作状态无法保留,破坏链式调用逻辑。
  4. 潜在空引用风险:Select2构造函数接收的IWebElement可能是FindElementIfExists返回的null,后续调用_element.Click()会触发空引用异常。

修复方案

1. 修正HomePage的方法设计

调整IsDriverFound为返回布尔值的判断方法,同时修复流畅接口方法的返回逻辑:

public class HomePage: BasePage
{
    private Select2 Driver => new Select2(WebDriver, WebDriver.FindElementIfExists(By.XPath("xpath")));
    private TextBox FirstName => new TextBox(WebDriver, WebDriver.FindElementIfExists(By.XPath("xpath")));
    private TextBox LastName => new TextBox(WebDriver, WebDriver.FindElementIfExists(By.XPath("xpath")));

    public HomePage(IWebDriver webDriver) : base(webDriver)
    {
    }
    
    // 修正流畅接口:返回当前实例保留状态
    public HomePage FillPostingInformationForm(Company company)
    {
        FirstName.SetText(company.ContactPerson.FirstName);
        LastName.SetText(company.ContactPerson.LastName);
        return this;
    }

    // 改为返回bool的判断方法,仅负责验证驱动是否存在
    public bool IsDriverFound(Company company)
    {
        if(Driver._element == null) return false;
        return Driver.IsItemSelected($"{company.Drivers.First().FirstName} {company.Drivers.First().LastName}");
    }

    // 修复GoToDriversPage的流畅返回逻辑
    public HomePage GoToDriversPage()
    {
        // 页面跳转逻辑实现
        return this;
    }
}

2. 给Select2添加空引用防护

在操作元素前先检查元素是否存在:

public class Select2 : BaseElement
{
    public IWebElement _element;

    public Select2(IWebDriver webDriver, IWebElement element) : base(webDriver)
    {
        _element = element;
    }
    public bool IsItemSelected(string keyWord)
    {
        if(_element == null)
        {
            Console.WriteLine("Select2元素未找到");
            return false;
        }
        try
        {
            _element.Click();
            _element.SendKeys(keyWord);
            var option = WebDriver.FindElement(By.XPath("//*[@role = 'option']"));
            option.Click();
            _element.BodyClick();
            return true;
        }
        catch (NoSuchElementException ex)
        {
            Console.WriteLine(ex.Message);
           return false;
        }
    }
}

3. 修正Build方法的调用逻辑

通过HomePage实例调用IsDriverFound,同时避免重复验证:

public void Build()
{
    var homePage = new HomePage(InitializeBrowser());
    bool isDriverFound = homePage.IsDriverFound(company);
       
    var x = homePage
        .If(isDriverFound, b => b.FillPostingInformationForm(company))
        .If(!isDriverFound, b => b.GoToDriversPage());
}

内容的提问来源于stack exchange,提问作者Karim Fahmy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 22:11:04