Сохранение страницы как MHT в IE9 (элемнты управления не изменяют свое значение)

Ответить
Аватара пользователя
avmir

Сохранение страницы как MHT в IE9 (элемнты управления не изменяют свое значение)

Сообщение avmir »

День добрый!



У меня есть программка, которая вызывает скрипт AutoIT и передает ему три параметра:

1. URL страницы,

2. Путь к рабочему каталогу, куда должны сохраняться страницы,

3. Имя файла под которым нужно сохранить страницу.



В результате скрипт сохранял нужную страницу в формате MHT в нужную папку с нужным именем.

Вот скрипт:





Код:

Код: Выделить всё

#Include <GUIComboBox.au3>
#include <IE.au3>
#Include <WinAPI.au3>
#Include <WinAPIEx.au3>
$sURL = $CmdLine[1]
$sWorkPaht = $CmdLine[2]
$sFileName = $CmdLine[3]
Opt("WinTitleMatchMode", 2)
$oIE = _IECreate ($sURL) ;, 0, 1, 1, 0) ; $sURL - первый параметр 'URL'
$win_handle = WinGetHandle("Windows Internet Explorer", $sURL)
_WinAPI_SetKeyboardLayout($win_handle, 0x0419)
;ControlSend ($win_handle, '', '', "{ALTDOWN}{ALTUP}фх", 0)
Send("{ALTDOWN}{ALTUP}")
Send("ф")
Send("х")
$sSaveAsWindow = "Сохранение веб-страницы"
WinWait($sSaveAsWindow,"")
If Not WinActive($sSaveAsWindow,"") Then WinActivate($sSaveAsWindow,"")
WinWaitActive($sSaveAsWindow,"")
ControlSetText ($sSaveAsWindow, "", "Edit1", $sWorkPaht) ; $sWorkPaht - второй параметр 'рабочая папка'
ControlClick ($sSaveAsWindow, "", "Button2")
_GUICtrlComboBox_SetCurSel(ControlGetHandle($sSaveAsWindow, '', 'ComboBox3'), 1)
;If FileExists($sWorkPaht & $sFileName) Then FileDelete($sWorkPaht & $sFileName)
ControlSetText ($sSaveAsWindow, "", "Edit1", $sFileName) ; "test" - третий параметр 'имя файла'
ControlClick ($sSaveAsWindow, "", "Button2")
$Timer = TimerInit()
While TimerDiff($Timer) < 50000000
    $hFile = _WinAPI_CreateFile($sWorkPaht & $sFileName, 2, 2, 0)
    If $hFile Then
        _WinAPI_CloseHandle($hFile)
        ExitLoop
    EndIf
    Sleep(1000)
WEnd
If Not $hFile Then
    ; Ошибка
    ConsoleWrite('File not found or time out.' & @CR)
Else
    ConsoleWrite('OK' & @CR)
EndIf
;Sleep(15000)
WinClose($win_handle)

Все это работало, пока исполнялось в Windows XP и IE8...



Теперь после перехода на Windows 7 появились проблемы.

С тем, что поменялись номера инстансов элементов управления в окне сохранения я разобрался.

Привел скрипт к нужному виду, но он все равно не работает.





Код:

Код: Выделить всё

#Include <GUIComboBox.au3>
#include <IE.au3>
#Include <WinAPI.au3>
#Include <WinAPIEx.au3>
$sURL = $CmdLine[1]
$sWorkPaht = $CmdLine[2]
$sFileName = $CmdLine[3]
Opt("WinTitleMatchMode", 2)
$oIE = _IECreate ($sURL) ;, 0, 1, 1, 0) ; $sURL - первый параметр 'URL'
$win_handle = WinGetHandle("Windows Internet Explorer", $sURL)
_WinAPI_SetKeyboardLayout($win_handle, 0x0419)
;ControlSend ($win_handle, '', '', "{ALTDOWN}{ALTUP}фх", 0)
Send("{ALTDOWN}{ALTUP}")
Send("ф")
Send("с")
$sSaveAsWindow = "Сохранение веб-страницы"
WinWait($sSaveAsWindow,"")
If Not WinActive($sSaveAsWindow,"") Then WinActivate($sSaveAsWindow,"")
WinWaitActive($sSaveAsWindow,"")
; здесь переход в рабочую папку
ControlSetText ($sSaveAsWindow, "", "Edit1", $sWorkPaht, 1) ; $sWorkPaht - второй параметр 'рабочая папка'
ControlClick ($sSaveAsWindow, "", "Button1")
; выбор формата сохранения - MHT
_GUICtrlComboBox_SetCurSel(ControlGetHandle($sSaveAsWindow, '', 'ComboBox2'), 1)
;If FileExists($sWorkPaht & $sFileName) Then FileDelete($sWorkPaht & $sFileName)
ControlSetText ($sSaveAsWindow, "", "Edit1", $sFileName) ; "test" - третий параметр 'имя файла'
ControlClick ($sSaveAsWindow, "", "Button1")
$Timer = TimerInit()
While TimerDiff($Timer) < 50000000
    $hFile = _WinAPI_CreateFile($sWorkPaht & $sFileName, 2, 2, 0)
    If $hFile Then
        _WinAPI_CloseHandle($hFile)
        ExitLoop
    EndIf
    Sleep(1000)
