2011-09-07 36 views
9

Selenium2, theo mặc định, khởi động firefox với cấu hình mới. Tôi thích điều đó cho một mặc định, nhưng vì một số lý do chính đáng (quyền truy cập vào dấu trang của tôi, mật khẩu đã lưu, sử dụng tiện ích bổ sung của tôi, v.v.) Tôi muốn bắt đầu với tiểu sử mặc định của mình.Firefox Selenium2: sử dụng cấu hình mặc định

supposed to be một thuộc tính kiểm soát điều này nhưng tôi nghĩ rằng tài liệu không đồng bộ với nguồn, bởi vì theo như tôi có thể nói webdriver.firefox.bin là tài khoản duy nhất hoạt động. Ví dụ. bắt đầu selen với:

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

hoạt động (tức là nó than phiền). Nhưng điều này không có hiệu lực:

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

("mặc định" là tên trong profiles.ini, nhưng tôi cũng đã thử với "Profile0" là tên của phần trong profiles.ini).

Tôi đang sử dụng PHPWebdriver (trong đó sử dụng JsonWireProtocol) để truy cập:

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

$webdriver->connect("firefox"); 

Tôi đã cố gắng làm việc đó từ phía PHP:

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

hay:

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

với không thành công (firefox bắt đầu, nhưng không sử dụng hồ sơ của tôi).

Tôi cũng đã cố gắng tiếp cận của hacker tạo ra một tập tin thực thi:

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

Và sau đó bắt đầu Selenium với: java -jar selen-server-độc-2.5.0.jar -Dwebdriver.firefox.bin Firefox bắt đầu, nhưng không sử dụng theo cấu hình mặc định và, tệ hơn, mọi thứ bị treo: selenium dường như không thể giao tiếp với firefox khi bắt đầu theo cách này.

P.S. Tôi đã thấy Selenium - Custom Firefox profile Tôi đã thử điều này:

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

Và từ chối chạy! Vui mừng, nghĩ rằng tôi có thể làm gì đó, tôi đã thử:

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

