2011-09-07 14 views
9

Selenium2, per impostazione predefinita, avvia firefox con un nuovo profilo. Mi piace per impostazione predefinita, ma per alcune buone ragioni (accesso ai miei segnalibri, password salvate, utilizzo dei miei componenti aggiuntivi, ecc.) Voglio iniziare con il mio profilo predefinito.Selenium2 firefox: utilizzare il profilo predefinito

C'è supposed to be una proprietà che controlla questo, ma penso che i documenti non sono sincronizzati con la fonte, perché per quanto posso dire che webdriver.firefox.bin è l'unico che funziona. Per esempio. iniziare il selenio con:

java -jar selenium-server-standalone-2.5.0.jar -Dwebdriver.firefox.bin=not-there 

opere (vale a dire lamentarsi). Ma questo non ha alcun effetto:

java -jar selenium-server-standalone-2.5.0.jar -Dwebdriver.firefox.profile=default 

("default" è il nome in profiles.ini, ma ho provato anche con "Profile0" che è il nome della sezione in profiles.ini).

sto usando PHPWebdriver (che utilizza JsonWireProtocol) per accedere a:

$webdriver = new WebDriver("localhost", "4444"); 

$webdriver->connect("firefox"); 

Ho provato a fare dal lato PHP:

$webdriver->connect("firefox","",array('profile'=>'default')); 

o:

$webdriver->connect("firefox","",array('profile'=>'Profile0')); 

con nessun successo (inizia Firefox, ma non usa il mio profilo).

Ho anche provato l'approccio hacker di creare un file batch:

#!/bin/bash 
/usr/bin/firefox -P default 

E poi a partire Selenio con: java -jar selenio-server-standalone-2.5.0.jar -Dwebdriver.firefox.bin = "/ usr/local/src/selenium/myfirefox"

Firefox si avvia, ma non utilizza il profilo predefinito e, peggio, tutto si blocca: il selenio non sembra in grado di comunicare con firefox quando viene avviato in questo modo.

P.S. Ho visto Selenium - Custom Firefox profile ho provato questo:

java -jar selenium-server-standalone-2.5.0.jar -firefoxProfileTemplate "not-there" 

E si rifiuta di funzionare! Eccitato, pensando che potrei fare qualcosa, ho provato:

java -jar selenium-server-standalone-2.5.0.jar -firefoxProfileTemplate /path/to/0abczyxw.default/ 

