Загрузка файла автоматически в Selenium WebDriver

Есть кнопка add file задается id=“SWFUpload_0”, куда подсунуть send_keys(“B:\ter.jpg”) для загрузки изображения.
WebDriver + Python

    <div class="controls">
        <div class="well-bg-white width-600">
            <div class="banner-upload-container">
                <p>
                    The recommended dimensions for this ad group are
                    <b>
                        38x38, 120x20, 120x600, 168x28, 216x36, 250x250, 250x125, 292x60, 300x50, 300x250, 300x30, 320x50, 320x53, 320x480, 320x568, 320x48, 468x60, 480x60, 480x320, 480x75, 500x130, 728x90, 768x1024, 768x66, 1024x768
                    </b>
                    dimension.
                </p>

                <p>
                    Please upload at least one of the recommended banners
                </p>

                <p>
                    The accepted banner formats are JPG, GIF, PNG. The maximum banner size is 400 KB.
                </p>

            </div>


            <div class="file-list" style="">
                <h4>Files Selected For Upload</h4>

            <ul class="list"><li class="item"><p>jolly.jpg <a href="remove" class="right-but action"><i class="icon-remove"></i></a></p> </li></ul></div>
            <div>
                <object id="SWFUpload_0" type="application/x-shockwave-flash" data="/swfupload/swfupload.swf?preventswfcaching=1384334421186" width="77" height="30" class="swfupload"><param name="wmode" value="window"><param name="movie" value="/swfupload/swfupload.swf?preventswfcaching=1384334421186"><param name="quality" value="high"><param name="menu" value="false"><param name="allowScriptAccess" value="always"><param name="flashvars" value="movieName=SWFUpload_0&amp;uploadURL=%2Fadvertiser%2Fv2%2FuploadBanner.html&amp;useQueryString=false&amp;requeueOnError=false&amp;httpSuccess=&amp;assumeSuccessTimeout=0&amp;params=adGroupId%3Df416a6f5e9c74e1d9598f610e6c536ac%26amp%3BcontentId%3Daf8ec635a8b7a7c109ebe33b8fc8ffcd&amp;filePostName=fileData&amp;fileTypes=*.png%3B%20*.jpg%3B%20*.gif%3B%20*.jpeg&amp;fileTypesDescription=Image%20Files&amp;fileSizeLimit=100%20MB&amp;fileUploadLimit=100&amp;fileQueueLimit=100&amp;debugEnabled=false&amp;buttonImageURL=%2Fadvimages%2Fadd-files.png&amp;buttonWidth=77&amp;buttonHeight=30&amp;buttonText=&amp;buttonTextTopPadding=0&amp;buttonTextLeftPadding=0&amp;buttonTextStyle=color%3A%20%23000000%3B%20font-size%3A%2016pt%3B&amp;buttonAction=-110&amp;buttonDisabled=false&amp;buttonCursor=-1"></object>
                <button class="upload-but btn">Upload</button>
            </div>
        </div>


        <div class="uploaded-list" style="display: none">
            <div class="well-bg-white  width-600">
                <h4>Uploaded Banners</h4>

            <ul class="list"><li class="no-data">No banners uploaded </li></ul></div>



        </div>
        <span class="help-inline"></span>
    </div>

а куда ты путь до файла подсовываешь, когда вручную эту операцию производишь?

<object id="SWFUpload_0" type="application/x-shockwave-flash" ..... ></object>

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

Достачно было привести необходимый кусок кода, а именно:

<object id="SWFUpload_0" type="application/x-shockwave-flash" data="/swfupload/swfupload.swf?preventswfcaching=1384334421186" width="77" height="30" class="swfupload">
  <param name="wmode" value="window">
  <param name="movie" value="/swfupload/swfupload.swf?preventswfcaching=1384334421186">
  <param name="quality" value="high">
  <param name="menu" value="false">
  <param name="allowScriptAccess" value="always">
  <param name="flashvars" value="movieName=SWFUpload_0&amp;uploadURL=%2Fadvertiser%2Fv2%2FuploadBanner.html&amp;useQueryString=false&amp;requeueOnError=false&amp;httpSuccess=&amp;assumeSuccessTimeout=0&amp;params=adGroupId%3Df416a6f5e9c74e1d9598f610e6c536ac%26amp%3BcontentId%3Daf8ec635a8b7a7c109ebe33b8fc8ffcd&amp;filePostName=fileData&amp;fileTypes=*.png%3B%20*.jpg%3B%20*.gif%3B%20*.jpeg&amp;fileTypesDescription=Image%20Files&amp;fileSizeLimit=100%20MB&amp;fileUploadLimit=100&amp;fileQueueLimit=100&amp;debugEnabled=false&amp;buttonImageURL=%2Fadvimages%2Fadd-files.png&amp;buttonWidth=77&amp;buttonHeight=30&amp;buttonText=&amp;buttonTextTopPadding=0&amp;buttonTextLeftPadding=0&amp;buttonTextStyle=color%3A%20%23000000%3B%20font-size%3A%2016pt%3B&amp;buttonAction=-110&amp;buttonDisabled=false&amp;buttonCursor=-1">