Điều này không có gì. I E. nó vẫn bắt đầu với một hồ sơ mới :-(

Trả lời

8

Simon Stewart answered this on the mailing list cho tôi.

Để tóm tắt câu trả lời của mình: bạn mang hồ sơ firefox của bạn, zip nó lên (zip, không tgz), base64 mã hóa nó, sau đó gửi toàn bộ điều như một /session json request (đặt chuỗi base64 trong khóa firefox_profile của Capabilities vật).

Một ví dụ cách để làm điều này trên Linux:

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

Và sau đó nếu bạn đang sử dụng PHPWebDriver khi kết nối làm:

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

LƯU Ý: Nó vẫn sẽ không là hồ sơ thực sự của tôi, thay vì một bản sao của nó. Vì vậy, dấu trang sẽ không được ghi nhớ, bộ nhớ cache sẽ không được điền, v.v.

+0

Cảm ơn, điều đó thực sự hữu ích. Sẽ được tốt đẹp nếu mã PHP để zip hồ sơ và sau đó mã hóa để base64 được cung cấp để người ta có thể làm tất cả mọi thứ trong PHP. – David

+0

Xác nhận lại những gì đã được nêu ... Đây là con đường để đi. Làm việc hoàn hảo cho chúng tôi khi chúng tôi muốn đường ống tất cả các yêu cầu selen qua một proxy. –

5

Dưới đây là tương đương với Java. Tôi chắc chắn có cái gì đó tương tự có sẵn trong php.

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

Nếu bạn muốn mở rộng additonal bạn có thể làm một cái gì đó như thế này là tốt.

ProfilesIni profile = new ProfilesIni(); 
FirefoxProfile ffprofile = profile.getProfile("default"); 
ffprofile.addExtension(new File("path/to/my/firebug.xpi")); 
WebDriver driver = new FirefoxDriver(ffprofile); 
+0

Cảm ơn @nilesh. Tôi có đúng khi nghĩ rằng điều này đang sử dụng trực tiếp WebDriver; bạn không bắt đầu 'selenium-server-standalone.jar' và do đó không sử dụng JsonWireProtocol? –

+0

Điều này đang sử dụng trình quản lý web trực tiếp. Tôi không chắc chắn những gì bạn có nghĩa là bằng cách bắt đầu với một mình jar. WebDriver chính nó sử dụng JsonWireProtocol để giao tiếp http://code.google.com/p/selenium/wiki/JsonWireProtocol – nilesh

+0

Ah, thú vị. Vì vậy, đoạn mã java trên của bạn bằng cách nào đó được chuyển thành JSON và các cuộc gọi dịch vụ web? Nếu tôi chỉ có thể theo dõi những gì các cuộc gọi là sau đó tôi có thể thực hiện nó trong thư viện PHP. Nhưng bất cứ điều gì nó đang làm không phải là tài liệu tại URL bạn đã cung cấp, và tôi đã không thấy bất kỳ tài liệu nào khác cho JsonWireProtocol. Tôi nghĩ rằng tôi sẽ liên lạc với các nhà phát triển Selenium. –

1

tôi rất tò mò về vấn đề này như là tốt và những gì tôi đã làm việc rất đơn giản. tôi sử dụng lệnh /Applications/Firefox.app/Contents/MacOS/firefox-bin -P để đưa lên hồ sơ quản lý. Sau khi tôi tìm thấy trong đó hồ sơ tôi cần phải sử dụng tôi đã sử dụng mã sau đây t o kích hoạt hồ sơ browser = Selenium::WebDriver.for :firefox, :profile => "batman".

Điều này đã kéo tất cả dấu trang và plugin của tôi được liên kết với tiểu sử đó.

Hy vọng điều này sẽ hữu ích.

+0

Cảm ơn @Curtis. Ngôn ngữ/thư viện đó là lệnh gì? –

+0

@ Darren: ngôn ngữ có trong ruby. Nhưng tôi chắc chắn có một tương đương với PHP. –

1

Từ hiểu biết của tôi, không thể sử dụng tham số dòng lệnh -Dwebdriver.firefox.profile=<name> vì nó sẽ không được tính đến trong trường hợp sử dụng của bạn vì của thiết kế mã hiện tại. Vì tôi gặp vấn đề tương tự và không muốn tải lên thư mục hồ sơ mỗi lần tạo phiên mới, tôi đã triển khai this patch giới thiệu thông số firefox_profile_name mới có thể được sử dụng trong khả năng JSON để nhắm mục tiêu cấu hình Firefox cụ thể trên máy chủ từ xa. Hi vọng điêu nay co ich.

+0

Great @ Stéphane - nếu tôi đã hiểu bản vá của bạn, đó chính xác là những gì tôi đã làm sau đó.Tôi chưa thử nghiệm, nhưng nó có an toàn không? (tức là trong selenium giai đoạn dọn dẹp của nó xóa thư mục hồ sơ tạm thời mà nó tạo ra; bạn không cần mã rõ ràng để dừng điều đó xảy ra?) –

+0

Vâng, nó an toàn. Selenium trên thực tế sẽ tạo một bản sao tạm thời của hồ sơ này và sử dụng nó (như một mẫu). –

1

I Did It trong Zend như thế này:

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

Ý tưởng là bạn đưa ra trong get/post/zend thông số P với tên của hồ sơ nếu không phải là một wil ngẫu nhiên được tạo ra, và ông sẽ nén tất cả các tệp vào thư mục tạm thời và đặt nó vào.

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

sẽ hoạt động. lỗi là fixed.

Chỉ cần cập nhật máy chủ selenium của bạn.

+0

Tuyệt vời, cảm ơn Muhammad. Tôi vừa xác nhận rằng hiện giờ đã hoạt động. (BTW, nó vẫn là một _copy_ của hồ sơ, tức là cache/history không được điền vào.) –

+1

oh, tôi chỉ sử dụng để lưu chứng chỉ ssl và một số thuộc tính như dom.max_script_run_time. –

Các vấn đề liên quan