在C#中使用Selenium添加自定义Capabilities的正确方法是什么?
解决方法
你遇到的问题是C#版本Selenium 4对自定义capability的内置校验逻辑导致的,不需要自行实现ICapabilities接口,用以下两种官方支持的方案即可实现需求:
方案1:使用三参数重载添加全局能力(兼容全版本Selenium 4)
AddAdditionalCapability的三参数重载支持跳过浏览器能力校验,第三个参数设为true时,自定义能力不会被判定为非法的浏览器配置:
var edgeOptions = new EdgeOptions(); // 正常配置Edge浏览器参数 edgeOptions.UseChromium = true; edgeOptions.AddArgument("start-maximized"); // 添加SauceLabs自定义capability,第三个参数true表示为全局非浏览器能力 edgeOptions.AddAdditionalCapability("sauce:name", "测试用例名称", true); edgeOptions.AddAdditionalCapability("sauce:build", "构建版本号", true); edgeOptions.AddAdditionalCapability("sauce:username", "SauceLabs用户名", true); edgeOptions.AddAdditionalCapability("sauce:accessKey", "SauceLabs密钥", true); // 生成capability传给远程驱动 var capabilities = edgeOptions.ToCapabilities(); var driver = new RemoteWebDriver(new Uri("https://ondemand.us-west-1.saucelabs.com/wd/hub"), capabilities);
即使该API标注为废弃,三参数重载在Selenium 4.x全版本都可正常运行。
方案2:使用Selenium 4推荐的非废弃API
如果不想使用标注废弃的方法,直接调用AddAdditionalOption即可,所有带云厂商前缀的自定义能力都会默认跳过浏览器校验:
var edgeOptions = new EdgeOptions(); edgeOptions.UseChromium = true; // 直接添加SauceLabs自定义配置 edgeOptions.AddAdditionalOption("sauce:name", "测试用例名称"); edgeOptions.AddAdditionalOption("sauce:build", "构建版本号"); // 直接将Options实例传入远程驱动构造函数即可,不需要显式转ICapabilities var driver = new RemoteWebDriver(new Uri("https://ondemand.us-west-1.saucelabs.com/wd/hub"), edgeOptions);
原理说明
你之前自定义ICapabilities触发空引用异常的原因确实是Selenium内部会将ICapabilities强转为内部接口IHasCapabilitiesDictionary读取存储字典,自定义实现没有内置该存储结构所以报错,不需要手动实现该接口,上述官方方法已经内置处理了能力存储逻辑。
内容的提问来源于stack exchange,提问作者Tollo
相关产品推荐
相关产品推荐