WEnd
If Not $hFile Then
    ; Ошибка
    ConsoleWrite('File not found or time out.' & @CR)
Else
    ConsoleWrite('OK' & @CR)
EndIf
;Sleep(15000)
WinClose($win_handle)

Проблема вот в чем:

в куске кода, помечнном комментом "; здесь переход в рабочую папку" -

я подставлял в TextBox "Имя файла" - путь к рабочей папке со слешем в конце, и при нажатии на кнопку сохранить (ранее в IE8) открывалась нужнаяя папка.

Теперь, я подставляю в TextBox "Имя файла" - тоже путь к рабочей папке со слешем в конце, и при нажатии на кнопку сохранить происходит не переход, а сохранение файла с именем, которое предлагалось по умолчанию в момент открытия диалогового окна (тот текст что в шапке - имя страницы)...



p.s. Да, кстати, при выборе в ComboBox-е варианта "Веб-архив, один файл (*.mht)", зрительно он выбирается, НО сохраняется файл все равно в формате "Веб-страница полностью" с дополнительной папкой.

Короче говоря все зрительно меняется, но "в глубине элементов управления" остается то, что предлагало окно "Сохранить как..."

А еще не завершается скрипт...



Господа ГУРУ, помогите! Пожалуйста!
Аватара пользователя
avmir

Re: Сохранение страницы как MHT в IE9 (элемнты управления не изменяют свое значение)

Сообщение avmir »

Столкнулся с похожей ситуацией. Помогает СontrolSend в Edit-объект, в причинах разбираться не стал, на этом этапе моя проблема была решена...
Аватара пользователя
266903582

Re: Сохранение страницы как MHT в IE9 (элемнты управления не изменяют свое значение)

Сообщение 266903582 »

После некоторого редактирования скрипта





Код:

Код: Выделить всё

#Include <GUIComboBox.au3>
#Include <GUIComboBoxEx.au3>
#include <IE.au3>
#Include <WinAPI.au3>
#Include <WinAPIEx.au3>
$sURL = $CmdLine[1]
$sWorkPaht = $CmdLine[2]
$sFileName = $CmdLine[3]
$sSaveAsWindow = "Сохранение веб-страницы"
Opt("WinTitleMatchMode", 2)
If FileExists($sWorkPaht & $sFileName) Then FileDelete($sWorkPaht & $sFileName)
$oIE = _IECreate ($sURL) ;, 0, 1, 1, 0) ; $sURL - первый параметр 'URL'
$win_handle = WinGetHandle("Windows Internet Explorer", $sURL)
_WinAPI_SetKeyboardLayout($win_handle, 0x0419)
Do
	Send("{ALTDOWN}{ALTUP}")
	sleep(500)
	Send("ф")
	sleep(500)
	Send("с")
	sleep(500)
