WebBrowser. Как программно кликнуть по элементу?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
igor_m
Постоялец
Постоялец
 
Сообщения: 343
Зарегистрирован: 22.03.2002 (Пт) 12:40

WebBrowser. Как программно кликнуть по элементу?

Сообщение igor_m » 01.12.2012 (Сб) 22:10

Как в WebBrowser на загруженной странице программно кликнуть по объекту у которого известен ID ?
Конкретно по этому объекту id="where_222222".

<div class="where active" id="where_222222">
<span class="buttons">
<span class="btn enabled"
onclick = "onSendRequestButtonClick(this, {subscriberId:222222});"
return false;"
><i></i></span>
</span>
<span class="running">
<img src="Images/processing.gif" alt=" " />
</span>
</div>

Sam777e
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 157
Зарегистрирован: 16.09.2010 (Чт) 4:33

Re: WebBrowser. Как программно кликнуть по элементу?

Сообщение Sam777e » 01.12.2012 (Сб) 23:48

Когда-то давно писал нечто аналогичное; если найду - сообщу.

Но вот совсем свежая тема - там говорится не о "на коленке сделанных" вещах [ это я про свой старый код ] - а про интересный и нормальный софт. В теме даны две ссылки.

VB + Selenium = автоматическое тестирование web приложений
viewtopic.php?f=1&t=44273

С уважением
Здоровья и удачи

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 01.12.2012 (Сб) 23:55

Тут везде ссылки на соответствующие темы. Но мне искать лень...

Кстати, мне кажется, селениум не станет работать с контролом.

Sam777e
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 157
Зарегистрирован: 16.09.2010 (Чт) 4:33

Re: WebBrowser. Как программно кликнуть по элементу?

Сообщение Sam777e » 02.12.2012 (Вс) 1:25

Примерно так

1. Подключаю библиотеку MSHTML
Library MSHTML
C:\WINDOWS\system32\MSHTML.TLB
Microsoft HTML Object Library

2. Объявляю
Код: Выделить всё
Public wbDoc As MSHTML.HTMLDocument
Public oHTMLGenericElement As MSHTML.HTMLGenericElement
Public buttn As MSHTML.HTMLGenericElement
Public j As Long    ' <<<=== !!


3. Получаю объект wbDoc и ищу там нужную Кнопку;
в моем случае Кнопка на Web-странице звучала так [ в HTML ]
<input type="submit" class="srch" id="q_3" value="Search">

4. Потом buttn.Click .

Обрати внимание, что поиск ведется с установленного тобой заранее значения j !

У меня так:
'<input type="submit" class="srch" id="q_3" value="Search">
If FindElementByTagNameAndClassName_part_Value( "INPUT", "srch" ) Then

Код: Выделить всё
If FindElementByTagNameAndClassName_part_Value( "INPUT", "srch" ) Then
   Set buttn = oHTMLGenericElement
Else
. . .
End If
.
.
.

Public Function FindElementByTagNameAndID_part_Value( _
      theTagName As String, the_ID_part_Value As String) As Boolean
 
  FindElementByTagNameAndID_part_Value = False
 
  With wbDoc
    Do While j < .all.Length
      Set oHTMLGenericElement = .all(j)
      If Not oHTMLGenericElement.tagName = theTagName Then GoTo Next_j
          If InStr(UCase$(oHTMLGenericElement.ID), UCase$(the_ID_part_Value)) > 0 Then
            FindElementByTagNameAndID_part_Value = True
            Exit Function
          End If
        On Error GoTo 0
Next_j:
      j = j + 1
    Loop
  End With
   
  MsgBox "Function FindElementByTagNameAndID_part_Value!", , "Done :  Not finded !"
End Function
.
.

Public Function FindElementByTagNameAndClassName_part_Value( _
      theTagName As String, the_ClassName_part_Value As String) As Boolean
 
  FindElementByTagNameAndClassName_part_Value = False
 
  With wbDoc
    Do While j < .all.Length
      Set oHTMLGenericElement = .all(j)
      If Not oHTMLGenericElement.tagName = theTagName Then GoTo Next_j
          If InStr(UCase$(oHTMLGenericElement.className), UCase$(the_ClassName_part_Value)) > 0 Then
            FindElementByTagNameAndClassName_part_Value = True
            Exit Function
          End If
               
        On Error GoTo 0

Next_j:
      j = j + 1
    Loop
  End With
   
  MsgBox "Function FindElementByTagNameAndClassName_part_Value!", , "Done :  Not finded !"
End Function


Почему-то я искал не по ID, а по class.

В твоем случае
<div class="where active" id="where_222222">
<span class="buttons">
<span class="btn enabled"

я бы сначала искал по "DIV" и ID="where_222222";
потом продолжил бы ( т.е., не меняя j ! ) по "SPAN" и class="btn enabled".

Код, конечно, страшный [ ибо я - быдлокодер, увы . . . ] - но работал.

Модератору: если сочтете нужным - смело удаляйте все, чтобы я не портил знания / представления другим дурным образцом.

