2015-04-03 13 views
5

Was mit arbeite ich:nicht Datei mit PhantomJS hochladen (und Selen WebDriver)

Um zu beginnen, mein HTML sieht folgenden:

<form action="http://example.com/upload_photo_iframe.html" preview_div="upload_photo_div" submit_button="submit_btn" upload_field="photo_upload" target="photo_target" enctype="multipart/form-data" method="POST" id="uploadfile" name="uploadfile"> 
    <input type="hidden" value="CSRF_iframe_photo_upload" name="csrfname"> 
    <input type="hidden" value="3350427f0f068509081a09e283607214001b6912843ffb937b934208c91d9041c88faf0e66df4f3898ef202a34b669647f5b3fd9a2122e389acd3f53c33fc88b" name="csrftoken"> 
    <label class="file-upload"> 
      <p id="upload_text">Click Browse to choose a file then click Upload</p> 
      <input type="file" class="file" id="photo_upload" name="photo_upload" accept="image/*"> 
    </label> 
    <input type="hidden" value="true" name="makeLargeThumb"> 
    <input type="hidden" value="p" name="size"> 
    <input type="hidden" value="P" name="type"> 
    <input type="hidden" value="5120000" name="MAX_FILE_SIZE"> 
    <input type="hidden" value="0" name="album_id" class="album_id_hidden"> 
    <input type="submit" class="grey_btn" id="upload_btn" value="Upload" name="submit_btn"> 
<input type="hidden" name="callback" value="document.forms.uploadfile.handleReceive"><input type="hidden" name="fieldName" value="photo_upload"></form> 

ich die ganze Sache geschrieben, die Datei-Eingabe ist der folgende Teil:

<input type="file" class="file" id="photo_upload" name="photo_upload" accept="image/*"> 

Meine Situation:

Ich verwende Selenium WebDriver mit PhantomJs (C#). Vor diesem verwendete ich FireFox statt PhantomJS und lud hoch Datei die folgende Art und Weise:

_driver.FindElement(photoUploadPath).SendKeys(imagePath); 

Mein Problem:

Doch diese stürzt ab, wenn ich PhantomJS verwenden.

Mein Versuch, das Problem zu lösen: https://github.com/ariya/phantomjs/issues/10993

Und ich versuchte, die vorgeschlagene Lösung:

((PhantomJSDriver)driver).executePhantomJS("var page = this; page.uploadFile('input[type=file]', '/path/to/file');"); 

Doch während dieser

ich folgenden Thread diskutiert das Problem gefunden Es wird kein Fehler ausgegeben, die Datei wird nicht hochgeladen.

Nachdem ich weit und breit gesucht habe, ist meine einzige Option hier zu fragen, in der Hoffnung, dass mir jemand helfen kann.

Es scheint mir, dass dies ein häufiges Problem für viele Menschen mit PhantomJs + Selen ist und ich frage mich, warum dieser Fehler noch behoben werden muss.

+0

Wie stürzt es bei 'SendKeys()' Ansatz ab? – alecxe

+0

@alecxe Ich bekomme die Nachricht: "Die HTTP-Anfrage an den Remote-WebDriver-Server für die URL http: // localhost: 9648/Sitzung/c05b78a0-da4b-11e4-955d-1502c51c62ed/Element /: wdc: 1428097984752/Wert zeitlich festgelegt nach 60 Sekunden aus." – JensOlsen112

+0

Ich bin mit der gleichen Situation konfrontiert - PhantomJS hängt an Sendkeys, das ist ein bekanntes Problem, und die Funktion executePhantomJS gibt mir keinen Fehler, aber lädt nicht die Datei. Haben Sie das gleiche Skript versucht, aber mit HtmlUnitDriver? – LittlePanda

Antwort

0

Werfen Sie einen Blick auf meine Antwort here Es geht über den Prozess, mit dem ich in der Vergangenheit hatte Glück gehabt, wenn Sie mit nicht-Browser-Dialogfeldern (wie Datei-Uploads).

Während die Frage, zu der ich Sie verlinkt habe, in Bezug auf Java ist, ist der Code in meiner Antwort eigentlich C#.

+0

Danke für die Antwort. Werde es definitiv ausprobieren! – LittlePanda

+0

Danke für den Vorschlag. Das Problem ist, dass diese Lösung eine "rohe" Webanfrage sendet, was bedeutet, dass ich manuell eine neue Methode erstellen muss/das Formular für jeden einzelnen Dateiupload überprüfen muss. Ich wünschte, es gäbe einen Weg, es so einfach zu machen wie mit SendKeys(). – JensOlsen112

+0

yeah, es gibt wirklich keinen Silver-Bullet einfach Knopf für Datei-Dialoge in Selen. – aholt

1

Gerade das gleiche Problem heute konfrontiert und es gelöst. Datei-Upload-Funktionalität ist in PhantomJS 2.0 unterbrochen. Bitte überprüfen Sie diesen Thread https://github.com/ariya/phantomjs/issues/12506 für weitere Informationen.

So im Allgemeinen sollten Sie eine benutzerdefinierte Version von PhantomJS Browser machen (oder für offizielle Updates warten) und das Skript bereits oben erwähnt:

((PhantomJSDriver)driver).executePhantomJS("var page = this; page.uploadFile('input[type=file]', '/path/to/file');"); 

Bitte beachten Sie, dass einige benutzerdefinierte im Thread sind bereits verfügbar bauen (Ich habe dort einen benutzerdefinierten Build für Windows gemacht).

Verwandte Themen