Selenium2 firefox:使用默认配置文件

时间:2011-09-07 03:14:25

标签: php firefox webdriver selenium-webdriver

默认情况下,Selenium2以新的配置文件启动firefox。我喜欢这个默认设置,但出于某些原因(访问我的书签,保存密码,使用我的附加组件等)我想从我的默认配置文件开始。

supposed to be有一个属性控制着这个,但我认为文档与源不同步,因为据我所知,webdriver.firefox.bin是唯一可行的。例如。开始使用硒:

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

(“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

然后启动Selenium:     java -jar selenium-server-standalone-2.5.0.jar -Dwebdriver.firefox.bin =“/ usr / local / src / selenium / myfirefox”

Firefox启动,但默认配置文件没有使用,更糟糕的是,所有内容都会挂起:selenium似乎无法以这种方式启动时与firefox通信。

P.S。我看到Selenium - Custom Firefox profile我试过了这个:

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/

这没有任何作用。即它仍然以新的个人资料开头: - (

6 个答案:

答案 0 :(得分:9)

Simon Stewart answered this on the mailing list对我来说。

总结一下他的回复:你把你的firefox配置文件,拉链(zip,而不是tgz),base64编码,然后将整个事件发送为/session json request(将base64字符串放在firefox_profile键中能力对象)。

在Linux上执行此操作的示例方法:

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

然后如果你在连接do时使用PHPWebDriver:

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

注意:它仍然不是我的真实个人资料,而是它的副本。因此书签将不会被记住,缓存也不会被填充等等。

答案 1 :(得分:5)

这是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);

答案 2 :(得分:5)

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

应该有效。错误是fixed

只需更新您的selenium-server。

答案 3 :(得分:1)

我对此也很好奇,而且我的工作非常简单。 我使用命令/Applications/Firefox.app/Contents/MacOS/firefox-bin -P来调出Profile Manager。在我找到需要使用的配置文件后,我使用以下代码激活配置文件browser = Selenium::WebDriver.for :firefox, :profile => "batman"

这会删除与该个人资料相关联的所有书签和插件。

希望这有帮助。

答案 4 :(得分:1)

根据我的理解,不可能使用-Dwebdriver.firefox.profile=<name>命令行参数,因为在您的用例中,由于当前的代码设计,它不会被考虑在内。由于我每次创建新会话时都面临同样的问题并且不想上传配置文件目录,因此我实现了this patch,它引入了一个可用于JSON功能的新firefox_profile_name参数定位远程服务器上的特定Firefox配置文件。希望这会有所帮助。

答案 5 :(得分:1)

我在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中给出了配置文件的名称,如果不是随机创建的话,他会将所有放在temp文件夹中的文件压缩并放入。