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.
dziękuję. WIĘCEJ za to. To nie jest miejsce na stronie JSON Wire Protocol (Command + F nic nie ma co najmniej) –
@ 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
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