Что нового

[Окна, Диалоги] Как получить полный контроль над диалогом SaveAs в IE8

avmir

Новичок
Сообщения
28
Репутация
1
Встала такая задача:
Имеется список URL, нужно сохранить страницы соответствующие URL-ам как веб-архивы (MHT).

Так как через использованием CDO веб страница сохраняется неполностью (вместо картинок и стилей - ссылки), было решено использовать для этих целей AutoIt и IE8.
При сохранении через IE, веб-архив сохраняется полностью.

Допустим:
1. Можно передать URL в качестве параметра скрипту на AutoIt.
2. Скрипт открывает URL в скрытом окне IE
3. Скрипт сохраняет веб-архив
4. Скрипт закрывает окно (или возвращает HWND для повторного использования)

Подскажите, как можно при помощи скрипта в диалоговом окне "Сохранить как...":
1. Установить путь к папке по умолчанию (допустим, этот путь может передаваться в скрипт в качестве второго параметра)
2. Выбрать тип файла в комбобоксе диалогового окна.

И как все это можно проделать в скрытом окне?


Код:
#include <IE.au3>
Opt("WinTitleMatchMode", 2)
_IECreate ("http://www.yandex.ru", 0, 1, 1, 1)

$win_handle = WinGetHandle("Windows Internet Explorer", "Яндекс")
_SetKeyboardLayout($win_handle, "00000419")

Send("{ALTDOWN}{ALTUP}")
Send("ф")
Send("х")

$sSaveAsWindow = "Сохранение веб-страницы"
WinWait($sSaveAsWindow,"")
If Not WinActive($sSaveAsWindow,"") Then WinActivate($sSaveAsWindow,"")
WinWaitActive($sSaveAsWindow,"")

ControlSetText ($sSaveAsWindow, "", "Edit1", "Test")

ControlClick ($sSaveAsWindow, "", "Button2")


; переключение раскладки клавиатуры
Func _SetKeyboardLayout($hWnd, $sLayoutID)
    Local $ret = DllCall("user32.dll", "long", "LoadKeyboardLayout", "str", $sLayoutID, "int", 0)
    DllCall("user32.dll", "int", "SendMessage", "hwnd", $hWnd, "int", 0x50, "int", 1, "int", $ret[0])
EndFunc


P.S. IE8 - русский
 
Автор
A

avmir

Новичок
Сообщения
28
Репутация
1
Подскажите, как можно при помощи скрипта в диалоговом окне "Сохранить как...":
1. Установить путь к папке по умолчанию
На первый свой вопрос я нашел ответ.

Достаточно указать вместо имени файла абсолютный путь к рабочей папке и нажать кнопку "Сохранить"


