2013-04-05 18 views
13

Ecco cosa sto utilizzando, l'agente utente può essere impostato correttamente, mentre le preferenze di download non possono.Come impostare le preferenze di Chrome usando il binding di Selenium Webdriver .NET?

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

Tratto da 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": "" 

} 

Controllare la temperatura file delle preferenze a *temp\Google\Chrome\User Data\Default\Preferences , n. "default_directory" e "prompt_for_download" sono impostati.

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

risposta

19

Il driver del dotNet Selenium non supporta l'impostazione di chrome.prefs fuori dalla scatola. Il problema è che chrome.prefs deve essere definito come prefs sotto il nodo chromeOptions. La classe ChromeOptions non contiene questa variabile, quindi avrai bisogno di creare il proprio ChromeOptions classe:

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

Funziona come un fascino. Grazie. Come lo sapevi? Eventuali riferimenti? –

+6

Ho appreso da https://code.google.com/p/chromedriver/wiki/CapabilitiesAndSwitches#List_of_recognized_capabilities che i prefs dovrebbero far parte di chromeOptions. Quindi ho decodificato il driver Selenium .NET con JetBrains dotPeek per vedere come ha passato le opzioni a chromedriver.exe. Apparentemente ChromeOptions è abbastanza litrenaly come un wrapper attorno all'oggetto chromeOptions che chromedriver si aspetta. La libreria .NET serializza ChromeOptions in JSON e passa a chromedriver. Attingendo da ChromeOptions e aggiungendo le tue proprietà puoi aggiungere ulteriori opzioni :-) –

+2

Bravo, Martin! Questo ha funzionato meravigliosamente! Un piccolo disclaimer per i lettori, sebbene le regole di stile e coerenza .NET richiedano che le proprietà siano in maiuscolo, non capitalizzare la proprietà 'prefs'. In caso contrario, il driver Chrome non sarà in grado di analizzarlo correttamente e tramite un errore dopo essere stato chiamato. –

23

Se si è aggiornato a Chrome versione 36.0.x e selenio 2.42, soluzione Martins non funziona più.

Sembra essere stato aggiornato. È ora possibile utilizzare il seguente codice

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

Io attualmente uso per modificare le impostazioni della stampante su "Salva come PDF" al posto di quello predefinito utilizzando questo codice come un esempio

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

ho pensato che la soluzione di Martin era molto buono e preciso, ma improvvisamente ha smesso di funzionare per me, quindi naturalmente ho dovuto vedere se potevo trovare una soluzione.

Problemi correlati