如何使用Selenium Webdriver .NET绑定设置Chrome偏好设置?

18

这是我正在使用的内容,用户代理可以成功设置,但下载偏好无法设置。

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);

从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": ""

}

请检查位于 *temp\Google\Chrome\User Data\Default\Preferences 的临时偏好设置文件,确保未设置 "default_directory""prompt_for_download"

   "download": {
      "directory_upgrade": true
   },
2个回答

33

如果您已更新到Chrome版本36.0.x和Selenium 2.42,则Martin的解决方案将不再起作用。

看起来已经进行了更新。现在您可以使用以下代码:

ChromeOptions options = new ChromeOptions();
options.AddUserProfilePreference(string preferenceName, object preferenceValue); 

我目前使用这段代码作为示例,用它来更改我的打印机设置,将其设置为“另存为PDF”,而不是默认设置。

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

我认为Martin的解决方案非常好和准确,但它突然间对我失效了,所以我自然而然地不得不寻找解决方案。


2
这在最新版本的Chrome上运行得很好。你让我今天过得很愉快.. :) - SarangK

23

Selenium dotNet驱动程序默认不支持设置chrome.prefs。问题在于chrome.prefs必须在chromeOptions节点下定义为prefsChromeOptions类不包含此变量,因此您需要创建自己的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);
}

非常好用,谢谢。你是怎么知道的?有参考资料吗? - Yi Zeng
10
我从https://code.google.com/p/chromedriver/wiki/CapabilitiesAndSwitches#List_of_recognized_capabilities了解到,prefs应该是chromeOptions的一部分。然后我使用JetBrains dotPeek反向工程了Selenium .NET驱动程序,以查看它如何将选项传递给chromedriver.exe。显然,ChromeOptions很直接地包装了chromedriver所需的chromeOptions对象。.NET库将ChromeOptions序列化为JSON并将其传递给chromedriver。通过从ChromeOptions继承并添加自己的属性,您可以添加更多选项 :-) - Martin Devillers
3
太棒了,马丁!这个方法非常成功!但是读者需要注意一个小免责声明,尽管.NET的样式和一致性规则要求属性首字母大写,但不要将“prefs”属性大写。否则,Chrome Driver将无法正确解析它,并在调用时抛出错误。 - Derek W
3
若无法使此方法生效,请参考下面Ben提供的解决方案。 - Ryan Lundy
如果这个答案已经失效了,它不应该被删除或标记吗? - SlightlyKosumi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接