2012-05-11 29 views
6

Szukałem wokół StackOverflow (i innych zasobów), jak zdalnie przesyłać pliki w Selenium WebDriver z PHP. Przeczytałem to http://saucelabs.com/blog/index.php/2012/03/selenium-tips-uploading-files-in-remote-webdriver/ i wspomina, że ​​musisz użyć metody "setFileDetector", aby jakoś zmienić sposób, w jaki działa biblioteka WebDriver, z której korzystasz.Zdalne przesyłanie plików w Selenium WebDriver przy użyciu PHP

To powinno działać dobrze, jeśli używałem Ruby lub Java. Większość frameworków PHP nie ma tej metody.

Czy ktoś może mi powiedzieć, jak to zrobić w PHP? Konkretnie, używam biblioteki phpwebdriver http://code.google.com/p/php-webdriver-bindings/

Odpowiedz

9

udało mi się ustalić, że JsonWireProtocol załadować plik byłby /session/<sessionId>/file sprawdzając surowego dziennika na stanowisku SauceLabs.com Blog (https://saucelabs.com/jobs/1a408cf60af0601f49052f66fa37812c/selenium-server.log), więc z tym, że stworzyliśmy tę funkcję Add-in do php-webdriver-wiązaniami biblioteka:

/** 
* 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; 
} 

Dodaj do tego WebDriver.php pliku.

Aby go wykorzystać, po prostu zrobić coś takiego:

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

Mam nadzieję, że to pomoże innym deweloperom, jak spędził 3 godziny szukając odpowiedzi na to.

Aktualizacja:

musiałem zmienić ze względu na uzyskiwanie ten błąd:

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

Mam nadzieję, że wprowadzenie tego tutaj, by uzyskać wyniki Google (próbowałem szukając komunikatu o błędzie w Google i jedynych wyników może znaleźć odniesienia do kodu źródłowego w Google Code).

Aby rozwiązać ten problem, udało mi się wydedukować, że wysyłany plik musi zostać spakowany. Dlatego rozbudowałem kod źródłowy, aby korzystać z biblioteki PHP ZipArchive. będę stary kod na górze do ewidencji, ale należy użyć nowego kodu tutaj:

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

Aktualizacja: Okazuje się, trzeba ustawić dwa parametry na $ zip-> addFile() metoda. Zmieniono powyższy kod, aby odzwierciedlić zmiany.

+0

dziękuję. WIĘCEJ za to. To nie jest miejsce na stronie JSON Wire Protocol (Command + F nic nie ma co najmniej) –

+0

@ K-RAN, funkcja ta nie jest oficjalnie częścią JSONWireProtocol. Rozwiązanie to jest w pewnym stopniu odwrotne od tego, jak robią to oficjalne powiązania językowe. To źle, prawda? – David

+0

Ten kod może być używany do oficjalnego poprawiania/scalania z powiązaniami PHP. Na stronie projektu jest numer 35 tego wydania. Połączę się, gdy się do tego zabiorę. – David

Powiązane problemy