Я хочу запустить параллельное выполнение искателя с помощью Selenium ChromeDriver.
Если я использую тот же экземпляр ChromeDriver в цикле ForEach
, у меня возникают проблемы.
При попытке получить доступ к атрибутам документа HTML я получаю исключение:
OpenQA.Selenium.StaleElementReferenceException: stale element reference: element is not attached to the page document
возможно, потому что другой поток изменяет состояние экземпляра, прежде чем текущий поток сможет его прочитать.
Вот что у меня сейчас:
public class ChromeCrawler : IDisposable
{
private readonly ChromeDriver _driver;
public ChromeCrawler()
{
var chromeOptions = new ChromeOptions();
chromeOptions.AddArguments("headless");
_driver = new ChromeDriver(chromeOptions);
}
public string GetHTML(string url)
{
_driver.Navigate().GoToUrl(url);
var html = _driver.FindElementsByTagName("html");
var content = html.First().GetAttribute("innerHTML"); //<----- Here I get the exception
return content;
}
....
}
var crawler = new ChromeCrawler();
//Execution
Parallel.ForEach(pages_list, page_url =>
{
var html = crawler.GetHTML(page_url );
.....
});
Есть ли способ создать новый экземпляр ChromeCrawler
для каждого потока Parallel.ForEach
?