如果浏览器打开,请检查 Selenium
Check with Selenium if browser is open
我正在使用 C#/Selenium 3 和 Microsoft Chromium Edge Webdriver 抓取网页,然后将数据传送到另一个应用程序。我需要检查用户是否关闭了网络浏览器。有没有快速的方法来做到这一点?我想出了下面的代码,但问题是,如果网络浏览器关闭,那么 _webDriver.CurrentWindowHandle 需要 4 秒或更长时间才能引发异常。
public bool IsOpen
{
get
{
if (!this._isDisposed)
{
try
{
_ = this._webDriver.CurrentWindowHandle;
return true;
}
catch
{
// ignore.
}
}
return false;
}
}
抛出异常需要几秒钟,因为当浏览器关闭时,驱动程序仍会重试连接浏览器。它无法判断浏览器是手动关闭还是自动关闭。
I need to check if the user has closed the web browser
自动化浏览器测试不应被手动干预中断。这违背了所有最佳实践。 如果您手动关闭浏览器,WebDriver 将抛出 WebDriverException。因此,您还可以在 WebDriverException
上使用 try-catch
方法来检查浏览器是否可访问。但是也会秒抛异常,原因同上。
如果你想防止用户手动关闭浏览器,你可以像下面这样在headless模式下使用Edge:
edgeOptions.AddArguments("--headless");
最后我想到了以下解决方案:我使用扩展方法(如下所示)为 Web 浏览器获取 .Net Process 对象。要检查浏览器是否仍然打开,我只检查 属性 process.HasExited。如果为真,则用户已关闭浏览器。此方法不调用 Selenium,因此即使关闭浏览器,结果也接近即时。
/// <summary>
/// Get the Web Drivers Browser process.
/// </summary>
/// <param name="webDriver">Instance of <see cref="IWebDriver"/>.</param>
/// <returns>The <see cref="Process"/> object for the Web Browser.</returns>
public static Process GetWebBrowserProcess(this IWebDriver webDriver)
{
// store the old browser window title and give it a unique title.
string oldTitle = webDriver.Title;
string newTitle = $"{Guid.NewGuid():n}";
IJavaScriptExecutor js = (IJavaScriptExecutor)webDriver;
js.ExecuteScript($"document.title = '{newTitle}'");
// find the process that contains the unique title.
Process process = Process.GetProcesses().First(p => p.MainWindowTitle.Contains(newTitle));
// reset the browser window title.
js.ExecuteScript($"document.title = '{oldTitle}'");
return process;
}
我正在使用 C#/Selenium 3 和 Microsoft Chromium Edge Webdriver 抓取网页,然后将数据传送到另一个应用程序。我需要检查用户是否关闭了网络浏览器。有没有快速的方法来做到这一点?我想出了下面的代码,但问题是,如果网络浏览器关闭,那么 _webDriver.CurrentWindowHandle 需要 4 秒或更长时间才能引发异常。
public bool IsOpen
{
get
{
if (!this._isDisposed)
{
try
{
_ = this._webDriver.CurrentWindowHandle;
return true;
}
catch
{
// ignore.
}
}
return false;
}
}
抛出异常需要几秒钟,因为当浏览器关闭时,驱动程序仍会重试连接浏览器。它无法判断浏览器是手动关闭还是自动关闭。
I need to check if the user has closed the web browser
自动化浏览器测试不应被手动干预中断。这违背了所有最佳实践。 如果您手动关闭浏览器,WebDriver 将抛出 WebDriverException。因此,您还可以在 WebDriverException
上使用 try-catch
方法来检查浏览器是否可访问。但是也会秒抛异常,原因同上。
如果你想防止用户手动关闭浏览器,你可以像下面这样在headless模式下使用Edge:
edgeOptions.AddArguments("--headless");
最后我想到了以下解决方案:我使用扩展方法(如下所示)为 Web 浏览器获取 .Net Process 对象。要检查浏览器是否仍然打开,我只检查 属性 process.HasExited。如果为真,则用户已关闭浏览器。此方法不调用 Selenium,因此即使关闭浏览器,结果也接近即时。
/// <summary>
/// Get the Web Drivers Browser process.
/// </summary>
/// <param name="webDriver">Instance of <see cref="IWebDriver"/>.</param>
/// <returns>The <see cref="Process"/> object for the Web Browser.</returns>
public static Process GetWebBrowserProcess(this IWebDriver webDriver)
{
// store the old browser window title and give it a unique title.
string oldTitle = webDriver.Title;
string newTitle = $"{Guid.NewGuid():n}";
IJavaScriptExecutor js = (IJavaScriptExecutor)webDriver;
js.ExecuteScript($"document.title = '{newTitle}'");
// find the process that contains the unique title.
Process process = Process.GetProcesses().First(p => p.MainWindowTitle.Contains(newTitle));
// reset the browser window title.
js.ExecuteScript($"document.title = '{oldTitle}'");
return process;
}