在Saucelabs中使用Selenium远程Firefox webdriver安装扩展程序

问题
尝试在Saucelabs上远程执行Selenium测试期间安装Firefox浏览器扩展。 在本地执行测试时,扩展程序在Firefox中安装并处于活动状态,但在Saucelabs上的远程执行中,扩展名不会出现在已安装的扩展名列表中。 按照此Saucelabs 支持文章中概述的步骤操作。

建立
Selenium.Support v2.48.2或v2.49.0
Selenium.WebDriver v2.48.2或v2.49.0
Windows 10或7
Firefox 43

C#测试设置

private static FirefoxProfile CreateFirefoxProfile() { FirefoxProfile profile = new FirefoxProfile(); profile.AddExtension("Tools/modify_headers-0.7.1.1-fx.xpi"); profile.SetPreference("general.useragent.override", "UA-STRING"); profile.SetPreference("extensions.modify_headers.currentVersion", "0.7.1.1-signed"); profile.SetPreference("modifyheaders.headers.count", 1); profile.SetPreference("modifyheaders.headers.action0", "Add"); profile.SetPreference("modifyheaders.headers.name0", "SampleHeader"); profile.SetPreference("modifyheaders.headers.value0", "test1234"); profile.SetPreference("modifyheaders.headers.enabled0", true); profile.SetPreference("modifyheaders.config.active", true); profile.SetPreference("modifyheaders.config.alwaysOn", true); profile.SetPreference("modifyheaders.config.start", true); return profile; } private static IWebDriver GetRemoteDriver() { var capabilities = new DesiredCapabilities(); var profile = CreateFirefoxProfile(); capabilities.SetCapability(FirefoxDriver.ProfileCapabilityName, profile); capabilities.SetCapability("name", buildContext); capabilities.SetCapability(CapabilityType.BrowserName,"firefox"); capabilities.SetCapability(CapabilityType.Version,""); capabilities.SetCapability(CapabilityType.Platform, "Windows 10"); capabilities.SetCapability("screen-resolution", "1280x1024"); capabilities.SetCapability("username", "SaucelabsUserName"); capabilities.SetCapability("accessKey", "SaucelabsAccessKey"); capabilities.SetCapability("build", "BuildNumber"); return new RemoteWebDriver(new Uri("http://ondemand.saucelabs.com/wd/hub"), capabilities); } 

Firefox设置
在本地执行期间查看:支持Firefox并打开user.js文件时,它包含以下与Web驱动程序配置匹配的扩展设置。 检查Saucelabs远程实例上的user.js不包含该内容。 这是远程user.js文件内容的粘贴框。

 user_pref("general.useragent.override", "UA-STRING"); user_pref("extensions.modify_headers.currentVersion", "0.7.1.1-signed"); user_pref("modifyheaders.headers.count", 1); user_pref("modifyheaders.headers.action0", "Add"); user_pref("modifyheaders.headers.name0", "SampleHeader"); user_pref("modifyheaders.headers.value0", "test1234"); user_pref("modifyheaders.headers.enabled0", true); user_pref("modifyheaders.config.active", true); user_pref("modifyheaders.config.alwaysOn", true); user_pref("modifyheaders.config.start", true); 

我也尝试过引用xpi的外部版本,结果相同。 https://addons.mozilla.org/firefox/downloads/latest/967/addon-967-latest.xpi

向SeleniumHQ发布了一个错误报告并收到了此响应,修复了上述代码。

在.NET的RemoteWebDriver情况下,您需要使用ToBase64String()方法。 这应该可以解决问题。 请注意,这是其他驱动程序具有类型安全选项类而不是传递原始function的原因之一。 .NET绑定的未来版本也应该将此模式扩展到Firefox,将来将其作为一个问题删除。

上面的GetRemoteDriver方法应该更新为此。

 private static IWebDriver GetRemoteDriver() { var capabilities = new DesiredCapabilities(); var profile = CreateFirefoxProfile(); // Note the change here, calling .ToBase64String() capabilities.SetCapability(FirefoxDriver.ProfileCapabilityName, profile.ToBase64String()); capabilities.SetCapability("name", buildContext); capabilities.SetCapability(CapabilityType.BrowserName,"firefox"); capabilities.SetCapability(CapabilityType.Version,""); capabilities.SetCapability(CapabilityType.Platform, "Windows 10"); capabilities.SetCapability("screen-resolution", "1280x1024"); capabilities.SetCapability("username", "SaucelabsUserName"); capabilities.SetCapability("accessKey", "SaucelabsAccessKey"); capabilities.SetCapability("build", "BuildNumber"); return new RemoteWebDriver(new Uri("http://ondemand.saucelabs.com/wd/hub"), capabilities); } 

在看到修复程序后,我能够找到提及此更改的其他资源。

https://stackoverflow.com/a/14285902/276681
https://code.google.com/p/selenium/issues/detail?id=2696#c4