С уважением
Здоровья и удачи

Sam777e
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 157
Зарегистрирован: 16.09.2010 (Чт) 4:33

Re: WebBrowser. Как программно кликнуть по элементу?

Сообщение Sam777e » 02.12.2012 (Вс) 2:05

Qwertiy писал(а):Кстати, мне кажется, селениум не станет работать с контролом.

Не знаю. И где здесь вообще контрол ?

Я впервые узнал о Селениуме из указанной темы. На моем компьютере практически невозможно что-либо проверить [ слишком слабый по всем параметрам ].

Вот пример с http://code.google.com/p/selenium-vba/

Script example with Excel : Execute a simple search and paste a screenshot in a sheet
Код: Выделить всё
Public Sub TC001()
   Dim selenium As New SeleniumWrapper.WebDriver
   selenium.start "firefox", "http://www.google.com/"
   selenium.open "http://www.google.com"
   selenium.type "name=q", "Eiffel tower"
   selenium.click "name=btnG"
   selenium.wait 1000
   selenium.captureScreenshotToClipboard
   selenium.stop
   Sheets(1).Range("A10").PasteSpecial       'Paste the screenshoot at range A10
End Sub

selenium.click "name=btnG" <<<=== !!

А это со страницы Google :

' <button id="gbqfb" aria-label="Поиск в Google" class="gbqfb" name="btnG"> <<<=== !!
С уважением
Здоровья и удачи

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 02.12.2012 (Вс) 12:08

Sam777e писал(а):
Qwertiy писал(а):Кстати, мне кажется, селениум не станет работать с контролом.

Не знаю. И где здесь вообще контрол ?

Я так понимаю, на форме лежить контрол WebBrowser и надо в нём щёлкнуть по div'у.

igor_m
Постоялец
Постоялец
 
Сообщения: 343
Зарегистрирован: 22.03.2002 (Пт) 12:40

Re: WebBrowser. Как программно кликнуть по элементу?

Сообщение igor_m » 02.12.2012 (Вс) 13:32

Sam777e, спасибо тебе!

С добавлением метода научного тыка сделал.
Как оказалось, кликать там надо не по div, а по второму span.
Я просто определил j для второго span. В этом div всего 5 элементов, можно было посмотреть их индексы (j) простым msgbox.
А дальше ясно:
If j = 1 Then Set mBtn = oHTMLGenericElement
...
...
mBtn.Click

Еще раз спасибо! А то давно уже ничего не пишу и не знал с какой стороны подойти, кроме как попробовать каким-то образом использовать WebBrowser.
Удачи!

Sam777e
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 157
Зарегистрирован: 16.09.2010 (Чт) 4:33

Re: WebBrowser. Как программно кликнуть по элементу?

Сообщение Sam777e » 02.12.2012 (Вс) 14:06

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

igor_m писал(а):Как оказалось, кликать там надо не по div, а по второму span.

Ну, я так и писал.
Sam777e писал(а):В твоем случае
<div class="where active" id="where_222222">
<span class="buttons">
<span class="btn enabled"

я бы сначала искал по "DIV" и ID="where_222222";
потом продолжил бы ( т.е., не меняя j ! ) по "SPAN" и class="btn enabled".


И тебе спасибо за теплые слова.

Маленькое примечание для [ ох, многих ! ] , задающих вопросы.
В старт-топике человек сразу дал всю информацию, необходимую для результативного ответа - честь ему и хвала ! А то идет и идет диалог и по каплям выбиваешь - а что, тебе друг, собственно, нужно ? И, зачастую, отвечают: "Ну какой же ты непонятливый, чего ты спрашиваешь ' На чем рация, на лампах или на транзисторах ? ' - я ведь уже писал ' На бронетранспортере ! ' "
Здоровья и удачи

ark
Бывалый
Бывалый
 
Сообщения: 216
Зарегистрирован: 18.07.2011 (Пн) 0:57

Re: WebBrowser. Как программно кликнуть по элементу?

Сообщение ark » 03.12.2012 (Пн) 3:26

WebBrowser1.Document.getElementById("where_222222").firstChild.nextSibling.click()

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 03.12.2012 (Пн) 7:31

ark писал(а):WebBrowser1.Document.getElementById("where_222222").firstChild.nextSibling.click()

Такое можно выполнять только в Document_Comtleted или позже. Иначе можно получить Nothing на одном из шагов.
Хотя, я предыдущий код не смотрел, возможно там так же.

ark
Бывалый
Бывалый
 
Сообщения: 216
Зарегистрирован: 18.07.2011 (Пн) 0:57

Re: WebBrowser. Как программно кликнуть по элементу?

Сообщение ark » 03.12.2012 (Пн) 8:17

Qwertiy писал(а):Такое можно выполнять только в Document_Comtleted или позже. Иначе можно получить Nothing на одном из шагов
Естественно
igor_m писал(а):Как в WebBrowser на загруженной странице


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 42

    TopList