i有一个通用方法,该方法最终以所提供的参数为选项返回Chromedriver或Firefoxdriver实例,例如使用Chromedriver:
// Example using ChromeDriver, but also applies to FirefoxDriver
var options = new ChromeOptions();
options.AddArguments("foo", "bar", "headless");
return new ChromeDriver(options);
现在,我想测试Webdriver的实例是否实际上具有提供的参数,但是我还没有找到一种以通用方式执行此操作的方法。
我尝试了以下代码来检查提供的参数是否存储在浏览器功能中,但是我无法使用Chromedriver找到它们。
// Using cast because of generic method
var capabilities = ((ChromeDriver)driver).Capabilities
无头模式
我要检查的选项/参数之一是在无头模式下运行。对于Chrome和Firefox,我可以做到这一点。
检查铬的无头模式:
var userAgent = driver.ExecuteScript("return window.navigator.userAgent");
在以无头模式运行时返回包含"无头"的字符串,并使用
var windowChrome = driver.ExecuteScript("return window.chrome");
如果以无头模式运行,则返回null,或者如果不在无头部运行的对象。
但是,这些方法对Firefox,Windows.Chrome显然不起作用,但是在比较无头和无头的用户时,它们完全相同:
非头部模式
Mozilla/5.0(Windows NT 10.0; Win64; X64; X64; RV:57.0)壁虎/20100101 Firefox/57.0
无头模式
Mozilla/5.0(Windows NT 10.0; Win64; X64; X64; RV:57.0)壁虎/20100101 Firefox/57.0
要检查Firefox的无头模式,我可以使用此功能,但是其他浏览器不可用
var headless = ((FirefoxDriver)driver).Capabilities.GetCapability("moz:headless");
我想这表明我是如何仅依靠功能的。
上面的示例仅用于检查无头模式,但是我想找到一种方法,以通用方式检查BrowserOptions
提供的不同参数,此前我创建了WebDriver的实例。如果有一种使用JavaScript的方法,但是我更喜欢仅使用Selenium WebDriver。
这是我当前检查无头模式的一个示例,我也希望能够将其应用于其他BrowserOptions
,但是我必须首先找到它们:)。
if (typeof(TWebDriver) == typeof(ChromeDriver))
runsHeadless = driver.ExecuteScript<string>("return window.navigator.userAgent").ToLowerInvariant().Contains("headless");
else if (typeof(TWebDriver) == typeof(FirefoxDriver))
runsHeadless = Convert.ToBoolean(((FirefoxDriver)driver).Capabilities.GetCapability("moz:headless"));
else
throw new NotImplementedException($"WebDriver of type {typeof(TWebDriver)} is not yet supported.");
Assert.That(runsHeadless);
我知道这很旧,但是当我自己研究这个问题时,我最终到了这里:
使用Selenium 4,以下扩展方法适用于我知道截至2022年2月的所有桌面浏览器:
/// <summary>
/// WebDriver Extensions
/// </summary>
public static class WebDriverExtensions
{
/// <summary>
/// <para> Is this WebDriver instance running Headless </para>
/// <para> Caution this relies upon implementation details and is liable to breaking. </para>
/// <para> See <cref>https://stackoverflow.com/questions/47559054/generic-way-to-check-browser-options-of-running-webdriver-instance</cref></para>
/// </summary>
/// <param name="driver"></param>
/// <returns></returns>
public static bool IsRunningHeadless(this IWebDriver driver)
{
// Check for Firefox headless flag
var webDriver = driver as WebDriver;
object firefoxHeadlessCapability = webDriver.Capabilities.GetCapability("moz:headless");
if (firefoxHeadlessCapability != null &&
firefoxHeadlessCapability.ToString()!.ToLower().Equals("true"))
{
return true;
}
// all other instances
var jse = driver as IJavaScriptExecutor;
var agent = jse.ExecuteScript("return window.navigator.userAgent").ToString();
return agent.ToLower().Contains("headless");
}
}
目前只能要求firefox和基于铬的浏览器无头 - 如果两种方法都返回true,我们可以确信浏览器在屏幕上。
验证:Firefox,Chrome,MS Edge,Safari,Internet Explorer(实际和边缘模式)