WebBrowser1_DocumentCompleted事件无法正常工作

时间:2018-01-14 09:34:39

标签: vb.net webbrowser-control

我正在尝试调用sub或function来在网页完全加载时从网页中提取URL。

 Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted

        If WebBrowser1.Url.ToString = URL1 Then

URLCode(WebBrowser1.Document.Links(21).OuterHtml)

        End If

End Sub

其中

Private Function URLCode(ByVal STR1 As String) As String

    Dim STRLen = Len(STR1)
    Dim IndexKod = STR1.IndexOf("quick-view/") + 12
    Dim STR2 As String = Strings.Mid(STR1, IndexKod, STRLen)
    URLCode = STR2.Substring(0, STR2.IndexOf(""""))

End Function

所以问题是在页面完全加载之前启动了函数。此外,当我在功能之前放置msgbox时,一切正常。我已经为这个问题尝试了一些可用的解决方案,但没有任何帮助。

有没有办法知道在没有此事件的情况下页面何时完全加载?

编辑1:

部分HTML代码

  <TR class="dx-row dx-data-row dx-row-alt ">
    <TD title=" " colspan="16">
      <DIV title=" " class="row">
      <DIV class="col-md-12 col-sm-12 col-xs-12">
      <DIV class="col-md-3 col-sm-6 col-xs-12">
      <H5 class="text-medium text-lg notranslate"><A href="/company/quick-view/aadty-aawty">COMPANY NAME</A>                                 <IMG class="country-flag-small" 
      src="/Assets/admin/content/flags/rs.png">                             
      </H5></DIV>

有问题的元素来自Firefox

<a href="/company/quick-view/aadty-aawty" title="COMPANY NAME">COMPANY NAME</a>

URLCode(WebBrowser1.Document.Links(21).OuterHtml)应提取此部分: aadty-aawty

1 个答案:

答案 0 :(得分:1)

由于DocumentCompleted也会在页面加载<iframe>时触发,因此您可以检查ReadyState property以确定网页是否已完全加载。

然后,为了找到你的元素,如果它在页面加载后添加,我会添加一个持续查看它是否存在的计时器,匹配链接的开头。

Dim WithEvents URLTimer As New Timer With {.Interval = 250}

Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted

    If WebBrowser1.ReadyState = WebBrowserReadyState.Complete Then
        URLTimer.Start()
    End If

End Sub

Private Sub URLTimer_Tick(sender As Object, e As EventArgs) Handles URLTimer.Tick
    For Each Element As HtmlElement In WebBrowser1.Document.Links
        Dim href As String = Element.GetAttribute("href")
        If href IsNot Nothing AndAlso href.StartsWith("/company/quick-view/") Then
            URLTimer.Stop()

            Dim Value As String = href.Remove(0, "/company/quick-view/".Length)
            MsgBox(Value)

            Exit For
        End If
    Next
End Sub

循环中的Value变量包含/company/quick-view/之后的文本。我从解析的HTML元素而不是它的字符串表示中读取它,因此您不再需要URLCode()函数。

注意:由于DocumentCompleted事件仍然附加,如果您导航到其他页面,目前计时器将再次启动。如果这不是你想要的,请告诉我你需要它如何工作,我也可以解决这个问题。