WebBrowser1_DocumentCompleted 活动无法正常运作
WebBrowser1_DocumentCompleted event not working properly
我正在尝试调用 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
在哪里
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
由于 DocumentCompleted
也会在页面加载时触发,例如 <iframe>
,您可以检查 ReadyState
property 以确定页面是否已完全加载。
然后,为了找到您的元素(如果它是在页面加载后添加的),我会添加一个计时器,持续查看它是否存在,匹配 link.
的开头
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
事件仍然存在,目前如果您导航到不同的页面,计时器将再次启动。如果这不是您想要的,请告诉我您需要它如何工作,我也可以解决这个问题。
我正在尝试调用 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
在哪里
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
由于 DocumentCompleted
也会在页面加载时触发,例如 <iframe>
,您可以检查 ReadyState
property 以确定页面是否已完全加载。
然后,为了找到您的元素(如果它是在页面加载后添加的),我会添加一个计时器,持续查看它是否存在,匹配 link.
的开头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
事件仍然存在,目前如果您导航到不同的页面,计时器将再次启动。如果这不是您想要的,请告诉我您需要它如何工作,我也可以解决这个问题。