我正在尝试从 WPF 运行
Selenium
asynchronously
来检索一些信息,稍后我将在 WPF 中使用这些信息。
Selenium 正在运行 headless
。
我正在尝试在 Window_Loaded
event
上运行它。
这是我的代码:
private async void Window_Loaded(object sender, RoutedEventArgs e)
{
Uri url = new Uri("https://server/");
UriBuilder ub = new UriBuilder(url);
ub.UserName = "user";
ub.Password = "pass";
ChromeOptions options = new ChromeOptions();
ChromeDriverService chromeService = ChromeDriverService.CreateDefaultService();
chromeService.HideCommandPromptWindow = true;
options.AddArgument("--headless");
options.AddArgument("log-level=3");
IWebDriver sDriver = new ChromeDriver(chromeService, options);
sDriver.Navigate().GoToUrl(ub.Uri);
}
如何异步运行它以避免 WPF 被阻止? 另外,既然我们处于
interact
状态,那么在得到结果后我如何才能 MainWindow
与 async
呢?
这里的最佳实践是什么?
如果 Selenium 提供任何异步方法,那么这些方法是更好的。但如果没有,核心选项是将代码卸载到同步方法并使用
Task.Run
调用它。
private void Foo(string uri)
{
ChromeOptions options = new ChromeOptions();
ChromeDriverService chromeService = ChromeDriverService.CreateDefaultService();
chromeService.HideCommandPromptWindow = true;
options.AddArgument("--headless");
options.AddArgument("log-level=3");
IWebDriver sDriver = new ChromeDriver(chromeService, options);
sDriver.Navigate().GoToUrl(uri);
}
private async void Window_Loaded(object sender, RoutedEventArgs e)
{
Uri url = new Uri("https://server/");
UriBuilder ub = new UriBuilder(url);
ub.UserName = "user";
ub.Password = "pass";
await Task.Run( () => Foo(ub.Uri) );
}