Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查运行WebDriver实例的浏览器选项的常规方法_C#_Google Chrome_Selenium_Firefox_Selenium Webdriver - Fatal编程技术网

C# 检查运行WebDriver实例的浏览器选项的常规方法

C# 检查运行WebDriver实例的浏览器选项的常规方法,c#,google-chrome,selenium,firefox,selenium-webdriver,C#,Google Chrome,Selenium,Firefox,Selenium Webdriver,我有一个通用方法,它最终返回ChromeDriver或FirefoxDriver实例,并将提供的参数作为选项,例如使用ChromeDriver: // Example using ChromeDriver, but also applies to FirefoxDriver var options = new ChromeOptions(); options.AddArguments("foo", "bar", "headless"); return new ChromeDriver(optio

我有一个通用方法,它最终返回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 

无头模式

我要检查的一个选项/参数正在headless模式下运行。对于Chrome和Firefox,我可以做得很好

要检查Chrome的无头模式:

var userAgent = driver.ExecuteScript("return window.navigator.userAgent");
在headless模式下运行时,通过使用返回包含“headless”的字符串

var windowChrome = driver.ExecuteScript("return window.chrome");
如果在headless模式下运行,则返回null;如果未在headless模式下运行,则返回对象

但是这些方法对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的headless模式,我可以使用它,但它不适用于其他浏览器

var headless = ((FirefoxDriver)driver).Capabilities.GetCapability("moz:headless");
我想这说明我不能单靠能力


上面的示例仅用于检查headless模式,但我想找到一种方法,在创建WebDriver实例后,以通用方式检查
BrowserOptions
提供的不同参数。如果有一种使用JavaScript的方法,那很好,但我更喜欢只使用SeleniumWebDriver

这是我当前检查无头模式的一个示例,我希望能够将其应用于其他
浏览选项
,但我必须首先找到它们:)

if(typeof(TWebDriver)=typeof(ChromeDriver))
runsHeadless=driver.ExecuteScript(“return window.navigator.userAgent”).ToLowerInvariant().Contains(“headless”);
else if(typeof(TWebDriver)=typeof(FirefoxDriver))
runsHeadless=Convert.tobolean((FirefoxDriver)driver.Capabilities.GetCapability(“moz:headless”);
其他的
抛出新的NotImplementedException($“类型为{typeof(TWebDriver)}的WebDriver尚不受支持。”);
断言(runsHeadless);

这很难看,但请尝试以下操作:Dictionary caps=(Dictionary)((RemoteWebDriver)browserProcess).Capabilities.GetCapability(“[Browser\u Name]”);然后简单地调用caps[“chromedriverVersion”]或任何你想要的东西-我不喜欢这样嵌套调用,但这样做是为了评论的目的谢谢你的建议,我可能可以把它放在一个很好的包装方法中,但它不是跨不同浏览器的通用选项。这很难看,但是试试这个:Dictionary caps=(Dictionary)((RemoteWebDriver)browserProcess).Capabilities.GetCapability(“[Browser\u Name]”);然后简单地调用caps[“chromedriverVersion”]或任何你想要的东西-我不喜欢这样嵌套调用,但这样做是为了注释的目的谢谢你的建议,我可能可以将它放在一个很好的包装方法中,但它不是跨不同浏览器的通用选项。
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);