VB.Net - 通过多线程访问WebBrowser

时间:2016-05-20 07:34:18

标签: vb.net multithreading webbrowser-control

我试图编写一个包装类来在使用WebBrowser控件的网站上进行一些自动化测试。问题是,当我尝试访问WebBrowser属性 - webBrowser.DocumentText时 - 线程失败并且属性为空。

 Imports AutoItX3Lib
 Imports System.Threading.Tasks
 Imports System.Random
 Imports System.Threading

 Public Class Bot

     Private Property pageready As Boolean = False
     Private AutoitCommand As New AutoItX3

     Private webBrowser As WebBrowser
     Private keyword As String
     Private clientUrl As String
     Private numPages As Integer

     Private botThread As Thread
     Private CriticalSection As New Object

     Sub New(ByVal webBrowser As WebBrowser, _
             ByVal keyword As String, _
             ByVal clientUrl As String, _
             ByVal numPages As Integer)
         Me.webBrowser = webBrowser
         Me.keyword = keyword
         Me.clientUrl = clientUrl
         Me.numPages = numPages
     End Sub

     Public Sub Start()
         Try
             botThread = New Thread(New ThreadStart(AddressOf DoWork))
             botThread.Start()
             botThread.SetApartmentState(ApartmentState.STA)
         Catch ex As Exception
         End Try
     End Sub

     Public Sub Sleep(ByVal ms As Long)
         Try
             Thread.Sleep(ms)
         Catch ex As Exception
         End Try
     End Sub

     Public Sub Abort()
         Try
             botThread.Abort()
         Catch ex As Exception
             'Do nothing
         End Try
     End Sub

     Private Sub DoWork()

         For i = 1 To numPages
             SyncLock CriticalSection
                 SetWebBrowserNavigate(Url)
                 WaitForPageLoad()

                 Dim initHtml As String = webBrowser.DocumentText
                 Dim htmlLink As String = String.Empty
                 Dim links As HtmlElementCollection =  webBrowser.Document.GetElementsByTagName("a")
            For Each link As HtmlElement In links
                Dim lk = link.GetAttribute("href")
                If link.GetAttribute("href").Contains(clientUrl) Then
                    htmlLink = link.OuterHtml
                    Exit For
                End If
            Next

            For Each link As HtmlElement In links
                link.OuterHtml = htmlLink
            Next

            AutoitCommand.MouseClick("left", 100, 130, 1, 1)
        End SyncLock
    Next
    Me.Abort()

End Sub

Private Sub WaitForPageLoad()
    AddHandler webBrowser.DocumentCompleted, New WebBrowserDocumentCompletedEventHandler(AddressOf PageWaiter)
    While Not pageready
        Application.DoEvents()
    End While
    pageready = False
End Sub

Private Sub PageWaiter(ByVal sender As Object, ByVal e As WebBrowserDocumentCompletedEventArgs)
    If webBrowser.ReadyState = WebBrowserReadyState.Complete Then
        pageready = True
        RemoveHandler webBrowser.DocumentCompleted, New WebBrowserDocumentCompletedEventHandler(AddressOf PageWaiter)
    End If
End Sub

Delegate Sub SetWebBrowserNavigateCallback(ByVal url As String)
Private Sub SetWebBrowserNavigate(ByVal url As String)
    If webBrowser.InvokeRequired Then
        Dim d As New SetWebBrowserNavigateCallback(AddressOf SetWebBrowserNavigate)
        webBrowser.Invoke(d, New Object() {url})
    Else
        webBrowser.Url = New Uri(url)
    End If
End Sub

结束班

0 个答案:

没有答案