Код:
ControlSetText ($sSaveAsWindow, "", "Edit1", "C:\Temp\")
ControlClick ($sSaveAsWindow, "", "Button2")

ControlSetText ($sSaveAsWindow, "", "Edit1", "Test")
ControlClick ($sSaveAsWindow, "", "Button2")
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Ответ на второй вопрос.

Код:
#Include <GUIComboBox.au3>

_GUICtrlComboBox_SetCurSel(ControlGetHandle('Save Webpage', '', 'ComboBox3'), 1)



Добавлено:
Сообщение автоматически объединено:

В скрытом окне все тоже самое, но как ты собираешься вызвать диалог Save Webpage в скрытом режиме?
 
Автор
A

avmir

Новичок
Сообщения
28
Репутация
1
Если нельзя скрыть, нельзя ли, как то вынести эти окна за пределы экрана?


Добавлено:
Сообщение автоматически объединено:

P.S. Как Вам удалось узнать, что это 'ComboBox3'? Поделитесь опытом пожалуйста.
Я пытался через AutoIt Window Info получить имя контрола - ничего не получилось...


Добавлено:
Сообщение автоматически объединено:

Скрипт работает, сохраняет (если не было файла с таким именем).
Как теперь
1. Автоматизировать замену файла, если он уже существует
2. Дождаться завершения сохранения файла, чтобы закрыть окно IE (вместо ненадежного sleep)

Код:
#Include <GUIComboBox.au3>
#include <IE.au3>
#Include <WinAPIEx.au3>

Opt("WinTitleMatchMode", 2)

$oIE = _IECreate ("http://www.yandex.ru", 0, 1, 1, 1) ; "http://www.yandex.ru" - первый параметр 'URL'

$win_handle = WinGetHandle("Windows Internet Explorer", "Яндекс")
_WinAPI_SetKeyboardLayout($win_handle, 0x0419)


Send("{ALTDOWN}{ALTUP}")
Send("ф")
Send("х")

$sSaveAsWindow = "Сохранение веб-страницы"
WinWait($sSaveAsWindow,"")
If Not WinActive($sSaveAsWindow,"") Then WinActivate($sSaveAsWindow,"")
WinWaitActive($sSaveAsWindow,"")

ControlSetText ($sSaveAsWindow, "", "Edit1", "H:\Обучение\AutoIt\") ; "H:\Обучение\AutoIt\" - второй параметр 'рабочая папка'
ControlClick ($sSaveAsWindow, "", "Button2")
_GUICtrlComboBox_SetCurSel(ControlGetHandle($sSaveAsWindow, '', 'ComboBox3'), 1)
ControlSetText ($sSaveAsWindow, "", "Edit1", "test") ; "test" - третий параметр 'имя файла'
ControlClick ($sSaveAsWindow, "", "Button2")


Sleep(15000)


WinClose($win_handle)


Кроме того, интересует следующее.
Скрипт я буду запускать из программы на C#, передавая ему параметры ('URL', 'рабочая папка', 'имя файла' ).
Как можно приостановить выполнение программы на время исполнения скрипта?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
avmir сказал(а):
Я пытался через AutoIt Window Info получить имя контрола - ничего не получилось...
:-\

Через него самого.

avmir сказал(а):
Если нельзя скрыть, нельзя ли, как то вынести эти окна за пределы экрана?
Нет, скрыть то можно конечно, но я имел ввиду, что на короткое время окно все равно появится...

Код:
WinSetState('Save Webpage', '', @SW_HIDE)


avmir сказал(а):
Автоматизировать замену файла, если он уже существует
Код:
If FileExists('H:\Обучение\AutoIt\...') Then FileDelete('H:\Обучение\AutoIt\...')


avmir сказал(а):
Дождаться завершения сохранения файла, чтобы закрыть окно IE (вместо ненадежного sleep)
В цикле открывай файл без режима совместного использования ($iShare = 0) до тех пор, пока не сработает...

Код:
#Include <WinAPI.au3>

$sFile = 'test.txt'

$Timer = TimerInit()
While TimerDiff($Timer) < 5000
	$hFile = _WinAPI_CreateFile($sFile, 2, 2, 0)
	If $hFile Then
		_WinAPI_CloseHandle($hFile)
		ExitLoop
	EndIf
	Sleep(100)
WEnd

If Not $hFile Then
	; Ошибка
	ConsoleWrite('File not found or time out.' & @CR)
Else
	ConsoleWrite('OK' & @CR)
EndIf
 

amel27

Продвинутый
Сообщения
146
Репутация
55
avmir [?]
через использованием CDO веб страница сохраняется неполностью (вместо картинок и стилей - ссылки)
можно пример?.. а если через промежуточный HTML такой же результат?
 

Vlasssov

Осваивающий
Сообщения
428
Репутация
25
Мне тут посоветовали

http://autoit-script.ru/index.php?topic=1719.msg12438#msg12438

Чем автоматизировать диалог, может просто вызвать соответствующий метод для объекта?
 
Автор
A

avmir

Новичок
Сообщения
28
Репутация
1
Yashied сказал(а):
...
В цикле открывай файл без режима совместного использования ($iShare = 0) до тех пор, пока не сработает...
...
Я правильно понимаю, что и в прграмме вызывающей скрипт тоже нужно дождаться появления файла?
А можно как-то из скрипта передать программе хендл открытого скриптом окна IE (чтобы не открывать-закрывать IE 10000 раз)?

amel27

Вот пример скрипта подсказанного мне американцами

Код:
;EXAMPLE:
_INetGetMHT( "http://docs.phplivesupport.com/viewarticle.php?aid=76&pid=6&uid=1", @DesktopDir & "\IISandPHPonWin2K.MHT" )
Func _INetGetMHT( $url, $file )
    Local $msg = ObjCreate("CDO.Message")
    If @error Then Return False
    Local $ado = ObjCreate("ADODB.Stream")
    If @error Then Return False

    With $ado
        .Type = 2
        .Charset = "US-ASCII"
        .Open
    EndWith
    $msg.CreateMHTMLBody($url, 0)
    $msg.DataSource.SaveToObject($ado, "_Stream")
    FileDelete($file)
    $ado.SaveToFile($file, 1)
    $msg = ""
    $ado = ""
    Return True
EndFunc


Указанная в скрипте страница сохраняется на ура, мои же страницы (например: http://abook-club.ru/forum/index.php?showtopic=34175) остаются без стилей и картинок...
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
avmir [?]
А можно как-то из скрипта передать программе хендл открытого скриптом окна IE (чтобы не открывать-закрывать IE 10000 раз)?
Код:
Exit($hWnd)
 
Автор
A

avmir

Новичок
Сообщения
28
Репутация
1
Еще вопрос...
Крайне нестабильно работает код

Код:
Send("{ALTDOWN}{ALTUP}")
Send("ф")
Send("х")


Он как-будто бы "забывает нажать кнопки". Осбенно это хорошо заметно при циклическом запуске скипта и приходится вручную подправлять его работу :'(
Нельзя ли send поменять на что-либо другое?
 
Автор
A

avmir

Новичок
Сообщения
28
Репутация
1
Кстати и

Код:
ControlClick ($sSaveAsWindow, "", "Button2")


иногда не срабатывает...
Почему?
 
Автор
A

avmir

Новичок
Сообщения
28
Репутация
1
avmir сказал(а):
Еще вопрос...
Крайне нестабильно работает код

Код:
Send("{ALTDOWN}{ALTUP}")
Send("ф")
Send("х")


Он как-будто бы "забывает нажать кнопки". Осбенно это хорошо заметно при циклическом запуске скипта и приходится вручную подправлять его работу :'(
Нельзя ли send поменять на что-либо другое?
Решил сам - добавил проверку (в цикле) появления окна диалога сохранения. Хотя конечно не понятно почему окно не получает иногда сообщений. :scratch:

Код:
Do
	Send("{ALTDOWN}{ALTUP}")
	Send("ф")
	Send("х")
Until WinExists($sSaveAsWindow, "")


Остается нерешенным вопрос по-поводу редкого несрабатывания нажатия на кнопку "Сохранить"

Код:
ControlClick ($sSaveAsWindow, "", "Button2")
 
Верх