Загрузка изображения, реализация на Python


(Ivan.boltenko) #1

Есть кнопка загружающая изображение 

http://pumpshooter.com/NC0mwZcP

пробовал вот так 

driver.find_element_by_class_name("qq-upload-button").send_keys("D:\\3.jpg") 

выдаёт ошибку 

WebDriverException: Message: u'focusElement execution failed;\n Failed to send keys because cannot focus element' 


Диалог выбора и загрузки файла (WebDriver)
(Mykhailo Poliarush) #2

ну так надо на выполнять действие на input элементе, а не на div элементе

вот так вот попробуйте

driver.find_element_by_css_selector(".qq-upload-button input").send_keys("D:\\3.jpg") 


(Ivan.boltenko) #3

AttributeError: 'list' object has no attribute 'send_keys'


(Ivan.boltenko) #4

driver.find_element_by_xpath("//*[@id=\"main\"]/div[8]/div/div[1]/div[2]/div/div[2]/input")

<selenium.webdriver.remote.webelement.WebElement object at 0x02263C30> — находит успешно

send_keys добавил, вот так выдаёт

WebDriverException: Message: u'Element is not clickable at point (-798, 80)'


(Alexander Petrovich) #5

Миша перестарался, тут нужен "find_element...", а не elements


(Alexander Petrovich) #6

Попробуйте джава скриптом передать инпуту нужное значение
Но, кажется, у вас проблема, с которой я недавно сталкивался. Дайте код страницы, когда файл уже загружен.


(Ivan.boltenko) #7

Код страницы после загрузки — http://pumpshooter.com/nPEARIBf  (удобный формат, или в тексте лучше?)


(Mykhailo Poliarush) #8

согласен, исправил


(Mykhailo Poliarush) #9

тут надо попробовать, не факт, что у upload стандартными средствами для этой сраницы сработает

а есть страница в публичном виде?


(Alexander Petrovich) #10

Покажите содержимое <ul class="qq-ipload-list"></ul>

Ну а вцелом, я делал очень грязный хак (отмечу, что у меня не было цели провериь загрузку файла, была цель проверить работу формы):
   1. Определял инпут, в котором лежит значение файла на сервере (у вас аяксовый загрузчик, я подозреваю)
   2. Джава-скриптом прикручивал к форме инпут со значением файла, который уже лежит где-то на сервере.
форма работала


(Ivan.boltenko) #11

к сожалению это админка

Кстати, при записи selenium IDE работало нараз, переводил в формат питона, ошибка

IDE использовала id=bigPromoImage

http://pumpshooter.com/481K9P3N

 


(Ivan.boltenko) #12

http://pumpshooter.com/pjc1bdXV

По остальному тому что вы написали, знаний и возможности выполнить подобное нет


(Alexander Petrovich) #13

Завтра опишу в деталях


(Alexander Petrovich) #14

Как и обещал, отписываюсь. Для своего прожекта я запилил такой common метод:

def upload_image(driver, form_DOM_id, input_name, image_id):

    driver.execute_script('''var form=document.getElementById("%(form_DOM_id)s"); 

        var input=document.createElement("input");
        input.value="%(image_id)s";
        input.name="%(input_name)s";
        form.appendChild(input);''' % {'form_DOM_id': form_DOM_id, 'image_id': image_id, 'input_name': input_name}) 
 
Смысл в следующем. После загрузки файла через форму, где-то в ней появляется инпут.
  • В моём случае есть форма var form=document.getElementById("%(form_DOM_id)s"). Вам придётся определить её самостоятельно, потому что всего код не вижу.
  • В ней появляется (по сути не важно на какой глубине) инпут. В моём проекте в нём есть два важных атрибута - name и value. У вас, на сколько я вижу, это: input с id="bigPromoImage", name="bigPromoImage", value="blah/blah/blah/3.jpg"

Попробуйте применить мою функцию. Только возможно придётся заменить ''var form=document.getElementById("%(form_DOM_id)s", если в вашем случае невозможно определить форму по айдишнику. В input_name передайте "bigPromoImage", а в image_id - что-то вида blah/blah/blah/3.jpg. Найдите картинку, УЖЕ загруженную на ваш сервер, и заберите нужное значение. Должно работать.

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

 


(Mykhailo Poliarush) #15

ну потому, что это скрытое поле (как видите у родителя display:none, а самое поле hidden)

с ним вебдрайвер не умеет работать

его нужно сначала перевести в состояние, когда элемент показывается

это специфика работы с webdriver


(Mykhailo Poliarush) #16

да это может работать, только это в конкретных ситуациях

может быть для указаной проблемы и подойдет

просто для остальных, этот вариант работает не всегда и не везде


(Mykhailo Poliarush) #17

просто если была бы публично доступный сайт можно было бы написать вам конкретный код который работает

может вы найдете в интернете аналоги загрузчика файлов, точто такой же как у вас

тогда можно будет написать конкретный код


(Ivan.boltenko) #18

буду пробовать если что получится, отпишу.


(Ivan.boltenko) #19

если найду похожий загрузчик отпишу


(Alexander Petrovich) #20

Отпишите двже если не получится. Поможем :)