【发布时间】:2017-11-29 19:11:30
【问题描述】:
我正在使用网络浏览器导航到一个网站,然后自动登录。一切正常,直到评论“导航事件”输入一个凭据后,它将登录并导航到另一个网站。事件发生后,任何代码都不会起作用,因为它没有选择新站点。我正在使用 waitforpageload() 函数让我知道它何时完成加载,但是当我检查 url 时它仍然指向原始站点。任何想法为什么会这样做以及如何解决它?
Private Property pageready As Boolean = False
webBrowser1.Navigate("https://www.lamedicaid.com/sprovweb1/provider_login/provider_login.asp")
waitforpageload()
Dim allelements As HtmlElementCollection = webBrowser1.Document.All
For Each webpageelement As HtmlElement In allelements
'NPI #
If webpageelement.GetAttribute("name") = "Provider_Id" Then
webpageelement.SetAttribute("value", "xxxxxx")
End If
'Clicking enter to input NPI
If webpageelement.GetAttribute("name") = "submit1" Then
webpageelement.InvokeMember("focus")
webpageelement.InvokeMember("click")
waitforpageload()
End If
'Navigation event happens here
'Entering username
If webpageelement.GetAttribute("name") = "Login_Id" Then
webpageelement.SetAttribute("value", "xxxxxxx")
End If
'Entering Password
If webpageelement.GetAttribute("name") = "Password" Then
webpageelement.SetAttribute("value", "xxxxxxxxx")
End If
'logging in
If webpageelement.GetAttribute("name") = "submit_button" Then
webpageelement.InvokeMember("focus")
webpageelement.InvokeMember("click")
waitforpageload()
End If
#Region "Page Loading Functions"
Private Sub waitforpageload()
AddHandler webBrowser1.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 webBrowser1.ReadyState = WebBrowserReadyState.Complete Then
pageready = True
RemoveHandler webBrowser1.DocumentCompleted, New WebBrowserDocumentCompletedEventHandler(AddressOf PageWaiter)
End If
End Sub
#End Region
【问题讨论】:
-
第一件事,你有太多的
waitforpageload()方法调用。设置元素属性时无需等待任何内容。然后,一个考虑:您是否只需要对这两个站点执行此操作?如果是这样,您只需要一个用于DocumentComplete()的事件处理程序。设置一个逻辑来区分站点,可能使用它们的页面标题(或其他一些元素),并采取相应的措施。 -
@Jimi 第二个页面有一个新的 URL,但是当我在处理第一个页面后导航到它时,它把我踢了出去。将导航视为新页面。此外,我还更新了 waitforpagetoload() 方法调用。我会考虑利用页面标题或其他元素。
-
@Jimi(和 Cole):第三件事,不要使用
waitforpageload()! -
@Cole Perrault “把我踢出去”是未定义的。稍等一下:(1)导航第一个 URL(...导航...)=>
DocumentComplete()已触发 =>(2)设置登录值->InvokeMember()=>登录接受 =>(...导航...)=>DocumentComplete()被解雇 (3) LandingPage-> New LogIn form-> SetValues-> InvokeMember => LogIn 接受 => (...navigating...)=>DocumentComplete()(4) LandingPage - > 在这里做任何你需要做的事情