2016-09-11 3 views
2

Ich schreibe einen Selenium-Testfall, bei dem einer der Schritte darin besteht, eine Datei über Dropzone.js hochzuladen.Programmgesteuertes Hochladen/Hinzufügen von Dateien über Dropzone z. von Selenium

(A Selen Javascript im Browser ausführen kann, also wenn es programmatisch in Javascript getan werden kann, das auch in Ordnung sein würde.)

Ich will ging der ganzen Weg zu vermeiden, dass die Datei-Browser-Fenster zu simulieren öffnen, Datei usw. auswählen, da dies außerhalb dessen liegt, was der Webtreiber handhaben kann und sehr kompliziert wird. In Pseudo-Code, würde Ich mag so etwas tun:

1. Select some Dropzone element 2. Set file path 3. Submit (upload the file)

Es gibt einen wahrscheinlich Ansatz in einer bestehenden Frage erwähnt (Unable to upload file using python selenium webdriver on http://www.dropzonejs.com), die das "dz-hidden-Eingang" Element verwendet (a DOM-Dateieingabe).

Leider funktioniert es nicht (zumindest nicht in der aktuellen Version von Dropzone) - nach dem Setzen der Datei auf das Element ist die Dropzone .files noch leer und es findet kein Upload statt.

Nachdem er in der Dropzone Quelle suchte, kam ich die oben durch die Erweiterung mit einer Arbeits Lösung:

1. Set file path in the "dz-hidden-input" element 2. Use javascript to retrieve the File object from the element 3. Pass the file to dropzone.addFile(file)

Aber meine Sorge ist es wirklich ein Hack ist, sowohl als versteckter Eingang und. addFile ist nicht dokumentiert, und der Test wird in der Zukunft unterbrochen, wenn Dropzone die Implementierung usw. ändert.

Gibt es einen besseren/dokumentierten Weg, dies zu tun?

(Um zu klären - Ich versuche, eine neue Datei zu, nicht eine vorhandene Datei zu zeigen, wie sie in der Dropzone FAQ erwähnt)

+0

Wir sind durch serverseitige Soap-Anfrage und als UI-Automatisierung durch Selen, für z.B. Klicken Sie auf Eingabe-Schaltfläche -> Verwenden Sie Web-Treiber-Zwischenablage/Java-Roboter -> Einfügen/geben Sie den Speicherort der Datei + Dateiname> Hit Roboter eingeben. Es tut mir leid, aber ich habe keine Idee von Dropzone Js Idee, aber das sind die zwei Möglichkeiten, die andere als die, die Sie durch Javascript-Level laden wollen programmatisch. –

+0

Danke, ja, ich habe es auch funktioniert, indem ich den Java Robot benutzt habe, um GUI-Aktionen zu simulieren, wie du erwähnt hast (obwohl ich es vorgezogen hätte, diese Route nicht zu benutzen, wenn es möglich ist ...). Als Referenz habe ich einen Beispielcode in diesem gefunden: http://sqa.stackexchange.com/questions/12851/how-can-i-work-with-file-uploads-during-a-webdriver-test, aber dafür Um zu arbeiten, musste ich einige Thread.sleep zwischen Aktionen einfügen. (Auch wenn Dropzone kein reguläres Dateieingabeelement ist, ist es möglich, nach ID zu suchen und dann auf click zu klicken, wodurch das Dateibrowserfenster geöffnet wird). –

+0

Ja, Sie müssen ausreichend hinzufügen nein. Da das mit dem Dateiexplorer interagiert und einige Zeit für das Öffnen und nach dem Hochladen benötigt, benötigt es die erforderlichen Schlafvorgänge entsprechend der Dateigröße. Hinzufügen als Antwort ... –

Antwort

1

klicken Sie auf dem Eingabetaste -> Verwenden Sie Web-Treiber Zwischenablage/java Roboter - > Einfügen/Dateiort + Dateiname eingeben> Trefferroboter eingeben.

final String fileName = "textfile.txt"; 
final String filePath = "\\data\\public\\other\\" + fileName; 
zUploadFile (filePath); 

public void zUploadFile (String filePath) throws HarnessException { 

    // Put path to your image in a clipboard 
    StringSelection ss = new StringSelection(filePath); 
    Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null); 
    // OR use java robot for entire filepath 
    Thread.sleep(10000); 

    // Imitate mouse events like ENTER, CTRL+C, CTRL+V 
    Robot robot; 
    try { 
     robot = new Robot(); 
     robot.keyPress(KeyEvent.VK_CONTROL); 
     robot.keyPress(KeyEvent.VK_V); 
     robot.keyRelease(KeyEvent.VK_V); 
     robot.keyRelease(KeyEvent.VK_CONTROL); 

     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

     robot.keyPress(KeyEvent.VK_ENTER); 
     robot.keyRelease(KeyEvent.VK_ENTER); 

    } catch (AWTException e) { 
     e.printStackTrace(); 
    } 
} 
+0

Nur um zu bestätigen, dass dieser Ansatz funktioniert. Aber wie ich in meiner Frage erwähnte, dass ich es vorziehe, GUI-Aktionen wie das Öffnen des Browsers nicht zu simulieren (und willkürliches Warten hinzuzufügen, das ein bisschen nicht deterministisch ist), suche ich immer noch nach einer Lösung, die direkt mit Dropzone funktioniert Ein solcher Ansatz existiert :-) –

+0

Danke Ken. Können Sie mir sagen, welche serverseitige Lösung Sie für Ihr Projekt verwenden? Ich meine, das ist die zweite Alternative und die dritte ist wahrscheinlich durch Dropzone, die mir leider nicht als Werkzeug bekannt ist. –

+1

Ich benutze node.js auf dem Server und nehme die standard HTTP-Multipart-Dateianforderung.Dies ist jedoch eher ein Problem auf Seiten der Kunden. Dropzone.js ist eine clientseitige JavaScript-Komponente, die Drag-Drop-Dateien verarbeiten kann, aber für den einfachsten Anwendungsfall kann sie wie ein normales Eingabesteuerelement für HTML-Dateien funktionieren - klicken Sie darauf und es öffnet sich ein Dateibrowser. Für ein normales Eingabesteuerelement für HTML-Dateien ist das Hochladen einer Datei einfach, indem nur WebDriver-Aufrufe verwendet werden, z. 'driver.findElement (By.xpath (" // Eingabe [@ Typ = 'Datei'] ")). sendKey (" foo.txt ")'; aber leider funktioniert das Gleiche nicht für die Dropzone-Komponente. –

Verwandte Themen