Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/36: Рейтинг темы: голосов - 36, средняя оценка - 4.78
Megabotan

Как получить содержимое фрейма из контрола WebBrowser?

23.12.2006, 07:27. Показов 7823. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Кстати, на Delphi таже самая история. Так что пока нет выхода?

Может всё же "View Source" как нибудь использовать?
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.12.2006, 07:27
Ответы с готовыми решениями:

Как присвоить на прямую WebBrowser-у, html-body контрола?
Есть контрол WinHTTP, Отправляется запрос на страницу WinHTTP.Open 'GET', 'http://www....', False WinHTTP.Send После возврата...

Как получить содержимое файла .js через EmbeddedWB или Webbrowser?
Собственно, как получить содержимое файла .js через EmbeddedWB или Webbrowser? А то при прямом обращении...

Из одного фрейма при двойном клике в поле копировать содержимое в поле второго фрейма
надо из одного фрейма при дблклике в поле копировать содержимое поля в поле второго фрейма. Следующий код работает только в IE, а как...

18
0 / 0 / 0
Регистрация: 15.04.2010
Сообщений: 12
16.04.2010, 03:20
из контрола WebBrowser?
Пробовал WebBrowser1.Document.frames(0).Document. documentElement.innerHTML,
не помогает: access denied... При этом элемент frames(0) точно есть.
0
Comanche
18.04.2010, 12:26
Странно.
Вот такой код работает:
Visual Basic
1
2
3
4
5
6
7
Private Sub Form_Load()
    WebBrowser1.Navigate 'http://mopsclassika.narod.ru/index.html'
    Do Until WebBrowser1.ReadyState = READYSTATE_COMPLETE
        DoEvents
    Loop
    Debug.Print WebBrowser1.Document.frames(0).Document.documentElement.innerHTML
End Sub
(нашёл в Сети какую-то страничку с фреймами - на Narod.Ru)

Но если не дождаться окончания загрузки странички, то ругань будет - правда, не про 'access denied', а 'Object variable or With block variable not set', т.к. WebBrowser1.Document не существует, пока окончательно не загрузится.

ВРОДЕ БЫ (но я не уверен) ваша ошибка бывает, когда в фрейме есть ссылка на другой домен...
Comanche
19.04.2010, 14:15
Да, тут ничего не поделаешь - это специальная политика MS по обеспечению 'cross-frame security' (см. MSDN). Когда вышеприведённый код 'споткнётся' на строчке 'Debug.Print ...' с ошибкой 'Access denied', не останавливайте выполнение кода, а выберите 'Debug', включите отображение окна 'Watches', затем в той строчке выделите 'WebBrowser1.Document.frames(0)' и перетащите его мышью в окно 'Watches'. Затем разверните 'плюсик', чтобы увидеть объектную модель этого 'WebBrowser1.Document.frames(0)' - и вы увидите, что там практически на всех элементах будет 'Access denied' или 'Permission denied'.

Наверное, есть только один выход:
st = WebBrowser1.Document.body.innerHTML
затем - обычный текстовый парсинг для выделения из st куска, заключённого между <FRAMESET> и </FRAMESET>, и так далее...
0 / 0 / 0
Регистрация: 15.04.2010
Сообщений: 12
20.04.2010, 05:06
Хороший метод изучить объектную модель )) Я и не знал, что так можно
Попробовал изменить WebBrowser1.Document.domain, чтобы обойти 'cross-frame...' - не получается, хотя нигде и не написано, что он read only

>текстовый парсинг куска, заключённого между <FRAMESET> и </FRAMESET>, и так далее...
А что 'и так далее'? Содержимого фреймов там же все равно нет, только ссылки... А по новой скачивать не хочется, хотя, в принципе, это выход. Еще один выход - в кэше поискать... Но хотелось бы покрасивше сделать. Да и возни много с кэшем...

