Selenium2 Firefox: использовать профиль по умолчанию
Selenium2 по умолчанию запускает Firefox с новым профилем. Мне это нравится по умолчанию, но по ряду веских причин (доступ к моим закладкам, сохраненные пароли, использование моих дополнений и т. Д.) Я хочу начать с моего профиля по умолчанию.
Должно быть свойство, управляющее этим, но я думаю, что документы не синхронизированы с источником, потому что, насколько я могу судить, 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 запускается, но не использует профиль по умолчанию, и, что еще хуже, все зависает: селен, похоже, не способен связываться с firefox при запуске таким образом.
PS Я видел Selenium - Custom 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/
Это ничего не делает. Т.е. все еще начинается с нового профиля:-(
6 ответов
Саймон Стюарт ответил мне об этом в списке рассылки.
Подводя итог его ответа: вы берете свой профиль firefox, архивируете его (zip, а не tgz), кодируете base64, а затем отправляете все это в виде / сессионного запроса json (поместите строку base64 в ключ firefox_profile объекта Capabilities).
Пример способа сделать это в 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")))
ПРИМЕЧАНИЕ: это все еще не будет моим реальным профилем, а скорее его копией. Поэтому закладки не будут запомнены, кеш не будет заполнен и т. Д.
java -jar selenium-server-standalone-2.21.0.jar -Dwebdriver.firefox.profile=default
должно сработать. ошибка исправлена.
Просто обновите ваш selenium-сервер.
Вот эквивалент 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);
Мне тоже было любопытно, и то, что я получил, было очень простым. Я использую команду /Applications/Firefox.app/Contents/MacOS/firefox-bin -P
вызвать менеджер профилей. После того, как я нашел, какой профиль мне нужно было использовать, я использовал следующий код для активации профиля. browser = Selenium::WebDriver.for :firefox, :profile => "batman"
,
Это вытянуло все мои закладки и плагины, которые были связаны с этим профилем.
Надеюсь это поможет.
Я сделал это в 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 вы указываете имя профиля, если не будет случайного создания, и он архивирует все файлы, помещенные в временную папку, и помещает их в него.
Насколько я понимаю, невозможно использовать -Dwebdriver.firefox.profile=<name>
параметр командной строки, так как он не будет учитываться в вашем случае использования из-за текущей конструкции кода. Поскольку я столкнулся с той же проблемой и не хотел загружать каталог профиля каждый раз при создании нового сеанса, я реализовал этот патч, который представляет новый firefox_profile_name
параметр, который можно использовать в возможностях JSON для настройки определенного профиля Firefox на удаленном сервере. Надеюсь это поможет.