vb.net webbrowser documentcompleted事件 - 页面未加载

时间:2012-09-12 13:35:30

标签: vb.net webbrowser-control

我已经搜索了围绕WebBrowser DocumentCompleted事件的其他问题,但似乎没有人遇到我遇到的确切问题。

我正在尝试在航空公司网站上自动搜索航班。我使用的第一个URL每次都是相同的,除了日期部分,因此很容易让WebBrowser通过组合字符串来获取URL。但是,该页面是一个免责声明页面,其中包含“继续”按钮,需要在显示价格之前单击该按钮。如果我在表单上使用一系列按钮,我可以通过单击button1到达第一个URL,然后单击button2单击“继续”按钮。它工作正常。

但是,我想删除单击button2的需要,因此尝试使用WebBrowser DocumentCompleted事件。我遇到的问题是第一页似乎永远不会在webbrowser中完全加载,因此永远不会点击该按钮。

这是我用于两个按钮和DocumentCompleted事件

的代码
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    TextBox1.Text = fullURL
    WebBrowser1.Navigate(fullURL)

    End Sub


    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

    Dim allElements As HtmlElementCollection = WebBrowser1.Document.All

    For Each webpageelement As HtmlElement In allElements

        If webpageelement.GetAttribute("src") = proceedbuttonattribute Then

            webpageelement.InvokeMember("click")

        End If

    Next

    End Sub

Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted

    If TextBox1.Text.StartsWith(firstURL) = True Then 'make sure that button is only clicked after first webpage loads

        Dim allElements As HtmlElementCollection = WebBrowser1.Document.All

        'Click 'Proceed to Booking' button
        For Each webpageelement As HtmlElement In allElements

            If webpageelement.GetAttribute("src") = proceedbuttonattribute Then

                webpageelement.InvokeMember("click")

            End If

        Next

    End If

    End Sub

谢谢!

2 个答案:

答案 0 :(得分:2)

WebBrowser1.Navigate(fullURL)
    Do While wb.ReadyState <> WebBrowserReadyState.Complete
        Application.DoEvents()

    Loop

答案 1 :(得分:1)

当你说DocumentCompleted从未被触发时,你的意思是它根本没有被触发,或者你是说If语句可能没有返回True,因此内容(和点击动作)没有被运行? / p>

此外,此页面上是否有任何框架或iframe?因为,如果存在,DocumentCompleted将不会运行,直到每个帧都加载并完成,如果它是一个ajaxed帧,那么这将引入mroe问题。所需要的是其中一个帧无法正确加载或保持“交互”模式(其中.readystate = 3)而不是完全正确加载(其中.readystate = 4)这将阻止DocumentCompleted事件来自被触发。

此外,您还等待DC事件触发多长时间?

有更好的解决方法,您需要做的就是运行Do / While循环,使用与DC事件完全相同的代码,它只会坐在那里(在调用.Navigate2之后)和只要等到该按钮显示在DOM中,并且只要以下内容返回True,您就可以使用.InvokeMember并单击按钮。

If webpageelement.GetAttribute("src") = proceedbuttonattribute Then

因此,在这种情况下,您将创建另一个名为“WaitUntilButtonFound”的函数,并且可能在每个循环之间放置100毫秒的Sleep(等待),并在Sleep方法之后或之前放置.DoEvents(在.Threading命名空间中找到) (也见于.Threading我认为)。

这样,只要相关按钮出现在文档对​​象模型中,您就可以单击它,如果需要,一旦找到它,您可以再等2-3到3秒(如果您愿意,不真正的需要)然后点击它。因为在DOM中找到该按钮是指示页面已加载或部分加载(相关或必要部分已完成加载),以便您可以恢复您想要对该按钮执行的操作(即,在它出现后立即点击它。事实上,这也是向前迈进的最快捷方式。

你怎么看?让我知道你如何去,如果你需要更多的帮助或指导。此外,如果您可以告诉我们DC事件是否绝对没有被触发,或者只是您的IF语句阻止DC在DC事件中运行代码,那将是有帮助的,因为如果DC事件正在触发但内部代码没有运行,因为其中的If语句,这与DC完全不同甚至根本没有被触发。

请告诉我们,谢谢。