【问题标题】:c# run selenium browsers in parallelc# 并行运行 selenium 浏览器
【发布时间】: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


【解决方案1】:

如果您使用不同的参数启动 Chrome,它会启动一个新实例。因此,在这种情况下,将--remote-debugging-port 设置在不同的端口将使驱动程序启动一个新实例,而不是使用现有实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-27
    • 1970-01-01
    • 2023-01-07
    • 2012-04-30
    • 2022-01-10
    相关资源
    最近更新 更多