检查运行WebDriver实例的浏览器选项的通用方法



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(实际和边缘模式)

最新更新