我正在尝试使用 selenium webdriver 库运行 2 个 chrome 浏览器实例。然而,即使这两个浏览器分别启动并处于不同的线程中,代码也只能控制和操作一个浏览器。
创建 chrome 浏览器并执行测试的代码
static void test(string url)
{
ChromeDriver driver = BrowserWorker.GetChromeBrowser(false);
driver.Navigate().GoToUrl(url);
}
“BrowserWorkser.GetChromeBrowser”函数是返回一个自定义的chrome浏览器实例:
public static ChromeDriver GetChromeBrowser()
{
var chromeoptions = new ChromeOptions();
chromeoptions.AddArguments("--disable-notifications");
chromeoptions.AddArguments("--no-sandbox");
chromeoptions.AddArguments("--disable-dev-shm-usage");
chromeoptions.UnhandledPromptBehavior = UnhandledPromptBehavior.Dismiss;
chromeoptions.AddArguments("--remote-debugging-port=9222");
var chromeDriverService = ChromeDriverService.CreateDefaultService(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
chromeDriverService.HideCommandPromptWindow = true;
ChromeDriver browser = null;
int nCount = 0;
while (browser == null && nCount < 3)
{
try
{
browser = new ChromeDriver(chromeDriverService, chromeoptions, TimeSpan.FromSeconds(180));
}
catch (Exception ex)
{
Console.WriteLine("Error initializing chrome browser: " + ex.Message);
}
nCount++;
}
return browser;
}
第一种方法:
var t1 = new Thread(() => test("https://www.google.com/"));
var t2 = new Thread(() => test("https://www.bing.com/"));
t1.Start();
t2.Start();
第二种方法,将“test(string url)”的签名更改为“async Task”并添加“await Task.Delay(1);”,因此编译器不会报错:
var list = new List<Task>();
list.Add(test("https://www.google.com/"));
list.Add(test("https://www.bing.com/"));
Task.WaitAll(list.ToArray());
然而,这两种方法都不起作用。两个独立的线程/任务控制同一个浏览器实例,它以随机顺序加载 google 和 bing。 如果您需要更多信息,请告诉我。谢谢。
最佳答案
如果您使用不同的参数启动 Chrome,它会启动一个新实例。因此,在这种情况下,使 --remote-debugging-port
位于不同的端口将使驱动程序启动一个新实例,而不是使用现有实例。
关于c# 并行运行 selenium 浏览器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70534429/