Until WinExists($sSaveAsWindow, "")
WinWait($sSaveAsWindow,"")
If Not WinActive($sSaveAsWindow,"") Then WinActivate($sSaveAsWindow,"")
WinWaitActive($sSaveAsWindow,"")
sleep(500)
; здесь мы переходим в папку в которую должны сохраняться страницы
ControlSetText ($sSaveAsWindow, "", "Edit1", $sWorkPaht) ; $sWorkPaht - второй параметр 'рабочая папка'
_GUICtrlComboBoxEx_SetCurSel(ControlGetHandle($sSaveAsWindow, "", "ComboBox2"), 1)
ControlClick ($sSaveAsWindow, "", "Button1")
; здесь сохраняем MHT файл с нужным именем
ControlSetText ($sSaveAsWindow, "", "Edit1", $sFileName, 1) ; "test" - третий параметр 'имя файла'
_GUICtrlComboBoxEx_SetCurSel(ControlGetHandle($sSaveAsWindow, "", "ComboBox2"), 1)
ControlClick ($sSaveAsWindow, "", "Button1")
sleep(500)
$Timer = TimerInit()
While TimerDiff($Timer) < 2000000000
    $hFile = _WinAPI_CreateFile($sWorkPaht & $sFileName, 2, 2, 0)
    If $hFile Then
        _WinAPI_CloseHandle($hFile)
        ExitLoop
    EndIf
    Sleep(1000)
WEnd
Sleep(1000)
If Not $hFile Then
    ; Ошибка
    ConsoleWrite('File not found or time out.' & @CR)
Else
    ConsoleWrite('OK' & @CR)
EndIf
WinClose($win_handle)
Exit($win_handle)

он стал сохранять файл с нужным именем, но всё также несмотря на то, что он выбирает в ComboBox "Тип файла" второй пункт "Веб-архив, один файл (*.mht)" (при этом на экране видны изменения!), а при эмуляции нажатия на кнопку "Сохранить" файл сохраняется как HTML (с файлами в отдельной папке) (это превый пункт в ComboBox-е, т.е. по-умолчанию).



Как заставить скрипт сохрянять файл в формате MHT?



Господа помогите пожалуйста, уже столько времени ничего не получается Изображение
Аватара пользователя
Iska

Re: Сохранение страницы как MHT в IE9 (элемнты управления не изменяют свое значение)

Сообщение Iska »

avmir,
[решено] Сохранение загруженной html-страницы
пробовали?



Update: ага, вижу:
.NET - Сохранение веб-страницы в MHTML
. Проблема в том, что библиотека CDO некорректно оформляет путь на css, оформленный ссылкой —
JScript: Пример сохранения web-страницы в TXT, HTML и MHT (веб-архив)
:


Цитата:



Одна тонкость - MHT формируется библиотекой CDO с ошибкой - когда в веб-архив внедрен внешний CSS файл (), то ссылку на него библиотека указывает неверно, вследствие чего страница из mht отображается без стиля из этого файла. Если же css-таблица вписана в сам html-исходник с помощью тега , то тогда все отображается верно.
Аватара пользователя
avmir

Re: Сохранение страницы как MHT в IE9 (элемнты управления не изменяют свое значение)

Сообщение avmir »

Кроме того, IE8 или 9 длительно ждет пока не загрузятся все картинки со страницы, и только по прошествии какого-то времени "разрешает" сохранить страницу.

А CDO судя по всему не заморачивается с этим. "Картинка сейчас недоступна?" - "Ну и фиг с ней".



Мне нужно-то только как-то "зафиксировать" выбранный в ComboBox-е элемент...
Аватара пользователя
Iska

Re: Сохранение страницы как MHT в IE9 (элемнты управления не изменяют свое значение)

Сообщение Iska »

avmir, так и в IE было — чересчур малый таймаут. Возможно, как Вы говорите, в свежих версиях IE сие поправили.
Аватара пользователя
Iska

Re: Сохранение страницы как MHT в IE9 (элемнты управления не изменяют свое значение)

Сообщение Iska »

Нет. В восьмерке всё работало на УРА...



Может кликами можно как-то сделать? Пробовал, во время исполнения скрипта, кликами повторить выбор пунката "Веб-архив, один файл (*.mht)" - всё сохранилось правильно.

Да и еще мысль - в IE всегда этот выбор запоминался. Я так думаю, в момент выбора элемента данные заносились в реестр. Может при сохранении IE берет "тип файла" не из ComboBox-а, а как раз из реестра? Может, весь этот гемор связан как раз с параноидальностью "семерки"?
Аватара пользователя
Iska

Re: Сохранение страницы как MHT в IE9 (элемнты управления не изменяют свое значение)

Сообщение Iska »

Цитата avmir:



Нет. В восьмерке всё работало на УРА...
Сохранение страницы как MHT в IE9 (элемнты управления не изменяют свое значение)




Я, говоря про «свежие версии IE», как раз и имел в виду версии после шестой.
Ответить

Вернуться в «AutoIt»