Questo non fa nulla. Cioè inizia ancora con un nuovo profilo :-(

risposta

8

Simon Stewart answered this on the mailing list per me.

Per riassumere la sua risposta: si prende il proprio profilo firefox, lo si comprime (zip, non tgz), base64-lo codifica, quindi si invia l'intero oggetto come /session json request (inserire la stringa base64 nella chiave firefox_profile delle Funzionalità oggetto).

Un esempio modo per fare questo su Linux:

cd /your/profile 
zip -r profile * 
base64 profile.zip > profile.zip.b64 

E poi se si sta utilizzando PHPWebDriver quando si collega do:

$webdriver->connect("firefox", "", array("firefox_profile" => file_get_contents("/your/profile/profile.zip.b64"))) 

NOTA: ancora non lo farà sii il mio vero profilo, piuttosto una copia di esso. Quindi i segnalibri non verranno ricordati, la cache non verrà riempita, ecc.

+0

Grazie, è stato davvero utile. Sarebbe bello se il codice PHP per comprimere il profilo e quindi codificare in base64 fosse fornito in modo da poter fare tutto in PHP. – David

+0

Riconfermando ciò che è già stato detto ... Questa è la strada da percorrere. Ha funzionato perfettamente per noi quando volevamo convogliare tutte le richieste di selenio attraverso un proxy. –

5

Qui è l'equivalente Java. Sono sicuro che ci sia qualcosa di simile disponibile in php.

ProfilesIni profile = new ProfilesIni(); 
FirefoxProfile ffprofile = profile.getProfile("default"); 
WebDriver driver = new FirefoxDriver(ffprofile); 

Se si vuole estensioni additonal si può fare qualcosa di simile pure.

ProfilesIni profile = new ProfilesIni(); 
FirefoxProfile ffprofile = profile.getProfile("default"); 
ffprofile.addExtension(new File("path/to/my/firebug.xpi")); 
WebDriver driver = new FirefoxDriver(ffprofile); 
+0

Grazie @nilesh. Ho ragione nel ritenere che questo stia usando direttamente WebDriver; non stai iniziando "selenium-server-standalone.jar" e quindi non utilizzi JsonWireProtocol? –

+0

Questo sta utilizzando direttamente il webdriver. Non sono sicuro di cosa intendi iniziando con il vaso stand alone. WebDriver stesso utilizza JsonWireProtocol per comunicare http://code.google.com/p/selenium/wiki/JsonWireProtocol – nilesh

+0

Ah, interessante. Quindi il tuo frammento java sopra in qualche modo viene trasformato in JSON e chiamate al servizio web? Se potessi semplicemente rintracciare quelle chiamate, potrei implementarle nella libreria PHP. Ma qualunque cosa stia facendo non è documentata nell'URL che hai dato, e non ho visto nessun altro documento per JsonWireProtocol. Penso che contatterò gli sviluppatori del Selenium. –

1

ero curioso su questo così e quello che ho avuto modo di lavorare era molto semplice. uso il comando /Applications/Firefox.app/Contents/MacOS/firefox-bin -P per aprire Profile manager. Dopo ho scoperto che il profilo avevo bisogno di usare ho usato il seguente codice t o attivare il profilo browser = Selenium::WebDriver.for :firefox, :profile => "batman".

Questo ha richiamato tutti i miei segnalibri e plug-in associati a quel profilo.

Spero che questo aiuti.

+0

Grazie a @Curtis. Per quale lingua/libreria è questo comando? –

+0

@Darren: la lingua è nel rubino. Ma sono sicuro che esiste un equivalente per PHP. –

1

A mio parere, non è possibile utilizzare il parametro della riga di comando -Dwebdriver.firefox.profile=<name> poiché non verrà preso in considerazione nel proprio caso d'uso perché dell'attuale progettazione del codice. Poiché ho affrontato lo stesso problema e non volevo caricare una directory di profilo ogni volta che viene creata una nuova sessione, ho implementato this patch che introduce un nuovo parametro firefox_profile_name che può essere utilizzato nelle funzionalità JSON per indirizzare un profilo Firefox specifico sul Server remoto. Spero che questo ti aiuti.

+0

Great @ Stéphane - se ho capito la tua patch, è esattamente quello che cercavo.Non l'ho ancora provato, ma è sicuro? (nel suo ordinamento, il selenio consente di eliminare la directory del profilo temporaneo creata, non è necessario un codice esplicito per impedire che ciò accada?) –

+0

Sì, è sicuro. Il selenio realizzerà infatti una copia temporanea di questo profilo e lo userà (come un modello). –

1

ho fatto in Zend come questo:

public function indexAction(){ 
    $appdata = 'C:\Users\randomname\AppData\Roaming\Mozilla\Firefox' . "\\"; 
    $temp = 'C:\Temp\\'; 
    $hash = md5(rand(0, 999999999999999999)); 
    if(!isset($this->params['p'])){ 
     shell_exec("\"C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe\" -CreateProfile " . $hash); 
    }else{ 
     $hash = $this->params['p']; 
    } 
    $ini = new Zend_Config_Ini('C:\Users\randomname\AppData\Roaming\Mozilla\Firefox\profiles.ini'); 
    $path = false; 
    foreach ($ini as $key => $value){ 
     if(isset($value->Name) && $value->Name == $hash){ 
      $path = $value->Path; 
      break; 
     } 
    } 
    if($path === false){ 
     die('<pre>No profile found with name: ' . $hash); 
    } 
    echo "<pre>Profile : $hash \nProfile Path : " . $appdata . "$path \n"; 
    echo "Files: \n"; 
    $filesAndDirs = $this->getAllFiles($appdata . $path); 
    $files = $filesAndDirs[0]; 
    foreach ($files as $file){ 
     echo " $file\n"; 
    } 
    echo "Dirs : \n"; 
    $dirs = array_reverse($filesAndDirs[1]); 
    foreach ($dirs as $dir){ 
     echo " $dir\n"; 
    } 
    echo 'Zipping : '; 
    $zip = new ZipArchive(); 
    $zipPath = md5($path) . ".temp.zip"; 
    $zipRet = $zip->open($temp .$zipPath, ZipArchive::CREATE); 
    echo ($zipRet === true)?"Succes\n":"Error $zipRet\n"; 
    echo "Zip name : $zipPath\n"; 
    foreach ($dirs as $dir){ 
     $zipRet = $zip->addEmptyDir($dir); 
     if(!($zipRet === true)){ 
      echo "Error creating folder: $dir\n"; 
     } 
    } 
    foreach ($files as $file){ 
     $zipRet = $zip->addFile($appdata . $path ."\\". $file,$file); 
     if(!($zipRet === true && file_exists($appdata . $path . "\\". $file) && is_readable($appdata . $path . "\\". $file))){ 
      echo "Error zipping file: $appdata$path/$file\n"; 
     } 
    } 
    $zipRet = $zip->addFile($appdata . $path ."\\prefs.js",'user.js'); 
    if(!($zipRet === true && file_exists($appdata . $path . "\\". $file) && is_readable($appdata . $path . "\\". $file))){ 
     echo "Error zipping file: $appdata$path/$file\n"; 
    } 
    $zipRet = $zip->close(); 
    echo "Closing zip : " . (($zipRet === true)?("Succes\n"):("Error:\n")); 
    if($zipRet !== true){ 
     var_dump($zipRet); 
    } 
    echo "Reading zip in string\n"; 
    $zipString = file_get_contents($temp .$zipPath); 
    echo "Encoding zip\n"; 
    $zipString = base64_encode($zipString); 
    echo $zipString . "\n"; 
    require 'webdriver.php'; 
    echo "Connecting Selenium\n"; 
    $webDriver = new WebDriver("localhost",'4444'); 
    if(!$webDriver->connect("firefox","",array('firefox_profile'=>$zipString)) 
{ 
     die('Selenium is not running'); 
    } 
} 
    private function getAllFiles($path,$WithPath = false){ 
    $return = array(); 
    $dirs = array(); 
    if (is_dir($path)) { 
     if ($dh = opendir($path)) { 
      while (($file = readdir($dh)) !== false) { 
       if(!in_array($file, array('.','..'))){ 
        if(is_dir($path . "\\" . $file)){ 
         $returned = $this->getAllFiles($path . "\\" . $file,(($WithPath==false)?'':$WithPath) . $file . "\\"); 
         $return = array_merge($return,$returned[0]); 
         $dirs = array_merge($dirs,$returned[1]); 
         $dirs[] = (($WithPath==false)?'':$WithPath) . $file; 
        }else{ 
         $return[] = (($WithPath==false)?'':$WithPath) . $file; 
        } 
       } 
      } 
      closedir($dh); 
     } 
    } 
    return array($return,$dirs); 
} 

l'idea è che si dà nella get/post/Zend parametri P con il nome del profilo, se essere creato non un wil a caso, e lui zip tutti i file metterlo nella cartella temp e metterlo in.

5
java -jar selenium-server-standalone-2.21.0.jar -Dwebdriver.firefox.profile=default 

dovrebbe funzionare. il bug è fixed.

Basta aggiornare il server di selenio.

+0

Grande, grazie Muhammad. Ho appena confermato che ora funziona. (A proposito, è ancora un _copy_ del profilo, cioè cache/cronologia non sono compilati.) –

+1

oh, io uso solo per salvare i certificati ssl e alcune proprietà come dom.max_script_run_time. –

Problemi correlati