2012-05-11 28 views
6

StackOverflow'u (ve diğer kaynakları), PHP ile Selenium WebDriver'da dosyaları uzaktan yükleme hakkında arama yapıyorum. Bu http://saucelabs.com/blog/index.php/2012/03/selenium-tips-uploading-files-in-remote-webdriver/'u okudum ve kullandığınız WebDriver kitaplığı yöntemini değiştirmek için bir şekilde "setFileDetector" yöntemini kullanmanız gerektiğinden bahseder.Dosyaları, PHP'yi kullanarak Selenium WebDriver üzerinde uzaktan yükleme

Ruby veya Java kullanıyor olsaydım bu iyi çalışır. Öte yandan çoğu PHP çerçevesinin bu yöntemi yoktur.

Bunu PHP'de nasıl yapacağımı söyleyen var mı? Özellikle, ben phpwebdriver kütüphanesini http://code.google.com/p/php-webdriver-bindings/

cevap

9

Ben JsonWireProtocol Bunda bu kadar SauceLabs.com blog post (https://saucelabs.com/jobs/1a408cf60af0601f49052f66fa37812c/selenium-server.log) ham günlüğünü kontrol ederek /session/<sessionId>/file olacak bir dosya yüklemek için olduğunu belirlemek mümkün oldu kullanıyorum, ben

/** 
* Send a file to your Remote WebDriver server 
* This will return the local URL of the file you uploaded, which will then 
* let you use sendKeys in file input elements 
* @params String $value - a local or remote file to send 
* @return String $resopnseValue - the local directory where the file resides on the remote server 
*/ 
public function sendFile($value) { 
    $file = @file_get_contents($value); 

    if($file === false) { 
     return false; 
    } 

    $file = base64_encode($file); 
    $request = $this->requestURL . "/file"; 
    $session = $this->curlInit($request); 
    $args = array('file' => $file); 
    $postargs = json_encode($args); 
    $this->preparePOST($session, $postargs); 
    $response = trim(curl_exec($session)); 

    $responseValue = $this->extractValueFromJsonResponse($response); 
    return $responseValue; 
} 

WebDriver.php dosyaya ekleyin: eklenti için php-webdriver-bağlamaları kütüphaneye bu fonksiyonu yarattı.

sadece böyle bir şey yapmak, kullanmak için: Bu diğer geliştiriciler yardımcı olacağını umuyoruz

... 
$file_location = $webdriver->sendFile('http://test.com/some/file.zip'); 
$file_input = $webdriver->findElementBy(LocatorStrategy::id, 'uploadfile'); 
$file_input->sendKeys(array($file_location)); 

, bu cevabını arayan 3 saat gibi geçirdi.

Güncelleme:

Expected there to be only 1 file. There were: 0 

Umarım Google'da hata mesajı ve yalnızca sonuçlar için arama çalıştı (Google sonuçlarını alacağı burada bu koyarak:

nedeniyle bu hatayı almaya bu değiştirmek zorunda Google Code'daki kaynak koduna referanslar bulabilirdi).

Bu sorunu çözmek için, gönderdiğiniz dosyanın gerçekten sıkıştırılmış olması gerektiğini anlayabildim. Bu yüzden PHP'nin ZipArchive kütüphanesini kullanmak için kaynak kodunu artırdım. Ben kayıt tutma için üstünde eski kodu tutmak, ama burada yeni kodu kullanın olacaktır:

public function sendFile($value, $file_extension = '') 
{ 
    $zip = new ZipArchive(); 

    $filename_hash = sha1(time().$value); 

    $zip_filename = "{$filename_hash}_zip.zip"; 
    if($zip->open($zip_filename, ZIPARCHIVE::CREATE) === false) { 
     echo 'WebDriver sendFile $zip->open failed\n'; 
     return false; 
    } 

    $file_data = @file_get_contents($value); 
    if($file_data === false) { 
     throw new Exception('WebDriver sendFile file_get_contents failed'); 
    } 

    $filename = "{$filename_hash}.{$file_extension}"; 
    if(@file_put_contents($filename, $file_data) === false) { 
     throw new Exception('WebDriver sendFile file_put_contents failed'); 
    } 

    $zip->addFile($filename, "{$filename_hash}.{$file_extension}"); 
    $zip->close(); 

    $zip_file = @file_get_contents($zip_filename); 
    if($zip_file === false) { 
     throw new Exception('WebDriver sendFile file_get_contents for $zip_file failed'); 
    } 

    $file = base64_encode($zip_file); 

    $request = $this->requestURL . "/file"; 
    $session = $this->curlInit($request); 
    $args = array('file' => $file); 
    $postargs = json_encode($args); 
    $this->preparePOST($session, $postargs); 
    $response = trim(curl_exec($session)); 

    return $this->extractValueFromJsonResponse($response); 
} 

Güncelleme:, size $ Zip iki parametrelerini ayarlamak gerekir çıkıyor> addFile() yöntem. Değişiklikleri yansıtmak için yukarıdaki kodu düzenledik.

+0

Teşekkürler. Bunun için ÇOK ÇOK. JSON Tel Protokolü sayfasında (Command + F en azından hiçbir şey almaz) hiçbir yerde –

+0

@ K-RAN, özellik resmi olarak JSONWireProtocol'un bir parçası değildir. Çözüm, resmi dil bağlantılarının bunu nasıl yaptığıyla tersine mühendisliktir. Bu çok kötü değil mi? – David

+0

Bu kod, PHP bağlantılarının resmi olarak eklenmesi/birleştirilmesi için kullanılabilir. Proje sayfasında bunun için 35 sorun var. Buraya geldiğimde birleşeceğim. – David

İlgili konular