Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   Сохранение страницы как MHT в IE9 (элемнты управления не изменяют свое значение) (http://forum.oszone.net/showthread.php?t=221518)

avmir 26-11-2011 19:45 1803871

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

У меня есть программка, которая вызывает скрипт 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 28-11-2011 10:23 1804771

Неужто для Windows 7 никто скриптов не писал?

266903582 29-11-2011 01:35 1805387

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

avmir 11-12-2011 15:09 1813214

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

Код:


#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?

Господа помогите пожалуйста, уже столько времени ничего не получается :wacko:

Iska 11-12-2011 15:48 1813244

avmir, такое пробовали?

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

Одна тонкость - MHT формируется библиотекой CDO с ошибкой - когда в веб-архив внедрен внешний CSS файл (<link rel="stylesheet" type="text/css" href="file.css" />), то ссылку на него библиотека указывает неверно, вследствие чего страница из mht отображается без стиля из этого файла. Если же css-таблица вписана в сам html-исходник с помощью тега <style>, то тогда все отображается верно.

avmir 12-12-2011 02:51 1813575

Кроме того, IE8 или 9 длительно ждет пока не загрузятся все картинки со страницы, и только по прошествии какого-то времени "разрешает" сохранить страницу.
А CDO судя по всему не заморачивается с этим. "Картинка сейчас недоступна?" - "Ну и фиг с ней".

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

Iska 12-12-2011 03:54 1813579

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

avmir 12-12-2011 08:59 1813619

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

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

Iska 12-12-2011 17:55 1813867

Цитата:

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

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


Время: 03:01.

Время: 03:01.
© OSzone.net 2001-