C# Selenium Chrome 从 WPF 运行异步而不阻塞主窗口

问题描述 投票:0回答:1

我正在尝试从 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
呢? 这里的最佳实践是什么?

c# wpf selenium-webdriver asynchronous async-await
1个回答
0
投票

如果 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) );
}
© www.soinside.com 2019 - 2024. All rights reserved.