我正在尝试从Selenium 2升级到Selenium 3,但是旧的处理方式(既简单又快速)不再起作用了(而且似乎不存在该文档)
这是当前的程序,我要打开带有以下配置文件的Firefox驱动程序:SELENIUM
遗憾的是,它无法正常工作,并始终因错误而关闭:
WebDriver.dll中发生类型为’System.InvalidOperationException’>的未处理异常 附加信息:损坏的放气流
WebDriver.dll中发生类型为’System.InvalidOperationException’>的未处理异常
附加信息:损坏的放气流
这是我目前的程序:
public Program() { FirefoxOptions _options = new FirefoxOptions(); FirefoxProfileManager _profileIni = new FirefoxProfileManager(); FirefoxDriverService _service = FirefoxDriverService.CreateDefaultService(@"C:\Programme\IMaT\Output\Release\Bin"); _service.FirefoxBinaryPath = @"C:\Program Files (x86)\Mozilla Firefox\firefox.exe"; try { if ((_options.Profile = _profileIni.GetProfile("SELENIUM")) == null) { Console.WriteLine("SELENIUM PROFILE NOT FOUND"); _profile.SetPreference("network.proxy.type", 0); // disable proxy _profile = new FirefoxProfile(); } } catch { throw new Exception("Firefox needs a Profile with \"SELENIUM\""); } IWebDriver driver = new FirefoxDriver(_service,_options,new System.TimeSpan(0,0,30)); driver.Navigate().GoToUrl("ld-hybrid.fronius.com"); Console.Write("rtest"); } static void Main(string[] args) { new Program(); }
在不加载配置文件的情况下,它仅适用于新的FirefoxDriver(_service),但配置文件是必需的。
在Selenium 2中,我使用以下代码进行了处理:
FirefoxProfileManager _profileIni = new FirefoxProfileManager(); // use custom temporary profile try { if ((_profile = _profileIni.GetProfile("SELENIUM")) == null) { Console.WriteLine("SELENIUM PROFILE NOT FOUND"); _profile.SetPreference("network.proxy.type", 0); // disable proxy _profile = new FirefoxProfile(); } } catch { throw new Exception("Firefox needs a Profile with \"SELENIUM\""); } _profile.SetPreference("intl.accept_languages", _languageConfig); _driver = new FirefoxDriver(_profile);
快速简单,但是由于驱动程序不支持带有服务和配置文件的构造方法,我真的不知道如何使它正常工作,因此不胜感激
此异常是由于.Net库中的错误所致。生成配置文件的Zip的代码无法提供适当的Zip。
解决此问题的一种方法是重载FirefoxOptions并使用.Net框架(System.IO.Compression.ZipArchive)中的存档器,而不是出现故障ZipStorer:
FirefoxOptions
ZipStorer
var options = new FirefoxOptionsEx(); options.Profile = @"C:\Users\...\AppData\Roaming\Mozilla\Firefox\Profiles\ez3krw80.Selenium"; options.SetPreference("network.proxy.type", 0); var service = FirefoxDriverService.CreateDefaultService(@"C:\downloads", "geckodriver.exe"); var driver = new FirefoxDriver(service, options, TimeSpan.FromMinutes(1)); class FirefoxOptionsEx : FirefoxOptions { public new string Profile { get; set; } public override ICapabilities ToCapabilities() { var capabilities = (DesiredCapabilities)base.ToCapabilities(); var options = (IDictionary)capabilities.GetCapability("moz:firefoxOptions"); var mstream = new MemoryStream(); using (var archive = new ZipArchive(mstream, ZipArchiveMode.Create, true)) { foreach (string file in Directory.EnumerateFiles(Profile, "*", SearchOption.AllDirectories)) { string name = file.Substring(Profile.Length + 1).Replace('\\', '/'); if (name != "parent.lock") { using (Stream src = File.OpenRead(file), dest = archive.CreateEntry(name).Open()) src.CopyTo(dest); } } } options["profile"] = Convert.ToBase64String(mstream.GetBuffer(), 0, (int)mstream.Length); return capabilities; } }
并通过名称获取配置文件的目录:
var manager = new FirefoxProfileManager(); var profiles = (Dictionary<string, string>)manager.GetType() .GetField("profiles", BindingFlags.Instance | BindingFlags.NonPublic) .GetValue(manager); string directory; if (profiles.TryGetValue("Selenium", out directory)) options.Profile = directory;