Доступ к 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
Заявление все работает, мы ожидали.