Selenium2 firefox: use the default profile

前端 未结 6 1719
挽巷
挽巷 2020-12-05 12:16

Selenium2, by default, starts firefox with a fresh profile. I like that for a default, but for some good reasons (access to my bookmarks, saved passwords, use my add-ons, et

相关标签:
6条回答
  • 2020-12-05 12:38

    From my understanding, it is not possible to use the -Dwebdriver.firefox.profile=<name> command line parameter since it will not be taken into account in your use case because of the current code design. Since I faced the same issue and did not want to upload a profile directory every time a new session is created, I've implemented this patch that introduces a new firefox_profile_name parameter that can be used in the JSON capabilities to target a specific Firefox profile on the remote server. Hope this helps.

    0 讨论(0)
  • 2020-12-05 12:44

    I was curious about this as well and what I got to work was very simple. I use the command /Applications/Firefox.app/Contents/MacOS/firefox-bin -P to bring up Profile Manager. After I found which profile I needed to use I used the following code to activate the profile browser = Selenium::WebDriver.for :firefox, :profile => "batman".

    This pulled all of my bookmarks and plug-ins that were associated with that profile.

    Hope this helps.

    0 讨论(0)
  • 2020-12-05 12:48

    I did It in Zend like this:

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

    The Idea is that you give in the get/post/zend parameters P with the name of the profile if not a random wil be created, and he will zip all the files put it in the temp folder and put it in.

    0 讨论(0)
  • 2020-12-05 12:53

    Simon Stewart answered this on the mailing list for me.

    To summarize his reply: you take your firefox profile, zip it up (zip, not tgz), base64-encode it, then send the whole thing as a /session json request (put the base64 string in the firefox_profile key of the Capabilities object).

    An example way to do this on Linux:

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

    And then if you're using PHPWebDriver when connecting do:

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

    NOTE: It still won't be my real profile, rather a copy of it. So bookmarks won't be remembered, the cache won't be filled, etc.

    0 讨论(0)
  • 2020-12-05 12:54
    java -jar selenium-server-standalone-2.21.0.jar -Dwebdriver.firefox.profile=default
    

    should work. the bug is fixed.

    Just update your selenium-server.

    0 讨论(0)
  • 2020-12-05 12:58

    Here is the Java equivalent. I am sure there is something similar available in php.

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

    If you want to additonal extensions you can do something like this as well.

    ProfilesIni profile = new ProfilesIni();
    FirefoxProfile ffprofile = profile.getProfile("default");
    ffprofile.addExtension(new File("path/to/my/firebug.xpi"));
    WebDriver driver = new FirefoxDriver(ffprofile);
    
    0 讨论(0)
提交回复
热议问题