Невозможно загрузить файл с помощью PhantomJs (и Selenium WebDriver)

С чем я работаю:

Для начала мой HTML выглядит следующим образом:

<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>

Я разместил все это, ввод файла - это следующая часть:

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

Моя ситуация:

Я использую Selenium WebDriver с PhantomJs (С#). До этого я использовал FireFox вместо PhantomJs и загружал файл следующим образом:

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

Моя проблема:

Однако это падает, когда я использую PhantomJs.

Моя попытка решить проблему:

Я нашел следующую ветку, в которой обсуждается проблема: https://github.com/ariya/phantomjs/issues/10993

И я попробовал предложенное решение:

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

Однако, хотя это не вызывает ошибку, файл не загружается.

После поиска повсюду мой единственный вариант - спросить здесь, надеясь, что кто-то может мне помочь.

Мне кажется, что это общая проблема для многих людей, использующих PhantomJs+Selenium, и это заставляет задуматься, почему этот баг до сих пор не исправлен.


person JensOlsen112    schedule 03.04.2015    source источник
comment
Как он падает при подходе SendKeys()?   -  person alecxe    schedule 03.04.2015
comment
@alecxe Я получаю сообщение: HTTP-запрос к удаленному серверу WebDriver для URL-адреса localhost:9648/session/c05b78a0-da4b-11e4-955d-1502c51c62ed/ истекает через 60 секунд.   -  person JensOlsen112    schedule 04.04.2015
comment
Я сталкиваюсь с той же ситуацией - PhantomJS зависает на Sendkeys, что является известной проблемой, и функция executePhantomJS не дает мне никаких ошибок, но фактически не загружает файл. Вы пробовали тот же скрипт, но с HtmlUnitDriver?   -  person LittlePanda    schedule 05.04.2015
comment
Я разместил этот же вопрос. Никто не ответил, и я думаю попробовать javascript + phantomjs в Nodeclipse - stackoverflow.com/questions/29315319/   -  person LittlePanda    schedule 05.04.2015
comment
@LittlePanda Я пробовал, но не знаю, как заставить работать HtmlUnitDriver. У меня та же проблема, что и у этого нерешенного вопроса: stackoverflow.com/questions/ 29456504/running-htmlunit-in-c   -  person JensOlsen112    schedule 05.04.2015
comment
@JensOlsen112: Все в порядке. HtmlUnitDriver проще настроить с помощью Selenium, но он не идентифицирует элементы должным образом. В этом смысле PhantomJS лучше. Я обязательно опубликую ответ, если найду какое-либо решение. Отметил этот вопрос в избранном!   -  person LittlePanda    schedule 06.04.2015
comment
@LittlePanda Спасибо, пожалуйста :)   -  person JensOlsen112    schedule 06.04.2015


Ответы (2)


Только сегодня столкнулся с такой же проблемой и решил ее. Функциональность загрузки файлов не работает в PhantomJS 2.0. Пожалуйста, проверьте эту тему https://github.com/ariya/phantomjs/issues/12506 Чтобы получить больше информации.

Поэтому обычно вам следует сделать собственную сборку браузера PhantomJS (или дождаться официального исправления) и использовать уже упомянутый выше скрипт:

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

Обратите внимание, что некоторые кастомные сборки уже доступны в ветке (там я брал кастомную сборку для Windows).

person Yuriy Ermolenko    schedule 28.09.2015

Взгляните на мой ответ здесь. Он описывает процесс, с которым мне повезло в прошлом при работе с не-браузером. диалоговые окна (например, загрузки файлов).

Хотя вопрос, на который я вас связал, касается Java, код в моем ответе на самом деле C#.

person aholt    schedule 06.04.2015
comment
Спасибо за ответ. Обязательно попробую это! - person LittlePanda; 07.04.2015
comment
Спасибо за предложение. Проблема в том, что это решение отправляет необработанный веб-запрос, а это означает, что мне нужно вручную создать новый метод/проверить форму для каждой загрузки отдельного файла. Хотелось бы, чтобы это было так же просто, как с помощью SendKeys(). - person JensOlsen112; 30.04.2015
comment
да, в селене действительно нет простой кнопки с серебряной пулей для файловых диалогов. - person aholt; 30.04.2015