Вопрос по php, file-upload – Удаленная загрузка файлов в Selenium WebDriver с использованием PHP

7

Я искал в StackOverflow (и других ресурсах), как удаленно загружать файлы в Selenium WebDriver с помощью PHP. Я прочитал этоhttp://saucelabs.com/blog/index.php/2012/03/selenium-tips-uploading-files-in-remote-webdriver/и в нем упоминается, что вам нужно использовать & quot; setFileDetector & quot; каким-то образом изменить способ работы библиотеки WebDriver, которую вы используете.

Это должно работать нормально, если я использовал Ruby или Java. С другой стороны, большинство PHP-фреймворков не имеют этого метода.

Кто-нибудь может сказать мне, как это сделать в PHP? В частности, я использую библиотеку phpwebdriverhttp://code.google.com/p/php-webdriver-bindings/

Ваш Ответ

1   ответ
9

Я смог определить, что JsonWireProtocol для загрузки файла будет/session/<sessionId>/file проверив необработанный журнал в блоге SauceLabs.com (https://saucelabs.com/jobs/1a408cf60af0601f49052f66fa37812c/selenium-server.log) с этим я создал эту функцию для надстройкиphp-webdriver-bindings библиотека:

/**
 * 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 файл.

Чтобы использовать, просто сделайте что-то вроде этого:

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

Надеюсь, это поможет другим разработчикам, потратившим около 3 часов на поиски ответа на этот вопрос.

Обновить:

Я должен был изменить это из-за получения этой ошибки:

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

Надеюсь, что это приведет к результатам Google (я попытался найти сообщение об ошибке в Google, и единственные результаты, которые он мог найти, были ссылки на исходный код в Google Code).

Чтобы решить эту проблему, я смог сделать вывод, что файл, который вы отправляете, действительно должен быть заархивирован. Поэтому я добавил исходный код, чтобы использовать PHPZipArchive библиотека. Я буду держать старый код сверху для ведения записей, но, пожалуйста, используйте новый код здесь:

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

Update: Оказывается, вам нужно установить два параметра в методе $ zip-> addFile (). Отредактировал приведенный выше код, чтобы отразить изменения.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededcode.google.com/p/php-webdriver-bindings/issues/detail?id=35
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы