Что нового

Переход по ссылКАМ и загрузка файла

cr3sh

Новичок
Сообщения
10
Репутация
0
Добрый день! Спасибо за форум, очень помогли многие темы в решении некоторых задач, кое как написал скрипт, вроде и работает на примере только одной ссылки, но никак не могу сделать что бы скрипт поочередно переходил по ссылкам, которые я бы прописал и сохранял файлы по каждой ссылке с определенным именем.
Вот мой скрипт:
На сколько я понимаю его главный недостаток что он не завершается. Т.е. он сохранит файл с заданным именем, но потом как только он увидит еще одно окно Загрузка файла - тут же подхватывает и опять его сохраняет.

Код:
#include <IE.au3>
$oIE = _IECreate ("http://olololololo.ru/loloolo")
$oForm = _IEFormGetCollection($oIE,0)
$oLogin = _IEFormElementGetObjByName($oForm,"plannedPlacementDate","0")
$oPass = _IEFormElementGetObjByName($oForm,"plannedPlacementDate","1")
_IEFormElementSetValue($oLogin,"01.01.2001")
_IEFormElementSetValue($oPass,"31.12.2012")
_IEFormElementCheckboxSelect ($oForm, 0, "hasOffer", 1, "byIndex")
Sleep(100)
_IEFormElementCheckboxSelect ($oForm, 0, "hasContract", 1, "byIndex")
Sleep(100)
$sSubmit = _IEGetObjByName($oForm, "commit")
_IEAction($sSubmit, "click")
While 1
    Select 
	   Case WinExists  ("Загрузка файла", "Со&хранить") And  WinActive ("Загрузка файла", "Со&хранить")
            ControlClick  ("Загрузка файла", "Со&хранить", "[CLASS:Button; INSTANCE:2]")
		 Case  WinExists ("Сохранить как","Со&хранить") And   WinActive ("Сохранить как","Со&хранить")
			ControlSetText ("Сохранить как", "", "[CLASS:Edit; INSTANCE:1]", "56000.xml")
            ControlClick ("Сохранить как", "Со&хранить", "[CLASS:Button; INSTANCE:2]")
        Case  WinExists ("Сохранить как", "&Да") And  WinActive ("Сохранить как", "&Да")
            ;~ если файл уже существует, то он переписывается
            ControlClick ("Сохранить как", "&Да", "[CLASS:Button; INSTANCE:1]")
        Case  WinExists ("Загрузка завершена.") And  WinActive ("Загрузка завершена.")
            ControlClick ("Загрузка завершена.", "", "[CLASS:Button; INSTANCE:4]")
            Exit 
    EndSelect 
WEnd


Такие пироги, вообщем по ссылке olololo он у меня заполняет форму жмет кнопку отправить, получает окно Загрузки файла и сохраняет его с именем 56000, хотелось бы что бы он затем переходил по ссылке ololololo2 делал тоже самое и сохранял файл с именем 56001, допустим
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Первый вариант берет данные из файла url.txt (каждая ссылка в новой строке), а второй (закомментированный) из ссылок, перечисленных в массиве.
Чтобы не создавать окно каждый раз, добавил флаг для перехода по ссылке в старом окне, но возможно это не поможет, тогда надо добавить _IEQuit перед ExitLoop.
Код:
#include <IE.au3>
$iCounter = 56000

$aUrl = StringSplit(StringStripCR(FileRead(@ScriptDir & '\url.txt')), @LF)
For $i = 1 To $aUrl[0]
	_go_to_url($aUrl[$i], $iCounter)
	$iCounter += 1
Next

;~ Dim $aUrl[3] = ['http://1.com', 'http://12.com', 'http://123.com']
;~ For $i = 0 To UBound($aUrl) - 1
;~ 	_go_to_url($aUrl[$i], $iCounter)
;~ 	$iCounter += 1
;~ Next

Func _go_to_url($sUrl, $iName)
	$oIE = _IECreate ($sUrl, 1) ;не создавать новое окно, а попытаться сделать все в уже созданном
	$oForm = _IEFormGetCollection($oIE,0)
	$oLogin = _IEFormElementGetObjByName($oForm,"plannedPlacementDate","0")
	$oPass = _IEFormElementGetObjByName($oForm,"plannedPlacementDate","1")
	_IEFormElementSetValue($oLogin,"01.01.2001")
	_IEFormElementSetValue($oPass,"31.12.2012")
	_IEFormElementCheckboxSelect ($oForm, 0, "hasOffer", 1, "byIndex")
	Sleep(100)
	_IEFormElementCheckboxSelect ($oForm, 0, "hasContract", 1, "byIndex")
	Sleep(100)
	$sSubmit = _IEGetObjByName($oForm, "commit")
	_IEAction($sSubmit, "click")
	While 1
		Select
		   Case WinExists  ("Загрузка файла", "Со&хранить") And  WinActive ("Загрузка файла", "Со&хранить")
				ControlClick  ("Загрузка файла", "Со&хранить", "[CLASS:Button; INSTANCE:2]")
			 Case  WinExists ("Сохранить как","Со&хранить") And   WinActive ("Сохранить как","Со&хранить")
				ControlSetText ("Сохранить как", "", "[CLASS:Edit; INSTANCE:1]", $iName & ".xml")
				ControlClick ("Сохранить как", "Со&хранить", "[CLASS:Button; INSTANCE:2]")
			Case  WinExists ("Сохранить как", "&Да") And  WinActive ("Сохранить как", "&Да")
				;~ если файл уже существует, то он переписывается
				ControlClick ("Сохранить как", "&Да", "[CLASS:Button; INSTANCE:1]")
			Case  WinExists ("Загрузка завершена.") And  WinActive ("Загрузка завершена.")
				ControlClick ("Загрузка завершена.", "", "[CLASS:Button; INSTANCE:4]")
;~ 				_IEQuit($oIE); раскомментировать, если attach в IECreate не срабатывает
				ExitLoop
		EndSelect
	WEnd
EndFunc
 
Автор
C

cr3sh

Новичок
Сообщения
10
Репутация
0
Использовал тот вариант что умолчанию, когда ссылки берет из txt файла - открывает окно, все заполняет, скачивает, присваивает имя 56000 и все, дальше ничего не происходит
_IEQuit($oIE); раскомментировал, но ничего не изменилось
Я не полностью обьяснил: Перед тем как запускать скрипт , я открываю окно - захожу под своим логином и сворачиваю его, так как если я закрою окно - придется заново заходить
поэтому ieQuit не подошел бы, пришлось каждыц раз еще логин в скрипте прописывать..


я бы вторым вариантом воспользовался, но.. у меня 198 ссылок по которым надо скачать.. вот в чем вся сложность, мне в txt файл их конечно проще прописать.

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

--> IE.au3 V2.4-0 Warning from function _IEAttach, $_IEStatus_NoMatch
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Да я тоже ошибся, т.к. давно с IE не работал, Attach используется очень редко, а вам больше подойдет Navigate.
Запускаете IE, вводите пароли где нужно и сворачиваете окно, в скрипте нужно в $sStartUrl внести ссылку свернутого окна.
По поводу счетчика номеров, думаю можно решить, если знать где взять этот номер или как его можно вычислить :smile: , излагайте попробую решить.
Код:
#include <IE.au3>
$iCounter = 5600
$sStartUrl = 'http://123.com'
$oIE = _IEAttach($sStartUrl, 'url')
$aUrl = StringSplit(StringStripCR(FileRead(@ScriptDir & '\url.txt')), @LF)
For $i = 1 To $aUrl[0]
    _go_to_url($aUrl[$i], $iCounter)
    $iCounter += 1
Next

Func _go_to_url($sUrl, $iName)
    _IENavigate($oIE, $sUrl)
    $oForm = _IEFormGetCollection($oIE,0)
    $oLogin = _IEFormElementGetObjByName($oForm,"plannedPlacementDate","0")
    $oPass = _IEFormElementGetObjByName($oForm,"plannedPlacementDate","1")
    _IEFormElementSetValue($oLogin,"01.01.2001")
    _IEFormElementSetValue($oPass,"31.12.2012")
    _IEFormElementCheckboxSelect ($oForm, 0, "hasOffer", 1, "byIndex")
    Sleep(100)
    _IEFormElementCheckboxSelect ($oForm, 0, "hasContract", 1, "byIndex")
    Sleep(100)
    $sSubmit = _IEGetObjByName($oForm, "commit")
    _IEAction($sSubmit, "click")
    While 1
        Select
           Case WinExists  ("Загрузка файла", "Со&хранить") And  WinActive ("Загрузка файла", "Со&хранить")
                ControlClick  ("Загрузка файла", "Со&хранить", "[CLASS:Button; INSTANCE:2]")
             Case  WinExists ("Сохранить как","Со&хранить") And   WinActive ("Сохранить как","Со&хранить")
                ControlSetText ("Сохранить как", "", "[CLASS:Edit; INSTANCE:1]", $iName & ".xml")
                ControlClick ("Сохранить как", "Со&хранить", "[CLASS:Button; INSTANCE:2]")
            Case  WinExists ("Сохранить как", "&Да") And  WinActive ("Сохранить как", "&Да")
                ;~ если файл уже существует, то он переписывается
                ControlClick ("Сохранить как", "&Да", "[CLASS:Button; INSTANCE:1]")
            Case  WinExists ("Загрузка завершена.") And  WinActive ("Загрузка завершена.")
                ControlClick ("Загрузка завершена.", "", "[CLASS:Button; INSTANCE:4]")
                ExitLoop
        EndSelect
    WEnd
EndFunc
 
Автор
C

cr3sh

Новичок
Сообщения
10
Репутация
0
Спасибо за быстрый ответ!
все сделал как вы сказали, ввел логин пароль, вошел, скопировал ссылку, вставил в $sStartUrl, свернул. Запускаю скрипт, а он ничего не открывая нового окна выдает
--> IE.au3 V2.4-0 Error from function _IEFormGetCollection, $_IEStatus_InvalidDataType
--> IE.au3 V2.4-0 Error from function _IEFormElementGetObjByName, $_IEStatus_InvalidDataType
--> IE.au3 V2.4-0 Error from function _IEFormElementGetObjByName, $_IEStatus_InvalidDataType
--> IE.au3 V2.4-0 Error from function _IEFormElementSetValue, $_IEStatus_InvalidDataType
--> IE.au3 V2.4-0 Error from function _IEFormElementSetValue, $_IEStatus_InvalidDataType
--> IE.au3 V2.4-0 Error from function _IEFormElementCheckboxSelect, $_IEStatus_InvalidDataType
--> IE.au3 V2.4-0 Error from function _IEFormElementCheckboxSelect, $_IEStatus_InvalidDataType
--> IE.au3 V2.4-0 Error from function _IEGetObjByName, $_IEStatus_InvalidDataType
--> IE.au3 V2.4-0 Error from function _IEAction, $_IEStatus_InvalidDataType

вообщем мол форму не нашел которую надо заполнять, а потом я смотрю в свернутое окно - там он на ссылку формы для заполнения перешел, но заполнять не стал :/

поставил Sleep(5000) перед $oForm = _IEFormGetCollection($oIE,0)
вроде как и переходит по ссылке из url.txt , прогрузилось все, а всеравно не заполняет :/


По поводу списка номеров - как угодно, я могу и в экселе сделать 2 столбца - один номер, другой ссылка, могу в html страничку сделать с таблицей. могу и в txt сделать отделив запятой номер от ссылки. Мне любой вариант побойдет, лишь бы работал =))

Пусть он бы и открывал новое окно под каждую ссылку, и закрывал его после загрузки. Главное не закрывал бы то, всернутое с логином:smile:
Спасибо вам!!
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Поспешил с ответом, поэтому и ошибки выдает.
Нужно
Код:
$oIE = _IENavigate($oIE, $sUrl)

заменить на
Код:
_IENavigate($oIE, $sUrl)


По номерам делайте текстовый файл формата:
[box title=url.txt]123.com;1234
321.ru;6579
111.org;download_me[/box]
В принципе название файла может быть любым, но в нем не должно быть пробелов.

Обновленный вариант скрипта:
Код:
#include <IE.au3>
$sStartUrl = 'localhost'
$oIE = _IECreate($sStartUrl, 1)
$aUrl = StringRegExp(FileRead(@ScriptDir & '\url.txt'), '(.+?);([^\s]+)', 3)

For $i = 0 To UBound($aUrl) - 2 Step 2
	_go_to_url($aUrl[$i], $aUrl[$i + 1])
Next

Func _go_to_url($sUrl, $sName)
	_IENavigate($oIE, $sUrl)
	$oForm = _IEFormGetCollection($oIE, 0)
	$oLogin = _IEFormElementGetObjByName($oForm, "plannedPlacementDate", "0")
	$oPass = _IEFormElementGetObjByName($oForm, "plannedPlacementDate", "1")
	_IEFormElementSetValue($oLogin, "01.01.2001")
	_IEFormElementSetValue($oPass, "31.12.2012")
	_IEFormElementCheckBoxSelect($oForm, 0, "hasOffer", 1, "byIndex")
	Sleep(100)
	_IEFormElementCheckBoxSelect($oForm, 0, "hasContract", 1, "byIndex")
	Sleep(100)
	$sSubmit = _IEGetObjByName($oForm, "commit")
	_IEAction($sSubmit, "click")
	While 1
		Select
			Case WinExists("Загрузка файла", "Со&хранить") And WinActive("Загрузка файла", "Со&хранить")
				ControlClick("Загрузка файла", "Со&хранить", "[CLASS:Button; INSTANCE:2]")
			Case WinExists("Сохранить как", "Со&хранить") And WinActive("Сохранить как", "Со&хранить")
				ControlSetText("Сохранить как", "", "[CLASS:Edit; INSTANCE:1]", $sName & ".xml")
				ControlClick("Сохранить как", "Со&хранить", "[CLASS:Button; INSTANCE:2]")
			Case WinExists("Сохранить как", "&Да") And WinActive("Сохранить как", "&Да")
				;~ если файл уже существует, то он переписывается
				ControlClick("Сохранить как", "&Да", "[CLASS:Button; INSTANCE:1]")
			Case WinExists("Загрузка завершена.") And WinActive("Загрузка завершена.")
				ControlClick("Загрузка завершена.", "", "[CLASS:Button; INSTANCE:4]")
				ExitLoop
		EndSelect
	WEnd
EndFunc   ;==>_go_to_url

Если стартовая ссылка постоянно меняется, а заголовок сайта (<title>заголовок</title>) содержит какой-то ключевой текст (по которому его можно идентифицировать), то можно _IECreate заменить на:
Код:
$oIE = _IEAttach($sTitle) ; $sTitle - часть текста из заголовка
 
Автор
C

cr3sh

Новичок
Сообщения
10
Репутация
0
Мне уже не удобно перед вами...
У меня ссылки очень длинные вида
activeComponent=Item.MainHolder.Reports.holder.events.newInstanceForm&view_uuid=corebofs000080000inv6lboo75fgr20&uuid=freprtcorebofs000080000inv6lboo75fgr20;pstfldfs000080000j8cie1u2p5bqft0
разделитель в виде ; не подойдет... пробывал заменить все на : но и в этом случае скрипт переходит на неправильный url - видимо подхватывает весь url с номером, не замечая разделителя
при старте скрипт выдается
--> IE.au3 V2.4-0 Warning from function _IEAttach, $_IEStatus_NoMatch
дальше т понтно уже стандартные ошибки что формы не нашел скрипт из-за того что url не правильный.
Как вы советовали заменить _IECreate на $oIE = _IEAttach($sTitle) я не пробывал, но что мне тогда прописывать? Заголовок страницы который появляется после того как я залогинился?
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Да без проблем, пусть разделителем будет запятая или что-то другое:
Код:
#include <IE.au3>
$sStartUrl = 'localhost' ; ссылка свернутого окна
$sSplitter = ',' ; разделитель
$oIE = _IECreate($sStartUrl, 1)
$aUrl = StringRegExp(FileRead(@ScriptDir & '\url.txt'), '(.+?)' & $sSplitter & '([^\s]+)', 3)

For $i = 0 To UBound($aUrl) - 2 Step 2
    _go_to_url($aUrl[$i], $aUrl[$i + 1])
Next

Func _go_to_url($sUrl, $sName)
    _IENavigate($oIE, $sUrl)
    $oForm = _IEFormGetCollection($oIE, 0)
    $oLogin = _IEFormElementGetObjByName($oForm, "plannedPlacementDate", "0")
    $oPass = _IEFormElementGetObjByName($oForm, "plannedPlacementDate", "1")
    _IEFormElementSetValue($oLogin, "01.01.2001")
    _IEFormElementSetValue($oPass, "31.12.2012")
    _IEFormElementCheckBoxSelect($oForm, 0, "hasOffer", 1, "byIndex")
    Sleep(100)
    _IEFormElementCheckBoxSelect($oForm, 0, "hasContract", 1, "byIndex")
    Sleep(100)
    $sSubmit = _IEGetObjByName($oForm, "commit")
    _IEAction($sSubmit, "click")
    While 1
        Select
            Case WinExists("Загрузка файла", "Со&хранить") And WinActive("Загрузка файла", "Со&хранить")
                ControlClick("Загрузка файла", "Со&хранить", "[CLASS:Button; INSTANCE:2]")
            Case WinExists("Сохранить как", "Со&хранить") And WinActive("Сохранить как", "Со&хранить")
                ControlSetText("Сохранить как", "", "[CLASS:Edit; INSTANCE:1]", $sName & ".xml")
                ControlClick("Сохранить как", "Со&хранить", "[CLASS:Button; INSTANCE:2]")
            Case WinExists("Сохранить как", "&Да") And WinActive("Сохранить как", "&Да")
                ;~ если файл уже существует, то он переписывается
                ControlClick("Сохранить как", "&Да", "[CLASS:Button; INSTANCE:1]")
            Case WinExists("Загрузка завершена.") And WinActive("Загрузка завершена.")
                ControlClick("Загрузка завершена.", "", "[CLASS:Button; INSTANCE:4]")
                ExitLoop
        EndSelect
    WEnd
EndFunc   ;==>_go_to_url

cr3sh [?]
Как вы советовали заменить _IECreate на $oIE = _IEAttach($sTitle) я не пробывал, но что мне тогда прописывать? Заголовок страницы который появляется после того как я залогинился?
Да заголовок сайта, после ввода логина, например, сейчас он "Переход по ссылКАМ и загрузка файла"
Но если стартовая ссылка всегда одна и та же, то можно ничего не менять.

Warning from function _IEAttach, $_IEStatus_NoMatch
Похоже не может найти свернутое окно, но попробуйте запустить скрипт с текущими исправлениями, а дальше если не будет работать, то надо будет однозначно уходить на _IEAttach
 
Автор
C

cr3sh

Новичок
Сообщения
10
Репутация
0
вроде бы уже ближе к истине:smile:
вставил url после логина, окно само свернул. Запустил скрипт, он окно развернул, в него вставил первую ссылку из списка, все заполнил, скачал с нужным именем файл, УРА УРА, но на следующую ссылку не переходит. Ничего не происходит:(

может другие не вставляет так как не находит то что я указал в $sStartUrl = 'localhost' ? потому что первая ссылка открылась поверх него


заменил IECreate на IEAttach - все тоже самое, разворачивает окно которое после логина (Одно хорошо что он как по ссылке, так и по title находит его) - вставляет в него линк и переходит по нему, заполняет форму, все норм скачивает, но к следующей ссылке не переходит


я так понимаю что к следующей ссылке он не переходит так как не находит ту ссылку или title которые были прописаны в StartUrl и IEAttach да?
получается что когда файл скачивается, браузер перекидывает на какую то другую страницу, пустую, где потом появляется загрузка файла. В этом вся проблема?
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
$sStartUrl используется только раз для поиска окна IE с конкретной ссылкой, дальше вся работа идет уже только в найденном окне.
А после нажатия кнопки в "Загрузка завершена" у вас точно ExitLoop стоит?
Вот версия с выводом работы скрипта в консоль:
Код:
#include <IE.au3>
$sStartUrl = 'localhost' ; ссылка свернутого окна
$sSplitter = ',' ; разделитель
$oIE = _IECreate($sStartUrl, 1)
$aUrl = StringRegExp(FileRead(@ScriptDir & '\url.txt'), '(.+?)' & $sSplitter & '([^\s]+)', 3)

For $i = 0 To UBound($aUrl) - 2 Step 2
    _go_to_url($aUrl[$i], $aUrl[$i + 1])
Next

Func _go_to_url($sUrl, $sName)
	ConsoleWrite('-start-' & @CRLF)
	ConsoleWrite('Ссылка:     ' & $sUrl & @CRLF)
	ConsoleWrite('Файл:       ' & $sName & @CRLF)
    _IENavigate($oIE, $sUrl)
	ConsoleWrite('!Переход по ссылке' & @CRLF)
    $oForm = _IEFormGetCollection($oIE, 0)
	ConsoleWrite('+Получена первая форма' & @CRLF)
    $oLogin = _IEFormElementGetObjByName($oForm, "plannedPlacementDate", "0")
	ConsoleWrite('+Получен элемент ввода логина' & @CRLF)
    $oPass = _IEFormElementGetObjByName($oForm, "plannedPlacementDate", "1")
	ConsoleWrite('+Получен элемент ввода пароля' & @CRLF)
    _IEFormElementSetValue($oLogin, "01.01.2001")
	ConsoleWrite('>Ввод логина' & @CRLF)
    _IEFormElementSetValue($oPass, "31.12.2012")
	ConsoleWrite('>Ввод пароля' & @CRLF)
    _IEFormElementCheckBoxSelect($oForm, 0, "hasOffer", 1, "byIndex")
	ConsoleWrite('>Отмечен первый чекбокс' & @CRLF)
    Sleep(100)
    _IEFormElementCheckBoxSelect($oForm, 0, "hasContract", 1, "byIndex")
	ConsoleWrite('>Отмечен второй чекбокс' & @CRLF)
    Sleep(100)
    $sSubmit = _IEGetObjByName($oForm, "commit")
	ConsoleWrite('+Получен элемент отправки формы' & @CRLF)
    _IEAction($sSubmit, "click")
	ConsoleWrite('>Отправка формы' & @CRLF)
    While 1
        Select
			Case WinExists("Загрузка файла", "Со&хранить") And WinActive("Загрузка файла", "Со&хранить")
				ConsoleWrite('!Сохранить файл' & @CRLF)
                ControlClick("Загрузка файла", "Со&хранить", "[CLASS:Button; INSTANCE:2]")
            Case WinExists("Сохранить как", "Со&хранить") And WinActive("Сохранить как", "Со&хранить")
                ControlSetText("Сохранить как", "", "[CLASS:Edit; INSTANCE:1]", $sName & ".xml")
				ConsoleWrite('!Сохранить файл как ' & $sName & @CRLF)
                ControlClick("Сохранить как", "Со&хранить", "[CLASS:Button; INSTANCE:2]")
            Case WinExists("Сохранить как", "&Да") And WinActive("Сохранить как", "&Да")
                ;~ если файл уже существует, то он переписывается
				ConsoleWrite('!Перезаписать файл' & @CRLF)
                ControlClick("Сохранить как", "&Да", "[CLASS:Button; INSTANCE:1]")
            Case WinExists("Загрузка завершена.") And WinActive("Загрузка завершена.")
				ConsoleWrite('!Загрузка завершена' & @CRLF)
                ControlClick("Загрузка завершена.", "", "[CLASS:Button; INSTANCE:4]")
				ConsoleWrite('!Выход из функции' & @CRLF)
                ExitLoop
        EndSelect
    WEnd
	ConsoleWrite('-finish-' & @CRLF)
EndFunc   ;==>_go_to_url

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

cr3sh

Новичок
Сообщения
10
Репутация
0
-start-
Ссылка: лялляялля?activeComponent=Item.MainHolder.Reports.holder.events.newInstanceForm&view_uuid=corebofs000080000inv5ur0t05661gk&uuid=freprtcorebofs000080000inv5ur0t05661gk;pstfldfs000080000j8cie1u2p5bqft0
Файл: 56000
!Переход по ссылке
+Получена первая форма
+Получен элемент ввода логина
+Получен элемент ввода пароля
>Ввод логина
>Ввод пароля
>Отмечен первый чекбокс
>Отмечен второй чекбокс
+Получен элемент отправки формы
>Отправка формы
!Сохранить файл
!Сохранить файл
!Сохранить файл
!Сохранить файл
!Сохранить файл
!Сохранить файл
!Сохранить файл
!Сохранить файл
!Сохранить файл
!Сохранить файл
!Сохранить файл
!Сохранить файл
!Сохранить файл
!Сохранить файл
!Сохранить файл
!Сохранить файл
!Сохранить файл
!Сохранить файл
!Сохранить файл
!Сохранить файл
!Сохранить файл
!Сохранить файл
!Сохранить файл
!Сохранить файл
!Сохранить файл
!Сохранить файл
!Сохранить файл
!Сохранить файл
!Сохранить файл
!Сохранить файл как 56000


Я олень, все сработало, после того как я убрал галку Закрывать окно после скачивания...
Спасибо ВАМ ОГРОМНОЕ за потраченное время!!!!!!


п.с. то что столько раз вылетает !Сохранить файл это ничего страшного?)
там таймаут нигде не надо проставлять?..
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
cr3sh [?]
то что столько раз вылетает !Сохранить файл это ничего страшного?
Что-то я и не рассматривал работу с диалогом сохранения файла до этого.
Вместо цикла ожидания лучше воспользоваться WinWaitActive
Тогда можно оптимизировать:
Код:
#include <IE.au3>
$sStartUrl = 'localhost' ; ссылка свернутого окна
$sSplitter = ',' ; разделитель
$oIE = _IECreate($sStartUrl, 1)
$aUrl = StringRegExp(FileRead(@ScriptDir & '\url.txt'), '(.+?)' & $sSplitter & '([^\s]+)', 3)

For $i = 0 To UBound($aUrl) - 2 Step 2
    _go_to_url($aUrl[$i], $aUrl[$i + 1])
Next

Func _go_to_url($sUrl, $sName)
    ConsoleWrite('-start-' & @CRLF)
    ConsoleWrite('Ссылка:     ' & $sUrl & @CRLF)
    ConsoleWrite('Файл:       ' & $sName & @CRLF)
    _IENavigate($oIE, $sUrl)
    ConsoleWrite('!Переход по ссылке' & @CRLF)
    $oForm = _IEFormGetCollection($oIE, 0)
    ConsoleWrite('+Получена первая форма' & @CRLF)
    $oLogin = _IEFormElementGetObjByName($oForm, "plannedPlacementDate", "0")
    ConsoleWrite('+Получен элемент ввода логина' & @CRLF)
    $oPass = _IEFormElementGetObjByName($oForm, "plannedPlacementDate", "1")
    ConsoleWrite('+Получен элемент ввода пароля' & @CRLF)
    _IEFormElementSetValue($oLogin, "01.01.2001")
    ConsoleWrite('>Ввод логина' & @CRLF)
    _IEFormElementSetValue($oPass, "31.12.2012")
    ConsoleWrite('>Ввод пароля' & @CRLF)
    _IEFormElementCheckBoxSelect($oForm, 0, "hasOffer", 1, "byIndex")
    ConsoleWrite('>Отмечен первый чекбокс' & @CRLF)
    Sleep(100)
    _IEFormElementCheckBoxSelect($oForm, 0, "hasContract", 1, "byIndex")
    ConsoleWrite('>Отмечен второй чекбокс' & @CRLF)
    Sleep(100)
    $sSubmit = _IEGetObjByName($oForm, "commit")
    ConsoleWrite('+Получен элемент отправки формы' & @CRLF)
    _IEAction($sSubmit, "click")
    ConsoleWrite('>Отправка формы' & @CRLF)
    WinWaitActive("Загрузка файла", "Со&хранить")
	ConsoleWrite('!Сохранить файл' & @CRLF)
	ControlClick("Загрузка файла", "Со&хранить", "[CLASS:Button; INSTANCE:2]")
	WinWaitActive("Сохранить как", "Со&хранить")
	ControlSetText("Сохранить как", "", "[CLASS:Edit; INSTANCE:1]", $sName & ".xml")
	ConsoleWrite('!Сохранить файл как ' & $sName & @CRLF)
	ControlClick("Сохранить как", "Со&хранить", "[CLASS:Button; INSTANCE:2]")
	If WinWaitActive("Сохранить как", "&Да", 2)  Then; 2 секунды ждем появления окна о перезаписи файла
		ConsoleWrite('!Перезаписать файл' & @CRLF)
		ControlClick("Сохранить как", "&Да", "[CLASS:Button; INSTANCE:1]")
	EndIf
	WinWaitActive("Загрузка завершена.")
	ConsoleWrite('!Загрузка завершена' & @CRLF)
	ControlClick("Загрузка завершена.", "", "[CLASS:Button; INSTANCE:4]")
	ConsoleWrite('!Выход из функции' & @CRLF)
    ConsoleWrite('-finish-' & @CRLF)
EndFunc   ;==>_go_to_url
 
Автор
C

cr3sh

Новичок
Сообщения
10
Репутация
0
я изначально когда скрипт слеплевал, где то на форуме видел вариант winwaitactivate но не срабатывает он, ни на одном из компьютеров
Просто кнопку сохранить выделяет, но не нажимает на нее, и все...
вот и сейчас попробывал ваш вариант - тоже самое :(

Ссылка: sdgheroigherhib?activeComponent=Item.MainHolder.Reports.holder.events.newInstanceForm&view_uuid=corebofs000080000inv5ur0t05661gk&uuid=freprtcorebofs000080000inv5ur0t05661gk;pstfldfs000080000j8cie1u2p5bqft0
Файл: 56000
!Переход по ссылке
+Получена первая форма
+Получен элемент ввода логина
+Получен элемент ввода пароля
>Ввод логина
>Ввод пароля
>Отмечен первый чекбокс
>Отмечен второй чекбокс
+Получен элемент отправки формы
>Отправка формы
!Сохранить файл

Win XP SP3, IE 8
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Выходит так: окно появляется, ControlClick происходит, но само окно этого нажатия "не ощущает" или окно залипает или еще что-то.
А цикл бомбит эту кнопку и она реагирует только на ~тридцатое нажатие :D
Можно добавить таймаут перед кликом и после, или пробовать жать кнопки через Send() - выбрать TAB-ом нужную кнопку и послать Enter.

А и забыл иногда помогает принудительная активация окна:
WinWait -> WinActivate -> ControlClick
или просто
WinWait -> ControlClick
 
Автор
C

cr3sh

Новичок
Сообщения
10
Репутация
0
попробую, спасибо большущее!!!:smile: главное что бы не забанили за такие частые обращения по url'ам =))
 
Верх