C # Task Parallel ForEach управлять несколькими экземплярами класса - PullRequest
0 голосов
/ 07 мая 2019
class Program
{
    static void Main(string[] args)
    {
        ChromeDriver chromeDriver = null;
        Console.WriteLine("Hello World!");
        List<string> Urls = new List<string>() {
            "https://www.google.com",
            "https://www.facebook.com",
            "https://www.youtube.com",
            "https://www.gmail.com",
            "https://www.linkedin.com"
        };

        ChromeOptions chromeOptions = new ChromeOptions()
        {
            PageLoadStrategy = PageLoadStrategy.Normal
        };

        //options.AddArgument("headless");
        chromeOptions.AddArguments("disable-geolocation", "start-maximized", "disable-infobars");
        chromeOptions.AcceptInsecureCertificates = true;
        chromeOptions.LeaveBrowserRunning = true;


        Parallel.ForEach(Urls, url =>
        {
            chromeDriver = new ChromeDriver(AppDomain.CurrentDomain.BaseDirectory, chromeOptions, new TimeSpan(0, 0, 60));
            chromeDriver.Url = url;
            TestClass testClass = new TestClass(chromeDriver);
            testClass.test();

        });

        Console.ReadKey();
    }


}

public class TestClass
{
    IWebDriver driver;
    public TestClass(OpenQA.Selenium.Chrome.ChromeDriver driver)
    {
        this.driver = driver;
    }

    public void test()
    {
        Console.WriteLine(this.driver.Url);

    }
}

Что производит приведенный выше код:

enter image description here

Хотя я хотел, чтобы всеразные 5 URL там.но это показывает последний выполненный веб-сайт.Что мне здесь не хватает?

1 Ответ

4 голосов
/ 07 мая 2019

Объявление ChromeDriver chromeDriver = null; в строке 5 создает переменную single , ограниченную методом Main.

chromeDriver = new ChromeDriver(... вызов по линии 28 создает новый экземпляр, но назначает его переменной, ранее объявленной в , включающем область действия (т.е. в строке 5). Таким образом, каждое назначение в обратном вызове перезаписывает назначения всех других исполнений обратного вызова.

То, что вы хотите сделать, это

  • удалить ChromeDriver chromeDriver = null;
  • замените chromeDriver = new ChromeDriver на var chromeDriver = new ChromeDriver, создав, таким образом, экземпляр, ограниченный обратным вызовом, а не метод Main.
...