Selenium2 firefox: используйте профиль по умолчанию


Selenium2 по умолчанию запускает firefox со свежим профилем. Мне это нравится по умолчанию, но по некоторым веским причинам (доступ к моим закладкам, сохраненным паролям, использование моих дополнений и т.д.) Я хочу начать с моего профиля по умолчанию.

Предполагается, что должно быть свойство, управляющее этим, но я думаю, что документы не синхронизированы с источником, потому что, насколько я могу судить, webdriver.firefox.bin является единственным, который работает. Например, начиная selenium с:

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

Работает (т.е. это жалуется). Но это не имеет никакого эффекта:

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

("по умолчанию" - это имя в файле profiles.ini, но я также пробовал использовать "Profile0", который является названием раздела в файле profiles.ini).

Я использую phpwebdriver (который использует JsonWireProtocol) для доступа:

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

$webdriver->connect("firefox");

Я попытался сделать это со стороны PHP:

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

Или:

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

Без успеха (firefox запускается, но не использует мой профиль).

Я также попробовал хакерский подход к созданию пакетный файл:

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

А затем начинаем Селен с: java-банка selenium-server-standalone-2.5.0.jar -Dwebdriver.firefox.bin="/usr/локальный/src/селен/myfirefox"

Firefox запускается, но не использует профиль по умолчанию, и, что еще хуже, все зависает: selenium, похоже, не может взаимодействовать с firefox при запуске таким образом.

P.S. Я видел Selenium - Пользовательский профиль Firefox Я попробовал это:

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

И он отказывается работать! Взволнованный, думая, что я возможно, что-то есть, я попробовал:

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

Это ничего не дает. Т.е. все равно начинается с нового профиля:-(

Author: Community, 2011-09-07

6 answers

Саймон Стюарт ответил на это в списке рассылки для меня.

Резюмируя его ответ: вы берете свой профиль firefox, архивируете его (zip, а не tgz), кодируете его в формате base64, а затем отправляете все это в виде запроса /session json (поместите строку base64 в ключ firefox_profile объекта Возможностей).

Пример способа сделать это в Linux:

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

А затем, если вы используете PHPWebDriver при подключении, сделайте:

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

ПРИМЕЧАНИЕ: Это все равно не будет мой настоящий профиль, скорее его копия. Таким образом, закладки не будут запоминаться, кэш не будет заполнен и т.д.

 9
Author: Darren Cook, 2014-09-27 00:41:48

Вот эквивалент Java. Я уверен, что в php есть нечто подобное.

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

Если вы хотите добавить дополнительные расширения, вы также можете сделать что-то подобное.

ProfilesIni profile = new ProfilesIni();
FirefoxProfile ffprofile = profile.getProfile("default");
ffprofile.addExtension(new File("path/to/my/firebug.xpi"));
WebDriver driver = new FirefoxDriver(ffprofile);
 5
Author: nilesh, 2011-09-08 00:09:53
java -jar selenium-server-standalone-2.21.0.jar -Dwebdriver.firefox.profile=default

Должно сработать. ошибка исправлена .

Просто обновите свой selenium-сервер.

 5
Author: Muhammad Umer Farooq, 2012-06-05 07:57:14

Мне тоже было любопытно, и то, что я сделал, было очень просто. Я использую команду /Applications/Firefox.app/Contents/MacOS/firefox-bin -P для вызова менеджера профилей. После того, как я нашел, какой профиль мне нужно использовать, я использовал следующий код для активации профиля browser = Selenium::WebDriver.for :firefox, :profile => "batman".

Это привело к удалению всех моих закладок и подключаемых модулей, которые были связаны с этим профилем.

Надеюсь, это поможет.

 1
Author: Curtis Miller, 2011-09-08 22:12:51

Насколько я понимаю, невозможно использовать параметр командной строки -Dwebdriver.firefox.profile=<name>, поскольку он не будет учитываться в вашем случае использования из-за текущего дизайна кода. Поскольку я столкнулся с той же проблемой и не хотел загружать каталог профилей каждый раз при создании нового сеанса, я реализовал этот патч, который вводит новый параметр firefox_profile_name, который может использоваться в возможностях JSON для таргетинга на определенный профиль Firefox на удаленном сервере. Надеюсь, что это помогает.

 1
Author: Stéphane, 2011-10-01 15:45:18

Я сделал это в Zend вот так:

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

Идея заключается в том, что вы вводите параметры get/post/zend P с именем профиля, если не будет создан случайный файл, и он заархивирует все файлы, поместит его во временную папку и поместит в нее.

 1
Author: EaterOfCode, 2012-05-18 07:27:36