2017-02-08 1 views
1

Ich versuche, ein Bild-Upload mit Selenium/Mink mit Behat in einer Symfony-Anwendung zu testen. Die Anwendung wird in einem Docker-Container ausgeführt.Behat Mink-Datei-Upload Datei beim Senden nicht gefunden

mir die Datei direkt auf die NodeElement des Eingangs Befestigung anstatt $driver->attachFileToField('#id-of-input', $filePath) verwenden, weil wir mit vielen Eingaben im Kontext zu tun haben und haben bereits die Eingabe in dem Verfahren genannt werden:

$input->attachFile($this->filesPath . '1.jpg'); 

der resultierende Pfad ist:

/var/www/html/src/Resources/TestImages/1.jpg 

diese Datei existiert sicherlich auf diesem Weg in den docker Behälter aber wenn das Formular abgeschickt wird, wird dieser Fehler ausgelöst:

Your file was not found

Es gibt keine hilfreiche Protokolle.

Ich habe versucht, in behat.yml die files_path Parameter einstellen, aber dann während der Testlauf ich Fehler:

unknown error: path is not absolute: 3.jpg 

ich etwas fehlt? Ist der Dateipfad für den Container nicht korrekt?

Ich habe versucht, ohne Erfolg des abs Weg auf meiner Maschine (obwohl dieser Ansatz hat gravierende Nachteile, so bin ich froh, es nicht die Lösung war):

/Users/its.me/Sites/kbs/src/Resources/TestImages/1.jpg 

Die lokal Users dir ist Auch in meine Docker-Maschine eingebunden, damit der ABS-Pfad auf dem Host funktioniert. Ich dachte, es könnte mit Berechtigungen zusammenhängen, also habe ich sie alle auf Lesen/Schreiben/Ausführen gesetzt, aber keine Zigarre! Relative Pfade funktionieren nicht.

Wo sind meine Bilder?

+1

Für Fern bitte dieses MinkSelenium2Driver Ticket Hochladen sehen https://github.com/minkphp/MinkSelenium2Driver/issues/187 – lauda

+0

Dies trug dazu bei - wird meine Lösung veröffentlichen. –

Antwort

2

auf dem issue posted by @lauda at GitHub Basierend muss der MinkSeleniumDriver einige Dateivorbereitung richtig zu arbeiten. Nämlich, es in eine Zip-Datei umzuwandeln. This comment half:

$localFile = $this->filesPath . '01.jpg'; 
$tempZip = tempnam('', 'WebDriverZip'); 
$zip = new \ZipArchive(); 
$zip->open($tempZip, \ZipArchive::CREATE); 
$zip->addFile($localFile, basename($localFile)); 
$zip->close(); 

$remotePath = $this->getSession()->getDriver()->getWebDriverSession()->file([ 
    'file' => base64_encode(file_get_contents($tempZip)) 
]); 

$input->attachFile($remotePath); 
unlink($tempZip); 

Der obige Code basiert auf der upload() Methode von facebook/php-webdriver:

/** 
    * Upload a local file to the server 
    * 
    * @param string $local_file 
    * 
    * @throws WebDriverException 
    * @return string The remote path of the file. 
    */ 
    private function upload($local_file) { 
    if (!is_file($local_file)) { 
     throw new WebDriverException("You may only upload files: " . $local_file); 
    } 
    // Create a temporary file in the system temp directory. 
    $temp_zip = tempnam('', 'WebDriverZip'); 
    $zip = new ZipArchive(); 
    if ($zip->open($temp_zip, ZipArchive::CREATE) !== true) { 
     return false; 
    } 
    $info = pathinfo($local_file); 
    $file_name = $info['basename']; 
    $zip->addFile($local_file, $file_name); 
    $zip->close(); 
    $params = array(
     'file' => base64_encode(file_get_contents($temp_zip)), 
    ); 
    $remote_path = $this->executor->execute(
     DriverCommand::UPLOAD_FILE, 
     $params 
    ); 
    unlink($temp_zip); 
    return $remote_path; 
    } 
+0

Das hat immer für mich funktioniert. [Datei hochladen mit Behat] (http://www.inanzzz.com/index.php/post/8oyw/file-uploading-with-behat) – BentCoder

1

die Datei in Ihrem Behat Verzeichnis hinzufügen und setzen files_path unter Behat\MinkExtension\Extension:

Die files_path sollte wie etwas sein: files_path: %behat.paths.features%/bootstrap

+0

Wenn sie im behat-Verzeichnis sind, was sollte der 'files_path' sein? Pfad zum Behath-Verzeichnis ist 'src/Features /' –

0

Stellen Sie sicher, files_path in Ihrem Behat.yml Datei unter MinkExtension Abschnitt umfassen, z.B.

default: 
    extensions: 
     Behat\MinkExtension\Extension: 
      files_path: %behat.paths.base%/build/dummy/ 

Stellen Sie außerdem sicher, dass Sie die richtige Ordnerstruktur haben, z.

# Your application 
football 
    build 
     dummy 
     document 
      hello.doc 
      world.xls 
     image 
      test.jpg 

Beispiel Behat Eigenschaft:

Feature: Example feature 

    Scenario: I can upload image 
    Given I am on "/" 
    When I attach the file "image/test.jpg" to "league_flag" 
    And I press "Submit" 
    Then I should see "Succeeded." 

Hier ist die eigentliche MinkExtension gebaut Methode:

/** 
* Attaches file to field with specified id|name|label|value 
* Example: When I attach "bwayne_profile.png" to "profileImageUpload" 
* Example: And I attach "bwayne_profile.png" to "profileImageUpload" 
* 
* @When /^(?:|I)attach the file "(?P<path>[^"]*)" to "(?P<field>(?:[^"]|\\")*)"$/ 
*/ 
public function attachFileToField($field, $path) 
{ 
    $field = $this->fixStepArgument($field); 
    if ($this->getMinkParameter('files_path')) { 
     $fullPath = rtrim(realpath($this->getMinkParameter('files_path')), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.$path; 
     if (is_file($fullPath)) { 
      $path = $fullPath; 
     } 
    } 
    $this->getSession()->getPage()->attachFileToField($field, $path); 
} 

Siehe auch: File uploading with Behat.