我有一个通用方法,最终返回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做到这一点。
检查Chrome的无头模式:
var userAgent = driver.ExecuteScript("return window.navigator.userAgent");
在无头模式下运行时,使用
返回包含'headless'的字符串var windowChrome = driver.ExecuteScript("return window.chrome");
如果在无头模式下运行,则返回null;如果没有以无头模式运行,则返回对象。
但是这些方法不适用于Firefox,window.chrome显然不起作用,但是当比较非无头和无头的用户之间的Firefox时,它们是完全相同的:
非无头模式
Mozilla / 5.0(Windows NT 10.0; Win64; x64; rv:57.0)Gecko / 20100101 Firefox / 57.0
无头模式
Mozilla / 5.0(Windows NT 10.0; Win64; x64; rv:57.0)Gecko / 20100101 Firefox / 57.0
要检查Firefox的无头模式,我可以使用它,但它不适用于其他浏览器
var headless = ((FirefoxDriver)driver).Capabilities.GetCapability("moz:headless");
我想这表明我不能单靠功能。
上面的示例仅用于检查无头模式,但我想找到一种方法,在创建WebDriver实例后,以通用方式检查BrowserOptions
提供的不同参数。如果有一种使用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);