Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Скрыть все элементы WebBrowser


Автор: I_Am_Rock 27.8.2009, 17:51
Всем привет.

Такой вопрос. Получаю веб-страницу в WebBrowser. Нужно скрыть (просто чтоб они не были видны) все элементы, кроме одной картинки (в теге img).

Есть же, например,
Код

WebBrowser1.Document.getElementById("xxx").Value = "znachenie"


Я знаю, что есть disabled которая делает неактивным
Код

WebBrowser1.Document.getElementById("xxx").disabled = True


а вот мне нужно, чтобы прятало.

Скачать картинку на винт не предлагать. Нужно именно так.
Причем еще важно, чтобы скрывающиеся элементы существовали - чтобы в текстовое поле можно было ввести текст (как я показал выше - со словом "znachenie") и чтобы кнопка нажималась (опять же программно).

Автор: neic 27.8.2009, 20:42
Код

Ie.Document.getElementById("xxx").Style.visibility = "hidden"


P.s. Я люблю Гугл smile 

Автор: Naghual 28.8.2009, 12:21
На мой взгляд, правильнее будет не скрывать все ненужное, а изначально, загружать только нужное.

Автор: I_Am_Rock 28.8.2009, 13:27
neic
Спасибо, это работает. Но я так подумал - мне получается проще все сразу скрыть, а потом открыть только img. Как присвоить всем объектам Style.visibility = "hidden" ? И как потом отобразить картинку - вместо хидден ставить visible?
И второй вопрос. Объекты скрываются, но img остается на своем месте. А нужно ее переместить в левый верхний угол. Т.е. я хочу, чтобы пользователь видел только картинку, а остальные объекты, хоть и существовали (чтобы можно было, например, программно нажимать на кнопку), но были не видны. 
Буду очень признателен.  smile 

Naghual
Картинка генерится каждый раз новая (капча). К тому же, вы предлагаете загружать только картинку,а мне же нужно потом и на кнопки жать, пусть и программно, но нажимать.

Автор: Naghual 28.8.2009, 13:41
Цитата(I_Am_Rock @  28.8.2009,  13:27 Найти цитируемый пост)
а мне же нужно потом и на кнопки жать, пусть и программно, но нажимать.

Ну Вы же об этом не упоминали прежде.   Вы уж впредь вопросы задавайте полностью.

Добавлено через 1 минуту и 33 секунды
Цитата(I_Am_Rock @  28.8.2009,  13:27 Найти цитируемый пост)
Объекты скрываются, но img остается на своем месте. А нужно ее переместить в левый верхний угол. Т.е. я хочу, чтобы пользователь видел только картинку, а остальные объекты, хоть и существовали (чтобы можно было, например, программно нажимать на кнопку), но были не видны. 
Буду очень признателен.

Страницу загружаешь в скрытом WebBrowser, с нее получаешь Капчу и выводишь ее в PictureBox на форме.

Автор: I_Am_Rock 28.8.2009, 15:29
Я поюзал поиск и частично нашел ответы на свой вопрос
Если вместо visibility = "hidden" использовать display = "none", то объект не только исчезает, но и уступает место. Вобщем, как и надо.

Таким образом, остается второй вопрос. Как применить скрытие (через display = "none") ко всему, что есть внутри body.
Пробую так
Код

WebBrowser1.Document.getElementsByTagName("body").Style.display = "none"

Не получается. Хотя если сделать так со сохраненной страницей (добавить через правку html такое свойство к тегу боди), то все норм.

з.ы. Я гуглю. И гуглю много.  smile   smile

Добавлено @ 15:41
Цитата(Naghual @  28.8.2009,  13:41 Найти цитируемый пост)
Ну Вы же об этом не упоминали прежде.   Вы уж впредь вопросы задавайте полностью.

Ну, как же не упоминал...  smile 
Цитата(I_Am_Rock @  27.8.2009,  17:51 Найти цитируемый пост)
Причем еще важно, чтобы скрывающиеся элементы существовали ... и чтобы кнопка нажималась (опять же программно).


Цитата(Naghual @  28.8.2009,  13:41 Найти цитируемый пост)
Страницу загружаешь в скрытом WebBrowser, с нее получаешь Капчу и выводишь ее в PictureBox на форме.

Я думал об этом, но капча генерируется вот так
<img src="captcha.php" width=140 height=60>
Как ее можно получить?

