Vb.net WebBrowser1\u DocumentCompleted事件工作不正常

Vb.net WebBrowser1\u DocumentCompleted事件工作不正常,vb.net,webbrowser-control,Vb.net,Webbrowser Control,当网页完全加载时,我试图调用sub或函数从网页中提取URL Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted If WebBrowser1.Url.ToString = URL1 Then URLCode(WebBrowser1.Document

当网页完全加载时,我试图调用sub或函数从网页中提取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
在哪里

所以问题是函数是在页面完全加载之前启动的。另外,当我把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>
URLCodeWebBrowser1.Document.Links21.OuterHtml应提取此部分:aadty aawty

由于DocumentCompleted在页面加载时也会触发,例如,可以检查以确定页面是否已完全加载

然后,要查找元素是否在页面加载后添加,我需要添加一个计时器,该计时器会持续查找元素是否存在,并匹配链接的开头

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
循环中的值变量包含/company/quick view/之后的文本。我让它从解析后的HTML元素中读取,而不是从它的字符串表示中读取,因此您不再需要URLCode函数


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

但是,在网页完全加载之前,不管是否有WebBrowser1.Url.ToString=URL1,函数都会启动。另外,URLCode之前的Msgbox也会解决这个问题。@Jovica:这是不可能的。If语句检查页面是否已完全下载并由浏览器呈现,否则不会通过。请注意,这不会也永远不会考虑Javascript,因为Javascript可能会在页面加载后添加元素。如果添加类似MsgBox的延迟有效,则最有可能发生这种情况。@Jovica:请向我显示您要获取的元素的HTML代码,以及它周围的一些代码。单击按钮时,它将生成组合的URL1字符串,然后通过webbrowser打开URL1。网页打开后,web URLCodeWebBrowser1.Document.Links21.OuterHtml中存在URL。DocumentCompleted事件将在单击之前提供页面中的URL代码。使用msgbox或通过另一个按钮单独启动URLCode函数将给出正确的结果。@Jovica:明白了。我编辑了几次我的评论,请重新阅读。
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