Что нового

Как загрузить файл через выпадающее окно

eropov

Jury
Сообщения
195
Репутация
25
Скажите, как загрузить файл через выпадающее окно в IE.
Есть сайт(https://target.mail.ru/ads/create/)при нажатии на кнопку загрузить появляется выпадающее окно для выбора картинки.
Вот так нажимаю на кнопку, появляется окно
Код:
#include <IE.au3>
$oIE = _IECreate("https://target.mail.ru/ads/create/", 1, 1, 1)
_Button($oIE, 'image_file')

Func _Button($oIE, $sOID)
	$oSubt = _IEGetObjByName($oIE, $sOID)
	If Not @error And IsObj($oSubt) = 1 Then
		$acn = _IEAction($oSubt, "click")
		If Not @error And $acn = 1 Then
			Return "good"
		Else
			Return -2
		EndIf
	Else
		Return -1
	EndIf
EndFunc   ;==>_Button
А что делать дальше не знаю. Пробовал так, не получается
Код:
While 1
$hWin = WinGetHandle('[Title:Выбор файла для выгрузки; Class:#32770]')
	If $hWin Then
	ControlSetText($hWin, '', '[CLASS:Edit; INSTANCE:1]', 'сюда хотел вписать путь к файлу' )
	Sleep(500)
	ControlClick($hWin, '', '[CLASS:Button; INSTANCE:2]')
	Sleep(500)
	EndIf
WEnd

Уже второй подобный вопрос возникает, как работать в выпадающими окнами?

Да и еще странная особенность. После нажатия на кнопку, скрипт Autoit зависает на вызванной функции нажатия на кнопку, хотя нажатие явно уже произошло, т.к. появляется окно для выбора файла. Что делать не знаю?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
eropov
Я вам *click* ответил на все ваши "как". :smile:
 
Автор
E

eropov

Jury
Сообщения
195
Репутация
25
Garrett
Я вам *click* ответил на все ваши "как".
Если бы я все понял, разве начал бы задавать те же вопросы? :shok:
Если это возможно, будите так любезны, напишите пример, так нагляднее и понятнее.
 
Автор
E

eropov

Jury
Сообщения
195
Репутация
25
Garrett
Я с JS дел не имел и не знаю как с ним работать 8(
Прочитал тему раз 10, если не больше и не понял как я могу применить это к своей задаче.
И на сайте нет html кода с тегом onclick, есть только:
Код:
<div style="display: block; overflow: hidden; margin: 0px; padding: 0px; opacity: 0; direction: ltr; z-index: 99; position: absolute; left: 494px; top: 448px; width: 83px; height: 22px; visibility: visible; ">
<input type="file" name="image_file" style="position: absolute; right: 0px; margin: 0px; padding: 0px; font-size: 480px; font-family: sans-serif; cursor: pointer; "></div>
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
eropov [?]
У вас во всех темах мелькает один и тот же адрес, который вы зачем-то удалили из второй темы "Как определить, выбран ли элемент формы CheckBox".

eropov [?]
Вы где такое нашли?
Так вот, именно на этом сайте я нашёл HTML код формы для вашего вопроса в теме Как определить, выбран ли элемент формы CheckBox

Что касаемо окна "Выбор файла".
eropov [?]
Я с JS дел не имел и не знаю как с ним работать


Код:
#include <IE.au3>
$oIE = _IECreate("https://target.mail.ru/ads/create/")
_Button($oIE, 'image_file')

Func _Button(ByRef $_Obj, $s_Name)
	Sleep(250)
	$_Obj.document.parentWindow.execScript("setTimeout(function(){document."& $s_Name &"[0].click()},1)")
	Sleep(250)
	Send("C:\Путь к файлу\my_file.jpg")
	Send('{enter}')
EndFunc   ;==>_Button
 
Автор
E

eropov

Jury
Сообщения
195
Репутация
25
Garrett
У вас во всех темах мелькает один и тот же адрес, который вы зачем-то удалили из второй темы
Вернул адрес обратно.
Garrett
Так вот, именно на этом сайте я нашёл HTML код формы для вашего вопроса
Я искал те теги что вы нашли по моей теме, но так ни чего похожего не нашел. Даже не знаю почему так.
Garrett
Скажите этот код, что вы привели в качестве примера, он у вас работает? Потому что у меня нет. Я заметил еще одну странность, запускаю код который нажимает на кнопку "Загрузить"
Код:
#include <IE.au3>

$oIE = _IECreate("https://target.mail.ru/ads/create/", 1, 1, 1)

_Button($oIE, 'image_file')

Func _Button($oIE, $sOID)
	$oSubt = _IEGetObjByName($oIE, $sOID)
	$oSubt.Click()
EndFunc   ;==>_Button
Появляется окно для выбора картинки, но код в редакторе еще работает. Работает вечно, как в бесконечном цикле, хотя в моем понимании этот код должен был просто отработать и закончится, конца не было, пришлось отключать в ручную. Вы сталкивались с таким?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
eropov [?]
Скажите этот код, что вы привели в качестве примера, он у вас работает?
Да.

Я заметил еще одну странность
Это не странность, это так и должно быть.
Когда вы (при помощи кода выше - Ответ #6) нажали на кнопку "выбор файла", то ваш скрипт ждёт, когда вы выберете файл и нажмёте кнопку "ОК". В этот момент скрипт приостанавливается.
Чтобы это обойти, я вам привёл пример. Если он у вас не сработал, значит, вы что-то делаете не так.
Возьмите вот отсюда функцию и проанализируйте страницу, на которой находится кнопка (используйте первый пример).
Далее посмотрите, какой индекс у кнопки с именем image_file и подставьте этот индекс вместо знака вопроса после $s_Name:
Код:
#include <IE.au3>
$oIE = _IECreate("https://target.mail.ru/ads/create/")
_Button($oIE, 'image_file')

Func _Button(ByRef $_Obj, $s_Name)
    Sleep(250)
    $_Obj.document.parentWindow.execScript("setTimeout(function(){document."& $s_Name &"[?].click()},1)")
    Sleep(250)
    Send("C:\Путь к файлу\my_file.jpg")
    Send('{enter}')
EndFunc   ;==>_Button

Проверьте, будет работать.
 
Автор
E

eropov

Jury
Сообщения
195
Репутация
25
Garrett
Это не странность, это так и должно быть.
Вы меня не правильно поняли. Сейчас опишу мою ситуацию. Использовал ваш код по разному.
Код работает, но видимо я его не правильно использую. Как я понял длинная строчка кода в вашем примере обращается с уже открытому, дочернему окну IE.

1)Работает в том случае если запустить код, скрипт перехватывает окно IE, после я нажимаю на кнопку загрузить, код скрипта перехватывает дочернее окно и
вводит путь к картинке, после нажимает на кнопку и дочернее окно закрывается. Картинка загрузилась и все хорошо.

2) Еще запускал код после нажатия на кнопку загрузить, тогда код перехватывает само окно IE, а дочернее нет, но если перехватить окно функцией WinActivate,
тогда все тоже срабатывает на Ура!

3)Как вы поняли, из выше описанного следует, что я нажимаю кнопку 'Загрузить' мышью вручную. Если нажимать кнопку программно как в примере (Ответ #7) или как то по другому, с обращением к COM элементу IE, начинаются проблемы.

Проблема обстоит в следующем (Ответ #7). Если запустить код нажатия на кнопку, то окно открывается (раз оно открывается, значит код отработал),
раз код отработал значит мы должны увидеть в редакторе кода строчку(>Exit code: 0 Time: 4.398), которая говорит нам о том, что скрипт отработал,
однако данной строчки не появляется т.к. мы все еще находимся на предыдущей(>Running:(3.3.8.1):C:\Program Files\AutoIt3\autoit3.exe "C:\Documents and Settings\User\Рабочий стол\target.mail.ru\target.mail.ru.au3") это происходит(вечно, как в бесконечном цикле), а зависаем мы на строчке
Код:
$oSubt.Click()

Я думаю что это окно - поток, если это окно закрыть, то тогда мы выходим из точки зависания.
Пробовал использовать вашу функцию для определения параметров кнопки, функция не нашла ни одной формы, соответственно и параметры кнопки. В вышеописанном я не сказал что, использовал индекс('image_file'), а не ('image_file0). Если посмотреть исходник html через google chrome, то html код кнопки следующий:
Код:
<div style="display: block; overflow: hidden; margin: 0px; padding: 0px; opacity: 0; direction: ltr; z-index: 99; position: absolute; left: 494px; top: 463px; width: 83px; height: 22px; visibility: visible; ">
<input type="file" name="image_file" style="position: absolute; right: 0px; margin: 0px; padding: 0px; font-size: 480px; font-family: sans-serif; cursor: pointer; "></div>
Если ваш код использовать в том виде, что он предоставлен, т.е. без предварительного нажатия на кнопку загрузить, то тогда в левом нижнем углу окна IE говорит 'Ошибка на странице'. Нажав на сообщение, просматриваю что там есть, а написано там следующее:
Код:
Сведения об ошибке на веб-странице

Агент пользователя: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; MRSPUTNIK 2, 4, 0, 508; MRA 5.10 (build 5310); .NET CLR 1.1.4322; InfoPath.3; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E; WebMoney Advisor; AskTbPTV2/5.9.1.14019)
штамп времени: Sat, 9 Jun 2012 02:34:01 UTC


Сообщение: 'document.image_file' -  есть null или не является объектом
Строка: 1
Символ: 23
Код: 0
URI-код: https://target.mail.ru/ads/create/
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
eropov
- какой у вас IE 7,8,9?
- на странице в IE правой кнопкой "Просмотр HTML - кода" выделите код и сохраните в файл. Прикрепите его к теме.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Попробуйте так:
Код:
_Button($oIE, 'input')

Func _Button(ByRef $_Obj, $s_TagName)
	Sleep(250)
	$_Obj.document.parentWindow.execScript("setTimeout(function(){document.getElementsByTagName('"& $s_TagName &"')[125].click()},1)") ; или 124-й индекс (картинка)
	Sleep(250)
	Send("C:\Путь к файлу\my_file.jpg")
	Send('{enter}')
EndFunc   ;==>_Button
 
Автор
E

eropov

Jury
Сообщения
195
Репутация
25
Garrett
Не помогает, что делать не знаю.
Есть еще пример метода getElementsByClassName() на JS (http://javascript.ru/forum/showthread.php?p=180509#post180509)
Скажите вы пробовали запускать код у себя? Если да, то обращали ли вы на то, что код отрабатывает, но в правой колонке картинка не появляется. Хотя код и отработал, но картинка не закачалась на сайт.(Это у меня так в IE8).

Проблема при нажатии состоит в следующем, если нажать на кнопку до того как наведешь на кнопку курсор мыши, скрипт даже не найдет нужного тега, а если предварительно навести курсор, то все работает. Может там стоит какой то обработчик событий который улавливает наведение мыши? Как это решить?
 
Верх