з.ы. Еще и с инетом какие-то проблемы. (((

Автор: DrBoom 28.8.2009, 16:51
I_Am_Rock, проще будет не искать элементы по ID'ам и Nam'ам, а пройтись по коллекции all:
Код

Dim Tag As Variant
For Each Tag In WebBrowser1.Document.all
 If [проверка картинка ли у нас или не нужный элемент, например, при помощи name элемента или свойства src] Then
    Tag.style.dispaly="none"
 End If
Next


ЗЫ. Собственно это всё, что Вам нужно smile 

А ещё лучше:
Код

Dim Tag As Variant
For Each Tag In WebBrowser1.Document.all
    Tag.style.dispaly="none"
Next
[Картика].style.dispaly="block" ' Если есть у неё ID и\или Name

Автор: I_Am_Rock 28.8.2009, 17:26
DrBoom 
Спасибо! Только я никак не пойму как сделать эту проверку   smile 
Че-то никак не получается...(( Пробовал Tag.Src = "адрес"

И скажите - смогу ли работать со скрытыми таким образом объектами? Например, нажимать, вводить текст.

Добавлено через 5 минут и 35 секунд
Цитата(DrBoom @  28.8.2009,  16:51 Найти цитируемый пост)
А ещё лучше:

Щас попробую smile

Добавлено через 11 минут и 6 секунд
Эх не выходит. У картинки нет нейма и айди. 

Но зато это единственная картинка. Можно искать по тегу img и можно искать по src, только я не соображу как. Не подскажите? smile

<img src="captchalite.php" width=140 height=60>

Добавлено через 14 минут и 22 секунды
Сейчас посмотрел - у кнопки button тоже нет айди и нейма, так что буду Вам благодарен если подскажите, как именно по тегам искать (кнопка тоже одна).
И пробую так
Код

WebBrowser1.Document.getElementsByTagName("img").Style.display = "block"

Не получается - пишет ошибку.

Автор: I_Am_Rock 28.8.2009, 18:17


Сейчас попробовал поискать картинку так
Код

 For i = 0 To WebBrowser1.Document.images.length - 1
 WebBrowser1.Document.images(i).Style.display = "block"
 Next i

Ошибки не возникает - может находит?

Но картинки не отображается(((

Я тут подумал - может это из-за того, что скрыт тег body - может быть из-за этого?

Автор: DrBoom 28.8.2009, 18:55
Цитата(I_Am_Rock @  28.8.2009,  17:26 Найти цитируемый пост)
И скажите - смогу ли работать со скрытыми таким образом объектами? Например, нажимать, вводить текст.

Да, конечно... Тэг то не удаляется, он только "скрывается".


Цитата(I_Am_Rock @  28.8.2009,  18:17 Найти цитируемый пост)
Я тут подумал - может это из-за того, что скрыт тег body - может быть из-за этого? 

Да, так оно и будет, т.к. all содержит все тэги без исключений. Добавьте после обхода по all:
Код

 WebBrowser1.Document.body.style.display="block"


Добавлено @ 19:03
Цитата(I_Am_Rock @  28.8.2009,  17:26 Найти цитируемый пост)
Код

WebBrowser1.Document.getElementsByTagName("img").Style.display = "block"


Не получается - пишет ошибку.
 Конечно, не удивительно, т.к. имя тега (свойство name) -- это та строка, которая задана в атрибуте тега name:
Код

<img name="имя">


 Название тэга получить можно в свойстве tagname smile 

Автор: I_Am_Rock 28.8.2009, 20:20
Вот, попробовал так - все равно всё исчезает (((

Код

Dim Tag As Variant
For Each Tag In WebBrowser1.Document.All
 If Tag.TagName <> "img" Then
    Tag.Style.display = "none"
 End If
Next
WebBrowser1.Document.body.Style.display = "block"


Я подумал - может нужно "показать" не только body, но и html, div или еще что-то? 

Автор: DrBoom 29.8.2009, 10:33
Хм... I_Am_Rock, верно, нужно показать все родительские элементы для этой картинки smile  Какой ужас smile  Однако всё это дело можно и "обойти", если с помощью свойств innerHTML и oterHTML вы перенесёте картинку за пределы тэга html smile

Добавлено через 3 минуты и 49 секунд
ЗЫ. Тогда и цикл не нужен, прячем html (это нулевой, как правило, элемент в коллекции all), а после картинку "отправляем" за html этот. 

Автор: I_Am_Rock 29.8.2009, 13:45
Вот так да. Я примерно представляю, как ими можно изменять элементы, например, очищать.
А чтобы переносить... 
 smile 

А разве тогда не будет второй запрос? Если, например, я перенесу - он не сгенерирует новую картинку?

Автор: DrBoom 29.8.2009, 15:36
2 I_Am_Rock

Код

Dim buf As String
With WebBrowser1.Document
  .body.style.display = "block" ' прячем тело c глаз долой
   buf=[картинка].outerHTML  ' помешаем в буфер текстовое представление тэга
  .body.outerHTML=.body.outerHTML+buf ' помещаем "копию" тэга за пределами тэга body
End WIth


Цитата(I_Am_Rock @  29.8.2009,  13:45 Найти цитируемый пост)
А разве тогда не будет второй запрос? Если, например, я перенесу - он не сгенерирует новую картинку? 

Может и не сработает, если картинка кэшируется. Однако если даже второй запрос будет, если php-скрипт "нормально" работает, то от этого может и ничего страшного не случится.

Добавлено @ 15:37
Как еще один вариант могу Вам предложить следующее попробовать:
Код

WebBrowser1.Document.body.outerHTML=[картинка].outerHTML+[нужные элементы].outerHTML

ЗЫ. DOM в HTML интересная вещь, пробуйте, экспериментируйте и импровизируйте smile 

Автор: I_Am_Rock 29.8.2009, 16:21
Вы, наверно, опечатку сделали - там нужно не block, а none - чтоб спрятать...

Не получается. Выдает ошибку на последней строчке перед End With ("Application-defined or object-defined error")
Вот весь код процедуры

Код

Dim asd As Object
Dim buf As String

For i = 0 To WebBrowser1.Document.images.length - 1
  Set asd = WebBrowser1.Document.images(i) ' находим единственную картинку
Next i

With WebBrowser1.Document
  .body.style.display = "none" ' прячем тело c глаз долой
   buf = asd.outerHTML ' помешаем в буфер текстовое представление тэга
  .body.outerHTML=.body.outerHTML+buf ' помещаем "копию" тэга за пределами тэга body
End With


Я проверял, ставя перед этой строчкой такие строки

Код

   MsgBox .body.outerHTML
   MsgBox buf
   MsgBox .body.outerHTML + buf


Судя по тому, что мне показывалось - все должно нормально склеиваться.(((

Автор: DrBoom 29.8.2009, 18:42
А что, если поставить On Error Resume Next smile 
Цитата(I_Am_Rock @  29.8.2009,  16:21 Найти цитируемый пост)
Вы, наверно, опечатку сделали - там нужно не block, а none - чтоб спрятать...

Да, спасибо.

Автор: I_Am_Rock 29.8.2009, 19:27
Цитата

А что, если поставить On Error Resume Next 

Не, не помогло ((( Просто ничего не отображается.

Автор: DrBoom 30.8.2009, 11:50
I_Am_Rock, чтобы не гадать на кофейной гуще, что и как у Вас и что и как Вам нужно, привожу пример на основе форума Винграда. Пример оставляет только нужную картинку (кстати, индекс её каждый раз меняется) с парочкой добавленных своих тэгов. Пример в аттаче.

Добавлено через 1 минуту и 26 секунд
Я повторю, что прежде чем пытаться "решить" поставленную задачу, Вам следует проанализировать документ и уже в зависимости от структуры документа и его DOM строить способы решения задачи. Экспериментируйте и импровизируйте.

Автор: I_Am_Rock 30.8.2009, 12:55
Адаптировал к своему случаю. Получилось, только картинка новая показывается. Поэтому не подходит.

Я подумал, что можно просто по очереди спрятать все элементы, кроме картинки. Страничка простая - элементов мало. Т.е. ищу кнопочку, прячу, ищу кнопку выбора файла, прячу.
Но в связи с этим у меня вопрос. Как можно "схватить" обычный текст? Который не одет в теги.

Добавлено через 4 минуты и 36 секунд
Большое спасибо за то, что пытаетесь мне помочь. Я очень это ценю.  smile 

Автор: DrBoom 30.8.2009, 14:06
Цитата(I_Am_Rock @  30.8.2009,  12:55 Найти цитируемый пост)
Но в связи с этим у меня вопрос. Как можно "схватить" обычный текст? 

Для этого есть свойство innerTEXT... пользоваться этим свойством можно тж как и innerHTML\outerHTML smile  Тж есть интересный метод для объектов тэгов, называется CreateTextRange и возвращаемый им объект TextRange.

Цитата(I_Am_Rock @  30.8.2009,  12:55 Найти цитируемый пост)
Получилось, только картинка новая показывается. Поэтому не подходит.

А вы попробуйте, может подойдёт. Я так понял, Вы делаете свою форму для ввода капчи. Может сервер правильно определит, что вы вводите smile  

Автор: I_Am_Rock 30.8.2009, 18:03
Цитата(DrBoom @  30.8.2009,  14:06 Найти цитируемый пост)
А вы попробуйте, может подойдёт

Нет, не подошло. Я потом делаю WebBrowser1.Document.Forms(0).submit и если до этого я не далал ничего, то одно, а если сделал по-вашему, то не работает, т.е. не определяет, что типа форма есть.


Цитата(DrBoom @  30.8.2009,  14:06 Найти цитируемый пост)
Для этого есть свойство innerTEXT... пользоваться этим свойством можно тж как и innerHTML\outerHTML   Тж есть интересный метод для объектов тэгов, называется CreateTextRange и возвращаемый им объект TextRange.

Не получается. Причем, я уже встречался с этим, но как поймать - не пойму.

Вот, допустим, такой код
Код

<body>
Текст
<img src="sdfd">
Еще текст
</body>

Как поймать слово Текст?

Автор: I_Am_Rock 30.8.2009, 18:19
Я, кстати, обратил внимание - закрывающего тега body в странице нет! Может, из-за этого не получалось?

Автор: DrBoom 30.8.2009, 18:27
I_Am_Rock, а строковые функции такие, как InStr$, Mis$ и остальные, на что? Получаем текст с помощью innerTEXT из нашего body, и начинаем колдовать со строками.

Цитата(I_Am_Rock @  30.8.2009,  18:03 Найти цитируемый пост)
Нет, не подошло.

Ну значит задача куда сложнее, однако "инструменты", нужные функции\объекты, которые Вам могут помочь уже перечислены. Да, возможно, придётся поломать голову, но конкретного примера к Вашей задаче я привести не могу, т.к. все документы строятся по-разному, с разной структурой и поведением работы. Ковыряйте DOM-документа и пользуйтесь практически всеми его возможностями, которые представлены в объекте document. TextRange, свойства innerHTML и подобные, стили, коллекции объектов тэгов и прочее. 

ЗЫ. Я верю в Вас smile  Вы найдёте решение. Я уже говорил, но скажу ещё раз, пробуйте, эксперементируйте, импровизируйте. Решение есть, может и не в три и не в десять сток, но есть -- вот увидите  smile 

Автор: I_Am_Rock 30.8.2009, 19:16
Большое спасибо, буду пробовать. Если получится - отпишу здесь. Если не получится - тоже.  smile 

У Вас нет ссылок к документации по DOM? Где есть побольше про innerHTML. Я гуглил, но то, что находил, написано как-то разрозненно...

Автор: Akina 31.8.2009, 08:13
Цитата(I_Am_Rock @  30.8.2009,  20:16 Найти цитируемый пост)
У Вас нет ссылок к документации по DOM? Где есть побольше про innerHTML. Я гуглил, но то, что находил, написано как-то разрозненно...

http://search.microsoft.com/results.aspx?mkt=ru-RU&setlang=ru-RU&q=innerHTML
Уточняй запрос...

Автор: neic 3.9.2009, 07:54
Есть аддон специально для IE, называется IE Spy.
Разработана челом с улицвб.ру

Если найдёшь её, все проблемы отпадут.

Добавлено через 1 минуту и 49 секунд
Вот нашёл на винче у себя.

Добавлено через 2 минуты и 57 секунд
Этот аддон позволяет узнать ID любого объекта. Просто переключаешься в режим шпиона и выбираешь нужный элемент.

Автор: DrBoom 3.9.2009, 19:14
neic, ИМХО, лучше тогда воспользоваться IE8, нажав кнопку F12 smile Хорошее и приятное средство сделали они (сами знаете кто smile) -- ни раз помогало в работе с веб, ибо оно не только IDы говорит, а практически всё, что может пригодится. Единственное, нужно ещё привыкнуть к работе с этим средством, но это дело времени и желаний.

Автор: neic 3.9.2009, 23:09
DrBoom, IE8 не пользуюсь, так что про функционал его не знаю (кроме основного).

Также у автора темы может не быть IE8...да-да его конечно же можно скачать и установить.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)