Доступ к WebDriver из асинхронного делегата препятствует будущему FindElements

Когда я призываю Action асинхронно и взаимодействовать с WebDriver я больше не могу использовать его для поиска элементов:

    public void AsyncWebDriver()
    {
        var homePage = new Uri("http://codeseven.github.io/toastr/demo.html");

        var driver = new InternetExplorerDriver(INTERNET_EXPLORER_OPTIONS);

        driver.Navigate().GoToUrl(homePage);


        Action bar = () => Console.WriteLine(driver.Url);

        bar.BeginInvoke(null, null);

        for (var i = 0; i < 5; i++)
        {
            var foo = driver.FindElement(By.Id("showtoast"));
            foo.Click();
        }
    }

Это терпит неудачу, но если мы либо закомментируем делегат, либо вызовем его синхронно (т.е. bar()) когда я могу нажать, как ожидалось.

Когда тест не пройден, я вижу, что возвращаемое значение FindElement странно

Когда тест проходит, tagname а также text свойства установлены как и ожидалось:

TagName = "button"
Text = "Show Toast"

Однако, когда это терпит неудачу, это будет попеременно возвращаться null и возвращая IWebElement с text а также tag свойства как таковые:

TagName = "System.Collections.Generic.Dictionary`2[System.String,System.Object]"
Text = "button"

1 ответ

WebDriver не является потокобезопасным. На самом деле, это не так поточно-ориентированно, что сходит с ума, если вы делаете что-то поточно.

Исправление к lock звонки как так:

[Test]
public void AsyncWebDriver()
{
    var o = new object();

    var homePage = new Uri("http://codeseven.github.io/toastr/demo.html");

    var driver = new InternetExplorerDriver(INTERNET_EXPLORER_OPTIONS);

    driver.Navigate().GoToUrl(homePage);

    Action bar = () =>
                    {
                        lock (o)
                        {
                            Console.WriteLine(driver.Url);
                        }
                    };

    bar.BeginInvoke(null, null);


    for (var i = 0; i < 5; i++)
    {
        lock (o)
        {
            var foo = driver.FindElement(By.Id("showtoast"));
            foo.Click();
        }
    }
}

Как только доступ к драйверу синхронизируется с lock Заявление все работает, мы ожидали.

Другие вопросы по тегам