Но интересно вот что: при клике правой кнопкой в области фрейма 'Просмотр в виде HTML' открывается блокнот с содержимым фрейма. Как-то же он это делает, откуда-то же берет это содержимое, как-то оно передается... Интересно, как?... Может быть, через OLE можно? Только как?
0
0 / 0 / 1
Регистрация: 19.10.2008
Сообщений: 173
20.04.2010, 09:59
Как-то приходилось решать подобную задачу, но там HTML-код был 'правильным' и я открывал его как XML без DTD, затем getElementsByTagName получал коллекцию нужных мне элементов (для данного случая 'FRAMESET'). Потом брал .xml (точно не помню, входят ли строки '<FRAMESET>' и '</FRAMESET>' в это свойство, но отсечь-то их не трудно) для каждого узла и спокойно загружал его в WebBrowser. Хотя быстродействие и не требовалось, код получился достаточно шустрый.
0
0 / 0 / 1
Регистрация: 19.10.2008
Сообщений: 173
20.04.2010, 10:19
2 Comanche
Приведенный тобой код у меня работает. И в Watch всё OK!
Интересные тараканы
0
Comanche
20.04.2010, 11:14
2t-80:
А ты открой в Блокноте эту htm-страничку про мопсов и во всех трёх фреймах (чтоб наверняка ) ) измени SRC на http://www.rambler.ru, http://www.mail.ru и т.п. Сохрани, и уже после этого посмотри, что у тебя будет в Watches!

Так что тараканов тут нет. Есть cross-frame security, а это похлеще будет ;-)
0 / 0 / 1
Регистрация: 19.10.2008
Сообщений: 173
20.04.2010, 14:45
Прошу прощения что невнимательно читаю.
Кроме текстового парисинга можно попробовать поискать элементы FRAMESET, FRAME... и в атрибутах каждого найденного поискать атрибут 'SRC'... ', и так далее' )) Работать через DOM будет медленней, чем работа со строками (зато понтов больше!), но полезно попробовать и так и эдак ) Все что выше, считать ИМХО )
0
0 / 0 / 0
Регистрация: 15.04.2010
Сообщений: 12
20.04.2010, 14:56
2 t-80
Насчет cross-frame: если непонятно, про что разговор - часть дискуссии находится в теме http://www.relib.com/forums/topic.asp?id=809270

Да найти ссылки-то нетрудно. У меня такой код работает:
Visual Basic
1
2
3
For i = 0 To WebBrowser1.Document.All.length - 1
  If TypeOf WebBrowser1.Document.All(i) Is IHTMLFrameElement Then Text2.Text = Text2.Text + vbCrLf + WebBrowser1.Document.All(i).src
Next i
Фокус в том, что я не хочу загружать по второму разу данные, которые уже загружены. Вот в чем понты!!!

2 all
Так что насчет ОЛЕ? Или я неправильно думаю?
0
0 / 0 / 1
Регистрация: 19.10.2008
Сообщений: 173
20.04.2010, 15:15
Да, понял уже, что я чайник ))
Есть Internet Transfer Control, который вроде закачивает страницу как файл или в строковую переменую, не разбирая что там такое внутри (то есть не закачивая страницы во фрейм). А строку разобрать самому и уже в WB закачать страницы.
(Блин, неужели опять пальцем в небо попал?!)
0
0 / 0 / 0
Регистрация: 15.04.2010
Сообщений: 12
20.04.2010, 15:35
Да нет, чайник - это я! ))
А идея такая у меня была. Но вот проблема - я не могу закачанный документ передать в вебброузер - WebBrowser1.Document.documentElement read only, а Document.body меня не устраивает - мне там надо формы заполнять, кнопки нажимать, там скрипты... Разве что через файл - так у меня понты еще в том, что читать-писать на диск без надобности я тоже не хочу. ))

Но как же все-таки происходит передача данных в Блокнот при просмотре 'в виде HTML'???
0
0 / 0 / 1
Регистрация: 19.10.2008
Сообщений: 173
20.04.2010, 16:13
Может не подходит, но вот:
http://www.relib.com/forums/topic.asp?id=807000
0
0 / 0 / 0
Регистрация: 15.04.2010
Сообщений: 12
20.04.2010, 17:05
Увы, там тоже Document.body...
Кстати, насчет all.tags... Оно, конечно работает, но что это такое? В объектной модели его нет.
0
Comanche
20.04.2010, 17:12
Я тут помучал Spy++. Так вот, после WM_MENUSELECT через какое-то время идёт WM_APPACTIVATE (для запуска 'Source Editor' - в моём случае - Блокнота). И всё! Если потом посмотреть, посылались ли какие-то сообщения Блокноту, отображающему HTML-код, то ответ - никаких сообщений!

Да это и понятно. Проанализировав FRAMESET'ы, Эксплорер грузит исходные коды всех страничек (с SRC'ов всех фреймов) в свои внутренние объекты, и потом отображает их (уже как страницу, а не код) в своём окне. Раз они у него где-то хранятся, то когда на фрейме щёлкают мышью и выбирают 'Просмотр в виде HTML', то ему нет нужды ни повторно парсить код фреймсета (выделяя SRC), ни загружать каким-то образом страничку фрейма: всё это уже проделано им на ранней стадии - при загрузки всех страниц фреймсета - и находится в этих 'внутренних' объектах.

