c# 并行运行 selenium 浏览器

标签 c# selenium selenium-webdriver

我正在尝试使用 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/

相关文章:

c# - 为什么return后代码还在运行

c# - System.Timers.Timer 不工作编辑 [在 asp.net web 表单中]

python - Selenium ,从数组中获取链接

java - cucumber 测试用例没有失败的插入步骤显示为通过

java - 如何在 Selenium Webdriver 的 xpath 中选择具有动态值的对象

Selenium:Webdriver:在 WebDriver 启动的浏览器 session 中是否有一个监听器来捕获用户操作?

c# - 初始化字符串的格式不符合从索引 0 开始的规范

c# - 未使用所有内存/限制时出现内存不足异常

javascript - 在运行测试时放宽 Chrome 的 CSP (webdriver) (Content-Security-policy)

java - Selenium - NoSuchElementException 错误检查