C# Selenium如何将FindElement的int超时参数替换为TimeSpan结构
TimeSpan超时参数改造方案
核心方法改造
直接将原方法的int timeoutInSeconds参数替换为TimeSpan timeout类型,移除内部的TimeSpan.FromSeconds转换逻辑,直接传入WebDriverWait构造函数,同时将超时判断逻辑从比较数值0改为比较TimeSpan.Zero,改造后的代码如下:
public static IWebElement FindElement(this IWebDriver driver, By by, TimeSpan timeout) { if (timeout > TimeSpan.Zero) { var wait = new WebDriverWait(driver, timeout); return wait.Until(drv => drv.FindElement(by)); } return driver.FindElement(by); }
可选兼容过渡方案
如果项目中现有调用点较多,不想一次性修改所有代码,可以保留原int参数的方法作为兼容重载,内部转发调用新的TimeSpan版本方法,还可以加过时特性提醒开发者后续迁移,不影响现有代码运行:
[Obsolete("推荐使用TimeSpan类型参数的重载,该int秒数参数版本将在后续版本移除")] public static IWebElement FindElement(this IWebDriver driver, By by, int timeoutInSeconds) { return FindElement(driver, by, TimeSpan.FromSeconds(timeoutInSeconds)); }
如果项目调用点很少,不需要过渡,直接删除原int参数方法即可,所有调用方同步修改传参。
新方法调用示例
改造后传参不需要依赖参数名识别时间单位,可以灵活指定任意时间粒度,常见调用写法如下:
- 原15秒超时的等价写法:
var element = webDriver.FindElement( By.XPath(@"//h1[@class='m-t30'][contains(.,'My Profile')]"), TimeSpan.FromSeconds(15) );
- 毫秒级超时传参:
TimeSpan.FromMilliseconds(300) - 分钟级超时传参:
TimeSpan.FromMinutes(2) - 也可以用TimeSpan构造函数直接传时、分、秒:
new TimeSpan(0, 0, 15)等价于15秒
改造后彻底消除了超时参数的单位歧义,调用时显式指定时间跨度,不会出现误将毫秒当秒传入、或者错把参数当成分钟的低级错误。
内容的提问来源于stack exchange,提问作者Kali
相关产品推荐
相关产品推荐

