Browser.cs:
public static ChromeDriver GetChromeDriver(string machine)
{
String chromeLocalAppDataPath = GetChromeLocations(machine); //"d:ChromeTestGoogleChromeUser DataAuto";
var headless = true;
var options = new ChromeOptions();
options.AddArgument("--no-experiments");
options.AddArgument("disable-infobars");
options.AddArgument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36");
if (headless)
options.AddArgument("headless");
options.AddArgument("no-sandbox");
options.AddArguments("user-data-dir=" + chromeLocalAppDataPath);
options.BinaryLocation = @"C:Program Files (x86)GoogleChromeApplicationchrome.exe";
return new ChromeDriver(options);
}
跑:
var driver = Browser.GetChromeDriver("P1"); // user profile 1
driver.Navigate().GoToUrl("https://google.com/");
基本上,我构建这些小应用程序来调用多个Chrome实例,现在我想知道是否有办法从另一个应用程序中识别进程,因此,如果我想从Process.GetProcessesByName("chromedriver"(中删除配置文件1启动的指定chrome进程
如果您想识别由chromedriver启动的Chrome进程,那么以下是一个解决方案。 此示例在 C# 中。 其他语言(如Java(也会有相同的实现,但我只在C#工作。
Chrome 允许您提供自己的用户定义的命令行参数。 因此,您可以添加一个名为"scriptpid-"的参数,其中包含当前正在运行的程序的PID(Windows进程ID(。 ChromeDriver 会在命令行中将您的参数传递给 Chrome。 然后使用 Windows WMI 调用从正在运行的 Chrome 的命令行检索此 PID ...
public static IntPtr CurrentBrowserHwnd = IntPtr.Zero;
public static int CurrentBrowserPID = -1;
ChromeOptions options = new ChromeOptions();
options.AddArgument("scriptpid-" + System.Diagnostics.Process.GetCurrentProcess().Id);
IWebDriver driver = new ChromeDriver(options);
// Get the PID and HWND details for a chrome browser
System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcessesByName("chrome");
for (int p = 0; p < processes.Length; p++)
{
ManagementObjectSearcher commandLineSearcher = new ManagementObjectSearcher("SELECT CommandLine FROM Win32_Process WHERE ProcessId = " + processes[p].Id);
String commandLine = "";
foreach (ManagementObject commandLineObject in commandLineSearcher.Get())
{
commandLine += (String)commandLineObject["CommandLine"];
}
String script_pid_str = (new Regex("--scriptpid-(.+?) ")).Match(commandLine).Groups[1].Value;
if (!script_pid_str.Equals("") && Convert.ToInt32(script_pid_str).Equals(System.Diagnostics.Process.GetCurrentProcess().Id))
{
CurrentBrowserPID = processes[p].Id;
CurrentBrowserHwnd = processes[p].MainWindowHandle;
break;
}
}
CurrentBrowserHwnd应该包含 Chrome 窗口的 HWND。
CurrentBrowserPID应包含 Chrome 窗口的进程 ID。
您需要创建一些共享内存来标识进程 ID。内存映射文件可以是一个解决方案,数据库/WCF,命名管道IPC等。
这是因为您可以使用ChromeDriverService从Web驱动程序中获取进程ID
- 使用
ChromeDriver(ChromeDriverService, ChromeOptions)
创建 Web 驱动程序
var service = ChromeDriverService.CreateDefaultService();
var webDriver = new ChromeDriver(service, options);
- 从
- 服务中获取 processId,或保存服务,以便可以在应用程序中全局访问它们(通过某种单一实例存储或类似的东西(
- 通过存储在内存中的数据更新共享内存或通信应用程序
我认为没有直接的方法不需要付出很大的努力。