Испытывая драйвер Selenium, я чувствую, что это слишком глючно и действительно трудно контролировать. Я не уверен, что это также относится и к версии Java, но здесь я говорю о версии .NET (устанавливается с помощью nuget: Selenium.WebDriver
).
Я имитирую случай, когда ExecuteAsyncScript
будет некоторое время блокироваться, прежде чем вернуть какой-либо результат из JavaScript. Однако его вызов помещается в другой поток , который освобождает текущий поток пользовательского интерфейса от блокировки, например:
//this helps mimic the blocking situation better
_driver.Manage().Timeouts().AsynchronousJavaScript = TimeSpan.FromDays(1);
Task.Run(() => {
_driver.ExecuteAsyncScript("");
});
После этого я не могу сделать много вещей (я не пробовал все, но выглядит как все) на экземпляре _driver
(из ChromeDriver
), на самом деле я хочу просто выключить / закрыть / утилизировать Водитель без его блокировки, как это:
_driver.Quit();
Однако это никогда не будет (и не может быть выполнено), вызов просто заблокирован навсегда. Если он находится в потоке пользовательского интерфейса, пользовательский интерфейс будет заблокирован, если он находится в выделенном потоке, ничего не происходит (но отладка показывает, что вызов всегда блокируется, и поток никогда не завершается). Поэтому я не могу уничтожить экземпляр _driver
в этом сценарии.
Это так нелепо и редко (если не сказать никогда ) встречаться в любой стандартной / изначально разработанной библиотеке .NET, которую я использовал. Я знаю, что .NET-версия Selenium просто портирована из Java-версии, так что, похоже, что-то вроде качества Java-кода? (У меня было такое же чувство при работе с NPOI
- другой портированной библиотекой Java-to- .NET, но она использовалась для работы с Excel, на самом деле она очень плохо спроектирована).