如何使用Selenium Webdriver .NET绑定设置Chrome首选项?

Yi *_*eng 17 c# selenium google-chrome webdriver selenium-webdriver

这是我正在使用的,用户代理可以成功设置,而下载首选项不能.

Windows 7,Chrome 26,Selenium-dotnet-2.31.2,chromedriver_win_26.0.1383.0

ChromeOptions chromeOptions = new ChromeOptions();
var prefs = new Dictionary<string, object> {
    { "download.default_directory", @"C:\code" },
    { "download.prompt_for_download", false }
};
chromeOptions.AddAdditionalCapability("chrome.prefs", prefs);
chromeOptions.AddArgument("--user-agent=" + "some safari agent");
var driver = new ChromeDriver(chromeOptions);
Run Code Online (Sandbox Code Playgroud)

取自chromedriver.log:

[1.201][FINE]:      Initializing session with capabilities {

   "browserName": "chrome",

   "chrome.prefs": {

      "download.default_directory": "C:\\code",

      "download.prompt_for_download": false

   },

   "chrome.switches": [ "--user-agent=Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version..." ],

   "chromeOptions": {

      "args": [ "--user-agent=Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version..." ],

      "binary": "",

      "extensions": [  ]

   },

   "javascriptEnabled": true,

   "platform": "WINDOWS",

   "version": ""

}
Run Code Online (Sandbox Code Playgroud)

检查临时首选项文件*temp\Google\Chrome\User Data\Default\Preferences,否"default_directory","prompt_for_download"并设置.

   "download": {
      "directory_upgrade": true
   },
Run Code Online (Sandbox Code Playgroud)

小智 28

如果您已更新到Chrome版本36.0.x和Selenium 2.42,则Martins解决方案不再有效.

它似乎已经更新.您现在可以使用以下代码

ChromeOptions options = new ChromeOptions();
options.AddUserProfilePreference(string preferenceName, object preferenceValue); 
Run Code Online (Sandbox Code Playgroud)

我目前使用它将我的打印机设置更改为"另存为PDF",而不是默认使用此代码作为示例

ChromeOptions options = new ChromeOptions();
options.AddUserProfilePreference("printing.print_preview_sticky_settings.appState", "{\"version\":2,\"isGcpPromoDismissed\":false,\"selectedDestinationId\":\"Save as PDF\");
Run Code Online (Sandbox Code Playgroud)

我认为马丁的解决方案是非常不错的,准确的,但它突然停止为我工作,所以我自然要看看如果我能找到一个解决方案.

  • 这对于最新的 chrome 来说就像一个魅力。你让我开心.. :) (2认同)

Mar*_*ers 20

Selenium dotNet驱动程序不支持设置chrome.prefs开箱即用.问题是chrome.prefs必须prefschromeOptions节点下定义.本ChromeOptions类不包含这个变量,所以您需要创建自己ChromeOptions的类:

public class ChromeOptionsWithPrefs: ChromeOptions
{
    public Dictionary<string,object> prefs { get; set; }
}

public static void Initialize()
{
    var options = new ChromeOptionsWithPrefs();
    options.prefs = new Dictionary<string, object>
    {
        { "intl.accept_languages", "nl" }
    };
    _driver = new ChromeDriver(@"C:\path\chromedriver", options);
}
Run Code Online (Sandbox Code Playgroud)

  • 我从https://code.google.com/p/chromedriver/wiki/CapabilitiesAndSwitches#List_of_recognized_capabilities了解到,prefs应该是chromeOptions的一部分.然后我用JetBrains dotPeek反向设计了Selenium .NET驱动程序,看看它如何将选项传递给chromedriver.exe.显然,ChromeOptions很可能是chromeOptions-object chromedriver所期望的包装器..NET库将ChromeOptions序列化为JSON并将其传递给chromedriver.通过继承ChromeOptions并添加您自己的属性,您可以添加更多选项:-) (7认同)
  • 对于那些无法使用它的人,请参阅下面的Ben的解决方案. (3认同)
  • 布拉沃,马丁!这非常有用!虽然.NET样式和一致性规则要求对属性进行大写,但是对于读者来说,一个小小的免责声明并没有将'prefs`属性大写.否则,Chrome驱动程序将无法正确解析它,并会在被调用时出错. (2认同)