C#流畅接口中条件方法链式调用的实现问题(Selenium场景)
问题分析与解决:.NET Core Selenium流畅接口中的条件调用错误
错误原因
IsDriverFound方法返回值不匹配:该方法当前返回HomePage类型,但If扩展方法的第一个参数需要布尔值(bool)作为判断条件,类型直接不兼容导致编译错误。- 实例方法调用方式错误:
IsDriverFound是HomePage的实例方法,在Build方法中直接调用IsDriverFound(company)未指定所属实例,编译器无法识别该方法。 - 流畅接口状态丢失:
FillPostingInformationForm和原IsDriverFound方法每次返回new HomePage(WebDriver),会创建新的页面实例,导致之前的操作状态无法保留,破坏链式调用逻辑。 - 潜在空引用风险:
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
相关产品推荐
相关产品推荐

