Заставьте WebBrowser нажать кнопку на веб-странице с определенным классом ОДИН РАЗ в VB.net

Я пытаюсь заставить веб-браузер щелкнуть определенную кнопку на веб-странице:

Код html для кнопки что-то вроде <a class="btn btn-large play"> и код, который у меня есть до сих пор, чтобы нажать эту кнопку:

For Each Element As HtmlElement In WebBrowser2.Document.GetElementsByTagName("a")
If Element.OuterHtml.Contains("btn btn-large play") Then
Element.InvokeMember("click")
End If

Это работает, но заставляет веб-браузер снова и снова нажимать кнопку. Любая идея, как я могу сделать это только дважды?


person Sarim Abbas    schedule 19.10.2013    source источник
comment
Этот цикл перебирает все элементы в данном документе. Предполагая, что существует только один элемент, содержащий текст OuterHtml btn btn-large play, он будет щелкнут только один раз при каждом использовании этого цикла. Из вашего кода я не знаю, когда/сколько раз используется этот цикл, но, предположительно, он находится внутри метода, который вызывается более одного раза.   -  person varocarbas    schedule 19.10.2013


Ответы (4)


может просто так? :)

For Each Element As HtmlElement In WebBrowser2.Document.GetElementsByTagName("a")
If Element.OuterHtml.Contains("btn btn-large play") Then
Element.InvokeMember("click")
Element.InvokeMember("click")
return
End If
person VladL    schedule 19.10.2013
comment
Если сейчас кнопка нажимается снова и снова, с вашим кодом она будет нажиматься 2 * (снова и снова) :) Это не похоже на решение того, на что жалуется ОП. - person varocarbas; 19.10.2013
comment
@varocarbas не должен возвращать выход из цикла после второго щелчка? - person VladL; 19.10.2013
comment
Как отмечалось выше, проблема, по-видимому, вызвана не самим циклом, а тем, где (методом) выполняется этот цикл, который, по-видимому, вызывается более одного раза. Если вы прервете цикл или выйдете из метода, это не позволит избежать повторного вызова этого метода. ОП должен объяснить, при каких условиях вызывается этот цикл. - person varocarbas; 19.10.2013
comment
@varocarbas или, может быть, есть всего пара кнопок, содержащих btn btn-large play? - person VladL; 19.10.2013
comment
Это также возможно (пара или сотня; это внешний текст ...), но если ОП не описывает условия лучше, помочь ему точно невозможно. - person varocarbas; 19.10.2013

И почему вы не пытаетесь определить тип элемента в веб-браузере:

Фрагмент кода, созданный @ElektroStudios, я просто халявщик, который вставляет код без указания авторства.

Dim Document As HtmlDocument

Private Sub WebBrowser_DocumentCompleted(ByVal sender As System.Object, ByVal e As WebBrowserDocumentCompletedEventArgs) _
Handles WebBrowser1.DocumentCompleted

    Document = sender.Document
    AddHandler document.Click, New HtmlElementEventHandler(AddressOf Document_Click)

End Sub

Private Sub Document_Click(ByVal sender As Object, ByVal e As HtmlElementEventArgs)

    Select Case Document.ActiveElement.TagName.ToLower
        Case "button" : MsgBox("You've clicked a button")
        Case "input" : MsgBox("You've clicked a input")
        Case "a" : MsgBox("You've clicked a link")
        Case Else
    End Select

End Sub

Позже вы можете заменить MsgBox("You've clicked a link") какой-либо функцией, событием или подпрограммой и делать, что хотите.. :D

person Seazoux    schedule 19.10.2013
comment
Предоставляя фрагменты кода без указания автора (Я), вы нарушаете условия SO. - person ElektroStudios; 19.10.2013

Попробуй это:

Public count as integer=0

Private Sub WebBrowser_DocumentCompleted(ByVal sender As System.Object,ByVal e As WebBrowserDocumentCompletedEventArgs) _
Handles WebBrowser1.DocumentCompleted

If count<2 then

For Each Element As HtmlElement In WebBrowser2.Document.GetElementsByTagName("a")
If Element.OuterHtml.Contains("btn btn-large play") Then
Element.InvokeMember("click")
End If

count=count+1
end if

End Sub
person Alejandro    schedule 21.10.2016

Было бы достаточно выйти из цикла FOR, когда вы уже щелкнули элемент один раз, поэтому попробуйте следующее:

For Each Element As HtmlElement In WebBrowser2.Document.GetElementsByTagName("a")

    If Element.OuterHtml.Contains("btn btn-large play") Then

        Element.InvokeMember("click")
        Exit For

    End If

Next Element 
person ElektroStudios    schedule 19.10.2013