【发布时间】:2021-12-30 16:48:40
【问题描述】:
我正在尝试使用 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。 如果您需要更多信息,请告诉我。谢谢。
【问题讨论】:
-
什么是 BrowserWorker?我在文档中的任何地方都没有看到它。
-
@tia 抱歉,我在问题中添加了功能详细信息。
-
我从来没有用过这个,但我会尝试为每个实例更改远程调试端口。
-
@tia 谢谢!有用!如果您愿意回答,我很乐意将其标记为已接受。
标签: c# selenium selenium-webdriver