Так вот, DOM-модель, доступ к которой возможен через ЭУ WebBrowser, и берёт всё своё содержимое из этих 'внутренних объектов' (скорее всего, эти 'внутренние объекты' - и есть в точности DOM-объекты). Просто 'доступ наружу' к отдельным элементам этой модели Эксплорер сознательно ограничивает, хотя в то же время может спокойно в них копаться сам. Думаю, что с этим ничего не поделаешь.

Т.е. чтобы сэмулировать поведение Эксплорера по загрузке страницы и последующей работе с нею, нужно проанализировать фреймсет, загрузить исходные коды ВСЕХ фрейм-страничек во 'внутренние объекты', потом вывалить всё это на экран, НЕ СТИРАЯ содержимое 'объектов'. Вот после этого у нас уже не встанет никогда вопроса, откуда брать код для любого фрейма. Но ведь мы не будем же так делать, правильно? Кому нужен этот геморрой? Вместо этого мы сознательно пользуем ЭУ WebBrowser (ГОТОВОЕ решение) - и вот тут натыкаемся на cross-frame security. А т.к. у нас есть 'понты', то нас это сразу напрягает.

Так что единственный компромисс - и чтоб готовым решением пользоваться, и чтобы ВСЕ фрейм-коды видеть, - это написать на базе ЭУ WebBrowser'а свой контрол, с дополнительным свойством FrameSource(i), где i - индекс фрейма ))
0 / 0 / 0
Регистрация: 15.04.2010
Сообщений: 12
20.04.2010, 17:37
То есть как раз-таки проделать 'весь этот геморрой' ))
Я тут попытался заменить notepad на wordpad (переименованием, не нашел я нигде настройки 'Source Editor'), оно не сработало - видимо, формат вызова не совпал, но зато я увидел сообщение 'С:windowsTemporary не удается найти файл'.
Вот так-то...
Ну и я, наверное, в кэш полезу. ))
0
0 / 0 / 0
Регистрация: 15.04.2010
Сообщений: 12
20.04.2010, 18:11
А насчет нового контрола я пока не понял. Вот такой код:
Visual Basic
1
2
3
4
Dim WithEvents wb2 As WebBrowser
Dim Doc As IHTMLDocument
Set wb2 = WebBrowser1
Set Doc = wb2.Document.frames(0).Document
приводит к той же проблеме. Впрочем, опыта написания своих ЭУ у меня нет, наверное, я чего-то не понимаю...
0
Comanche
20.04.2010, 21:41
Я имел в виду совсем уж 'запредельный' вариант: разработать СВОЙ ActiveX Control, взяв за основу MS WebBrowser. Всё пронаследовать, и добавить только одно свойство, чтобы потом код 3-го фрейма получать вот так:
Debug.Print MyWebBrowser.FrameSource(3)

'Понтами' здесь будет инкапсуляция (внутри этого юзер-контрола) кода, отвечающего за чтение кода фрейма(-ов). Есс-с-сно, что этот код, на самом деле, будет делать повторную загрузку тех файлов, ссылки на которые он нашёл в SRC-атрибутах внутри фреймсета )

Зато 'понты'!
Да и сделать просто...
0 / 0 / 0
Регистрация: 15.04.2010
Сообщений: 12
21.04.2010, 18:18
Ну, я предпочитаю понты 'по существу'. А чисто для форсу - тоже можно, конечно, если код эффективный. А если неэффективный - стремно это как-то... Хотя даже MS часто это делает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.04.2010, 18:18
Помогаю со студенческими работами здесь

Webbrowser как сохранить содержимое
Ребята подскажите! В компоненте webbrowser delphi открываю определенную страницу после чего необходимо захватить в переменную содержимое...

Как очистить содержимое Webbrowser
На форме я разместил компонент таймер которые через каждые 15 секунд загружает данные в броузер. При каждом вызове данные в браузере...

Как получить высоту фрейма в пикселах?
подскажите пожалуйста как получить высоту фрейма в пикселах или если это возможно посчитать её.

Как получить URL из соседнего фрейма ?
Один из фреймов страницы хочет знать, что же открыто в другом фрейме. Использую parent('framename2').location.href - работает, но иногда...

Как сделать чтобы содержимое фрейма автоматически "прокручивалось" вниз?
Есть такая страница, где в фрейме загружается другая. А при клике на Reload перезагружается. Как сделать так чтобы содержимое фрейма...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru