我已经搜索了围绕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
谢谢!
答案 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完全不同甚至根本没有被触发。请告诉我们,谢谢。