【问题标题】:vb.net webbrowser documentcompleted event - page not loadingvb.net webbrowser documentcompleted 事件 - 页面未加载
【发布时间】:2012-09-05 13:08:11
【问题描述】:

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

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

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

这是我用于两个按钮和 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

谢谢!

【问题讨论】:

    标签: vb.net webbrowser-control


    【解决方案1】:
    WebBrowser1.Navigate(fullURL)
        Do While wb.ReadyState <> WebBrowserReadyState.Complete
            Application.DoEvents()
    
        Loop
    

    ;)

    【讨论】:

    • 哦,请至少在 .Doevents 之前或之后放一个“Sleep 100”,当涉及到人类等待任务时,我不忍心看到 .DoEvents 在这样的循环中(即:如果您正在计算某些东西,那么在正常的 for 循环中,这很好等)。 [赞成]
    • 理想情况下,您应该在 documentCompleted 事件中检查 WebBrowserReadyState.Complete,如果它准备好了,就在那里执行您的操作。例如,如果给定的页面有框架,documentCompleted 可能会触发几次,但它仍然比可能在循环中进行数百次迭代要好。与 OP 不同,这更针对其他观看此内容的人。不知道为什么它不为你开火……我从来没有遇到过它根本不开火的任何问题(尽管我对它多次开火的倾向感到恼火)可能是框架/脚本没有完成?
    【解决方案2】:

    当您说 DocumentCompleted 从未被触发时,您的意思是它根本没有被触发,还是您说 If 语句可能没有返回 True,因此内容(和单击操作)没有运行?

    此外,此页面上是否有任何框架或 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 毫秒的睡眠(等待),并在睡眠方法之后或之前放置一个 .DoEvents(在 .Threading 命名空间中) (我认为也可以在 .Threading 中找到)。

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

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

    请告诉我们,谢谢。

    【讨论】:

    • 感谢您的深入回复。
    • 感谢您的深入回复。肯定会触发 DC 事件,并且页面上没有框架。我认为实际上页面似乎没有加载的原因是在页面可见之前单击了继续按钮。然后当第二个页面加载时,单击继续按钮再次单击,进入某种循环。无论如何,我尝试了你的建议,但遇到了同样的问题,所以我放弃并使用了 While Not WebBrowser1.ReadyState = WebBrowserReadyState.Complete 来代替它。不过感谢您的帮助!我是菜鸟,学习其他方法很有用。
    • @mrniblets 好的,另外,如果您打算遇到带有框架或 iframe 的页面,请不要忘记对它们执行 .ReadyState,因为一旦所有框架上的 readystate 为 3 或以上页面,那么您几乎可以与元素“交互”,并且出于所有意图和目的,可以考虑加载页面(因此称为“交互模式”)。此外,等待页面加载很困难,如果您需要 100% 确定还有一系列其他事情需要考虑,请随时查看我的一些旧 WBC 帖子以了解更多信息,即:NavigateComplete 和 DC 事件计数。
    猜你喜欢
    • 1970-01-01
    • 2012-10-21
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多