我正在尝试同时打开多个浏览器,但无法在多个窗口中浏览到该网站。
这是我的方法:
namespace XXX { public class CoreDriver { public IWebDriver driver; public int my_port { get; set; } public void Initialize() { string chromeee = ""; if (my_port == 50147) { chromeee = "C:/Users/AA/Downloads/chromedriver1/"; } else if (my_port == 50148) {chromeee = "C:/Users/AA/Downloads/chromedriver2/"; } else if (my_port == 50149) { chromeee = "C:/Users/AA/Downloads/chromedriver3/"; } else if (my_port == 50140) { chromeee = "C:/Users/AA/Downloads/chromedriver4/"; } ChromeOptions options = new ChromeOptions(); options.AddArgument("user-data-dir=C:\\Users\\AA\\AppData\\Local\\Google\\Chrome\\User Data"); var driverService = ChromeDriverService.CreateDefaultService(chromeee); driverService.HideCommandPromptWindow = true; driverService.Port = my_port; driver = new ChromeDriver(driverService, options); driver.Manage().Timeouts().ImplicitlyWait(new TimeSpan(0,0,12)); driver.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromSeconds(13)); //driver navigate } } }
这样称呼它:
CoreDriver A1 = new CoreDriver(); A1.my_port = 50147; A1.Initialize(); CoreDriver A2 = new CoreDriver(); A2.my_port = 50148; A2.Initialize(); // timeout error here // ...
不幸的是,在打开第二个窗口后-显示超时错误:
WebDriver.dll中发生类型’OpenQA.Selenium.WebDriverException’的第一次机会异常 附加信息:60秒后,对URL http:/ loca1host:50148 / session的远程WebDriver服务器的HTTP请求超时。
WebDriver.dll中发生类型’OpenQA.Selenium.WebDriverException’的第一次机会异常
附加信息:60秒后,对URL http:/ loca1host:50148 / session的远程WebDriver服务器的HTTP请求超时。
在这一行:
driver = new ChromeDriver(driverService,options);
使用不同的参数重新运行测试后,我发现由于指定的Chrome配置文件而显示了错误:
options.AddArgument("user-data-dir=C:\\Users\\AA\\AppData\\Local\\Google\\Chrome\\User Data");
如果我删除了这一行,那么我的所有cookie都不会在ChromeDriver实例中使用,那我就无法忍受了:)是否可以在多个chromedriver实例中使用相同的chrome配置文件?
好的,所以我正在使用如上所述的方法。
我的要求是:
简而言之,这就是逻辑。
这是代码。您可能想要调整一件事或另一件事。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; using OpenQA.Selenium.Firefox; using OpenQA.Selenium.Support.UI; using OpenQA.Selenium.Internal; using OpenQA.Selenium.Remote; using System.IO; using System.Drawing.Imaging; using System.Management; using System.Text.RegularExpressions; using System.Threading; using System.Diagnostics; using System.Reflection; using System.Threading.Tasks; using System.Collections.Concurrent; using System.Runtime.InteropServices; using System.Net; namespace NAMESPACE { public class CoreDriver { public IWebDriver driver; public string my_name { get; set; } public int my_port { get; set; } public string default_profile_dir = @"C:\Users\USERNAME\AppData\Local\Google\Chrome\"; public string chromedriver_path = @"C:\Users\USERNAME\Downloads\chromedriver_win32\"; public string site_profile_path; public string site_profile_path_s; public string default_path; public void Initialize() { ChromeOptions options = new ChromeOptions(); options.AddArgument("--log-level=3"); options.AddArgument("--test-type"); options.AddArgument("--silent"); options.AddArgument("user-data-dir=" + site_profile_path_s); options.AddArgument("--disable-plugins"); // disable flash var driverService = ChromeDriverService.CreateDefaultService(chromedriver_path); driverService.HideCommandPromptWindow = true; driverService.Port = my_port; driver = new ChromeDriver(driverService, options); driver.Manage().Timeouts().ImplicitlyWait(new TimeSpan(0, 0, 14)); driver.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromSeconds(15)); IJavaScriptExecutor jscript = driver as IJavaScriptExecutor; jscript.ExecuteScript("return window.stop"); } public void ConfigureProfile() { site_profile_path_s = default_profile_dir + "profile " + my_name; site_profile_path = site_profile_path_s + @"\Default"; default_path = default_profile_dir + @"User Data\Default"; if (!Directory.Exists(site_profile_path)) { CreateBlankProfile(); } else { // copy existing chrome profile. Keep cache, extensions, etc. CopyProfileFiles(); // but stay away from opened tabs RemoveOpenedTabsFiles(); } } public void CleanUpOldProfiles() { DirectoryInfo di = new DirectoryInfo(default_profile_dir); DirectoryInfo[] directories = di.GetDirectories("profile*", SearchOption.TopDirectoryOnly); if (directories.Count() > 0) { foreach (var folder in directories) { try { Directory.Delete(folder.FullName, true); } catch { } } } } public void CreateBlankProfile() { // new profile direftory CreateIfMissing(); // copy existing chrome profile. Keep cache, extensions, etc. // but stay away from opened tabs CopyProfileFiles(); CopyProfileFolders(); } public void CopyProfileFiles() { // default profile location DirectoryInfo di = new DirectoryInfo(default_path); // copy files List<string> file_lib = new List<string>() { "Cookies", "Login", "Preferences", "Secur" }; FileInfo[] files = di.GetFiles("*", SearchOption.TopDirectoryOnly); if (files.Count() > 0) { foreach (var file in files) { if (PassFileOrFolder(file.Name, file_lib)) { file.CopyTo(site_profile_path + @"\" + file.Name, true); } } } } public void RemoveOpenedTabsFiles() { // default profile location DirectoryInfo di = new DirectoryInfo(site_profile_path); // copy files List<string> file_lib = new List<string>() { "Current", "Last" }; FileInfo[] files = di.GetFiles("*", SearchOption.TopDirectoryOnly); if (files.Count() > 0) { foreach (var file in files) { if (PassFileOrFolder(file.Name, file_lib)) { File.Delete(file.FullName); } } } } public void CopyProfileFolders() { // default profile location DirectoryInfo di = new DirectoryInfo(default_path); // copy folders List<string> folder_lib = new List<string>() { "databases", "Extension", " Storage", "Web Applications", "File System", "IndexedDB" }; DirectoryInfo[] directories = di.GetDirectories("*", SearchOption.TopDirectoryOnly); if (directories.Count() > 0) { foreach (var folder in directories) { if (PassFileOrFolder(folder.Name, folder_lib)) { DirectoryCopy(folder.FullName, site_profile_path + @"\" + folder.Name, true); } } } } private void CreateIfMissing() { Directory.CreateDirectory(site_profile_path); } private static void DirectoryCopy(string sourceDirName, string destDirName, bool copySubDirs) { // Get the subdirectories for the specified directory. DirectoryInfo dir = new DirectoryInfo(sourceDirName); DirectoryInfo[] dirs = dir.GetDirectories(); if (!dir.Exists) { throw new DirectoryNotFoundException( "Source directory does not exist or could not be found: " + sourceDirName); } // If the destination directory doesn't exist, create it. if (!Directory.Exists(destDirName)) { Directory.CreateDirectory(destDirName); } // Get the files in the directory and copy them to the new location. FileInfo[] files = dir.GetFiles(); foreach (FileInfo file in files) { string temppath = Path.Combine(destDirName, file.Name); file.CopyTo(temppath, false); } // If copying subdirectories, copy them and their contents to new location. if (copySubDirs) { foreach (DirectoryInfo subdir in dirs) { string temppath = Path.Combine(destDirName, subdir.Name); DirectoryCopy(subdir.FullName, temppath, copySubDirs); } } } public bool PassFileOrFolder(string input, List<string> library) { foreach (string name in library) { if (input.Contains(name)) { return true; } } return false; } } }
请注意,我还实现了一种清理所有配置文件的方法 CleanUpOldProfiles
CleanUpOldProfiles
查看代码,更改目录等。完成后-进行以下调用:
CoreDriver something = new CoreDriver(); // creating an object // settings something.my_port = 50150; // multiple chrome instances - will be run on different ports // I am currently having 4 chrome profiles ;) something.my_name = "mynewprofile"; // full profile name will be: 'profile + my_name'. Check the code of the object. // void something.ConfigureProfile(); // creating new profile or updating existing one, if folder eists something.Initialize(); // starting the browser
很抱歉回答很长。希望它以某种方式对你们有帮助:)