2013-04-05 68 views
13

这是我正在使用的,用户代理可以成功设置,而下载首选项不能。如何使用Selenium Webdriver .NET绑定来设置Chrome首选项?

Windows 7中,26铬,硒 - 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 
    }, 

回答

19

Selenium dotNet驱动程序不支持设置chrome.prefs开箱即用。问题是必须在chromeOptions节点下定义为prefs。该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); 
} 
+0

工程就像一个魅力。谢谢。你怎么知道这件事的?任何参考? – 2013-08-12 21:05:14

+6

我从https://code.google.com/p/chromedriver/wiki/CapabilitiesAndSwitches#List_of_recognized_capabilities了解到,这些首选项应该是chromeOptions的一部分。然后我使用JetBrains dotPeek反向设计了Selenium .NET驱动程序,以查看它是如何将选项传递给chromedriver.exe的。显然,ChromeOptions是chromeOptions-object chromedriver期待的一款封装程序。 .NET库将ChromeOptions序列化为JSON并将其传递给chromedriver。通过继承ChromeOptions并添加您自己的属性,您可以添加更多选项:-) – 2013-08-13 06:17:36

+2

Bravo,Martin!这工作非常好!尽管.NET样式和一致性规则要求将大写属性设为大写,但读者的一小部分免责声明不会使'prefs'属性大写。否则,Chrome驱动程序将无法正确解析它,并会在被调用时发生错误。 – 2014-01-03 17:27:04

23

如果你已经更新到Chrome浏览器版本36.0.x和硒2.42,马丁斯解决方案不再有效。

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

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

我现在用它来改变我的打印机设置使用此代码为例

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

我认为马丁的解决方案,以“保存为PDF”,而不是默认的非常好,准确,但它突然停止对我的工作,所以自然我必须看看我能否找到解决方案。

相关问题