</object>
<button class="upload-but btn">Upload</button>

Для начала посмотрите в сторону Google Code Archive - Long-term storage for Google Code Project Hosting.
Потом в сторону того, чтобы кликнуть по кнопке, и далее AutoIt Scripting Language - AutoIt или http://www.sikuli.org.

Если не подходит, то создайте с помощью JavaScript элемент <input type="file"> и загрузите файл через него. Если всё правильно сделать, то файл уйдёт на сервер также, как он ушёл бы через Flash форму.

p. s.: По возможности оторвите руки вашим разработчикам, чтобы они перестали использовать Flash в пользу HTML5.

1 лайк

Мне бы код, как по предыдущей проблеме )

Чтобы написать код нужно иметь материал, с которым можно работать.
Официальная демка проекта http://demo.swfupload.org давно протухла.
Дай ссылку на реальную страницу с загрузчиком. Тяжело писать примеры вслепую.

ты до реальных проблем ещё не добрался, а уже готовый код клянчишь. Далеко так не уедешь

Если в двух словах, то из твоего первоначального кода видно, что flash-объект отправляет файл по адресу uploadURL=/advertiser/v2/uploadBanner.html.
Очень может быть, что сработает вариант создать на JavaScript форму вида

< form action="/advertiser/v2/uploadBanner.html" enctype="multipart/form-data" method="post">
  <input type="file" name="banner">
< /form>

Ну а далее, думаю, понятно?

Уедешь

Я не могу изменять контент сайта.
Так можно было попросить разрабов переписать все под HTML 5.0.
Есть абстрактный сайт, и необходимо автоматически загружать картинки.
Но на кнопку add file загрузки файла подвязан флэш.
В итоге вопрос: стандартный WebDriver 2.0 + Python могут решать эту проблему, если мы допишем какой-нибудь

from selenium import flash

или тут ответ строго нет?

Не нужно менять код на сервере.
Его нужно изменить на клиенте в скрипте тестирования.

Давай рассмотрим небольшой пример формы загрузки файла.

< style>
	.upload{visibility: hidden}
< /style>
< a href="#" onclick="file.click()">upload file</a>
< input type="file" id="file" class="upload">

Как видно из кода выше у нас есть поле загрузки файла и ссылка, которая это поле будет активировать.
Так часто делают, когда хотят скрыть стандартную для браузера форму.

Safari
Chrome
IE
Opera

Так вот, Selenium не сможет самостоятельно кликнуть по <input>, т. к. поля фактически нет на странице.
А кликнув по <a> Selenium ничего сделать дальше не сможет.

В таком случае необходимо избавить от стилей поля <input> и работать с ним напрямую.

driver.execute_script("file.removeAttribute('class')")

Смысл понятен?
Мы временно, на стороне клиента, немного модифицируем html/css код для унификации его для Selenium.

Вот и тебе нужно создать поле <input> (как это сделать я давал ссылку выше).
Заполнить его и засабмитить форму.

@joemast @polusok ребята, что думаете, стоит ли написать отдельную статью по нестандартным элементам и о способах работы с ними в Selenium?
Часто бывает, что по тем или иным элементам нельзя кликнуть по разным причинам (z-index, visibility: hidden, position и т. д.).

@terpyakov я правда хочу помочь тебе в решении твоей задачи, но помоги и ты мне.

  1. Я тебя просил подготовить тестовую публичную страницу с flash-формой загрузки файла, чтобы мы могли на ней поэкспериментировать и найти решение.
  2. Я предложил тебе одно из возможных решений. Ты его попробовал? Получилось?
2 лайка

А зачем создавать форму, если можно просто POST’ом попробовать отправить файл.

2 лайка

Вы мне очень помогли с предыдущей проблемой по айфрэймам )
Но тут я понимаю только в общих чертах - надо на стороне клиента подредактировать код страницы, а потом только запустить тест на Python + WebDriver, но практически не очень ясно как это реализовать.
Вы спрашивали про сайт, вот он, путь до кнопки Dropbox - Error

да, я думаю, было бы хорошо оформить пост, многие с флешом в загрузке файлов сталкиваются и не знаю что делать.

статься про то как достучаться к труднодоступным элементам - нужна и даже очень,было бы круто разобраться!
много раз сталкивалась с тем что не Selenium не может кликнуть по какому-то элементу. приходилось шаманить… но узнать еще способы как решить эту проблему очень хочется. заранее спасибо

@TIT как видишь потребность есть :smile:

вроде все забили?
проблема не решена :smile:

Все пишут тебе готовый код, как ты любишь. Потерпи.

Ты сам пробовал решить проблему? Что пробовал, какие результаты?

Пробовал через готовое апи =) предоставляемое на сайте для разработчиков, свои проблемы есть.
Нельзя сказать что во всех аспектах WebDriver vs API => win API.