2013-04-05 8 views
13

Oto, czego używam, można ustawić klienta użytkownika, a preferencje pobierania nie.Jak ustawić preferencje przeglądarki Chrome za pomocą powiązania Selenium Webdriver .NET?

Windows 7, Chrome 26, selen 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); 

Zrobione z 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": "" 

} 

sprawdzenia temp pliku preferencji w *temp\Google\Chrome\User Data\Default\Preferences , no "default_directory" i są ustawione.

"download": { 
     "directory_upgrade": true 
    }, 

Odpowiedz

19

Sterownik dotNet Selenium nie obsługuje ustawienia chrome.prefs po wyjęciu z pudełka. Problem polega na tym, że chrome.prefs należy zdefiniować jako prefs pod węzłem chromeOptions. Klasa ChromeOptions nie zawiera tę zmienną, więc trzeba stworzyć własny ChromeOptions klasę:

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

Działa jak urok. Dziękuję Ci. Skąd to wiedziałeś? Wszelkie referencje? –

+6

Dowiedziałem się z https://code.google.com/p/chromedriver/wiki/CapabilitiesAndSwitches#List_of_recognized_capabilities, że prefs powinien być częścią chromeOptions. Następnie skonwertowałem sterownik Selenium .NET z JetBrains dotPeek, aby zobaczyć, w jaki sposób przekazywał on opcje do chromeedriver.exe. Wygląda na to, że ChromeOptions jest dosłownie opakowaniem wokół chromowanych kontrolek chromeOptions. Biblioteka .NET serializuje ChromeOptions do JSON i przekazuje je do chromedriver. Dziedzicząc z ChromeOptions i dodając własne właściwości, możesz dodać więcej opcji :-) –

+2

Bravo, Martin! To zadziałało cudownie! Małe zastrzeżenie dla czytelników, chociaż zasady stylizacji .NET i spójności wymagają, aby właściwości były pisane wielką literą, nie zamieniają na wielką wartość właściwości 'prefs'. W przeciwnym razie Sterownik Chrome nie będzie w stanie przeanalizować go poprawnie i wystąpi błąd podczas wywoływania. –

23

Jeśli zaktualizowana wersja 36.0.x Chrome i selen 2,42, rozwiązanie Martins już nie działa.

Wygląda na to, że został zaktualizowany. Teraz można użyć następującego kodu

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

Obecnie używać go zmienić moje ustawienia drukarki na „Zapisz jako PDF” zamiast domyślnego przy użyciu tego kodu jako przykład

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

Myślałem rozwiązanie Martina był bardzo dobry i dokładny, ale nagle przestał działać dla mnie, więc naturalnie musiałem sprawdzić, czy uda mi się znaleźć rozwiązanie.