2011-09-07 18 views
9

Selenium2, का उपयोग करें, एक ताजा प्रोफाइल के साथ फ़ायरफ़ॉक्स शुरू होता है। मैं एक डिफ़ॉल्ट के लिए चाहते हैं, लेकिन कुछ अच्छे कारणों के लिए (अपने बुकमार्क करने के लिए उपयोग, सहेजे गए पासवर्ड, मेरे ऐड-ऑन का उपयोग, आदि) मैं अपने डिफ़ॉल्ट प्रोफ़ाइल के साथ शुरू करना चाहते हैं।Selenium2 फ़ायरफ़ॉक्स: डिफ़ॉल्ट रूप से डिफ़ॉल्ट प्रोफ़ाइल

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 

("डिफ़ॉल्ट" 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')); 

साथ कोई सफलता (फ़ायरफ़ॉक्स शुरू होता है, लेकिन अपने प्रोफ़ाइल का उपयोग)। साथ

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

और फिर शुरू करने सेलेनियम:

मैं भी एक बैच फ़ाइल बनाने के हैकर का दृष्टिकोण की कोशिश की जावा जार सेलेनियम-server-स्टैंडअलोन-2.5.0.jar -Dwebdriver.firefox.bin = "/ usr/local/src/सेलेनियम/myfirefox"

फ़ायरफ़ॉक्स प्रारंभ होता है, लेकिन डिफ़ॉल्ट प्रोफ़ाइल द्वारा उपयोग नहीं करता है, और बदतर, सब कुछ लटकता है: इस तरह से शुरू होने पर सेलेनियम फ़ायरफ़ॉक्स के साथ संवाद करने में सक्षम नहीं लगता है।

पीएस मैंने देखा 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/ 

यह कुछ भी नहीं करता है। अर्थात। यह अभी भी :-(

उत्तर

8
मेरे लिए साइमन स्टीवर्ट answered this on the mailing list

अपने उत्तर को सारांशित करने के लिए: आप अपनी फ़ायरफ़ॉक्स प्रोफ़ाइल लेते हैं, इसे ज़िप (ज़िप, टीजीजे नहीं), बेस 64-एन्कोड करें, फिर पूरी चीज़ को /session json request के रूप में भेजें (क्षमताओं की firefox_profile कुंजी में बेस 64 स्ट्रिंग डालें वस्तु)।

एक उदाहरण रास्ता लिनक्स पर यह करने के लिए:

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"))) 

नोट: यह अभी भी नहीं होगा मेरी असली प्रोफ़ाइल, बल्कि इसकी एक प्रति बनें। तो बुकमार्क्स याद नहीं किए जाएंगे, कैश भरा नहीं जाएगा, आदि

+0

धन्यवाद, यह वास्तव में सहायक था। अच्छा होगा अगर PHP कोड प्रोफ़ाइल को ज़िप करने के लिए और फिर बेस 64 पर एन्कोड प्रदान किया गया था ताकि कोई भी PHP में सबकुछ कर सके। – David

+0

जो पहले से ही कहा गया है उसे दोबारा पुष्टि करना ... यह रास्ता तय करना है। जब हम प्रॉक्सी के माध्यम से सभी सेलेनियम अनुरोधों को पाइप करना चाहते थे तो हमारे लिए निर्दोष काम किया। –

5

यहाँ एक नया प्रोफाइल के साथ शुरू होता है जावा बराबर। मुझे यकीन है कि वहाँ इसी तरह उपलब्ध कुछ 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); 
+0

धन्यवाद @nilesh। क्या मैं सोच रहा हूं कि यह वेबड्राइवर का उपयोग कर रहा है; आप 'सेलेनियम-सर्वर-स्टैंडअलोन.जर' शुरू नहीं कर रहे हैं और इसलिए जेसनवायरप्रोटोकॉल का उपयोग नहीं कर रहे हैं? –

+0

यह वेबड्राइवर का उपयोग सीधे कर रहा है। मुझे यकीन नहीं है कि स्टैंड अकेले जार से शुरू करके आपका क्या मतलब है। खुद WebDriver http://code.google.com/p/selenium/wiki/JsonWireProtocol – nilesh

+0

संवाद करने के लिए आह, दिलचस्प JsonWireProtocol उपयोग करता है। तो आपका उपरोक्त जावा स्निपेट किसी भी तरह जेएसओएन और वेब सेवा कॉल में बदल जाता है? अगर मैं सिर्फ उन कॉल को ट्रैक कर सकता हूं तो मैं इसे PHP लाइब्रेरी में कार्यान्वित कर सकता हूं। लेकिन जो भी हो रहा है वह आपके द्वारा दिए गए यूआरएल पर दस्तावेज नहीं है, और मुझे जेसनवायरप्रोटोकॉल के लिए कोई अन्य दस्तावेज़ नहीं दिख रहा है। मुझे लगता है कि मैं सेलेनियम डेवलपर्स से संपर्क करूंगा। –

1

मैं भी इस बारे में उत्सुक था और मैं क्या मिल गया काम बहुत आसान था करने के लिए। मैं आदेश /Applications/Firefox.app/Contents/MacOS/firefox-bin -P का उपयोग करें। प्रोफ़ाइल प्रबंधक को लाने के लिए करने के बाद मैंने पाया जो प्रोफ़ाइल मैं मैं का इस्तेमाल किया उपयोग करने की आवश्यकता निम्नलिखित कोड टी ओ प्रोफ़ाइल browser = Selenium::WebDriver.for :firefox, :profile => "batman" को सक्रिय करें।

यह मेरा बुकमार्क और प्लग इन है कि उस प्रोफ़ाइल से संबद्ध थे के सभी खींच लिया।

उम्मीद है कि इससे मदद मिलती है।

+0

धन्यवाद @ कर्टिस। उस भाषा/पुस्तकालय के लिए क्या आदेश है? –

+0

@ डैरेन: भाषा रूबी में है। लेकिन मुझे यकीन है कि PHP के बराबर है। –

1

मेरी समझ से, -Dwebdriver.firefox.profile=<name> कमांड लाइन पैरामीटर का उपयोग करना संभव नहीं है क्योंकि इसे आपके उपयोग मामले में ध्यान में नहीं रखा जाएगा क्योंकि वर्तमान कोड डिजाइन के। जब से मैं एक ही मुद्दे का सामना किया और एक प्रोफ़ाइल निर्देशिका हर बार एक नया सत्र बनाई गई है अपलोड करने के लिए नहीं करना चाहता था, मैं this patch है कि एक नए firefox_profile_name पैरामीटर कि पर एक विशेष Firefox प्रोफ़ाइल लक्षित करने के लिए JSON क्षमताओं में इस्तेमाल किया जा सकता का परिचय क्रियान्वित किया है रीमोट सर्वर। उम्मीद है की यह मदद करेगा।

+0

ग्रेट @ स्टीफन - अगर मैं आपके पैच को समझ गया हूं, तो वही है जो मैं बाद में था।मैंने अभी तक इसका परीक्षण नहीं किया है, लेकिन क्या यह सुरक्षित है? (यानी अपने tidyup चरण में सेलेनियम अस्थायी प्रोफ़ाइल निर्देशिका बनाता है जो इसे बनाता है; क्या आपको ऐसा होने से रोकने के लिए स्पष्ट कोड की आवश्यकता नहीं है?) –

+0

हां, यह सुरक्षित है। सेलेनियम वास्तव में इस प्रोफाइल की एक अस्थायी प्रतिलिपि बनायेगा और इसका उपयोग करेगा (एक टेम्पलेट की तरह)। –

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

आइडिया है कि आप प्राप्त/पोस्ट में देना है/Zend प्रोफ़ाइल के नाम के साथ पी पैरामीटर नहीं तो एक यादृच्छिक Wil बनाया जा, और वह सभी फाइलें इसे अस्थायी फ़ोल्डर में रखेगी और इसे अंदर रखेगी।

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

काम करना चाहिए। बग fixed है।

बस अपने सेलेनियम सर्वर अद्यतन करें।

+0

ग्रेट, मुहम्मद धन्यवाद। मैंने अभी पुष्टि की है कि अब काम करता है। (बीटीडब्लू, यह अभी भी प्रोफाइल का _copy_ है; यानी कैश/इतिहास भर नहीं है।) –

+1

ओह, मैं बस एसएसएल प्रमाण पत्र और dom.max_script_run_time जैसे कुछ गुणों को सहेजने के लिए उपयोग करता हूं। –

संबंधित मुद्दे