我正在创建一个程序仪表板,其功能之一是使用程序中存储的凭据(无需打开chrome或FF)自动将用户登录到网站。
在程序中,等待任务延迟正在起作用,我看到用户名和密码字段在提交(单击)之前填充,但是当尝试提交时,内置在表单中的浏览器的行为就像页面为空并且没有凭证已经输入?我应该提及的是,我可以看到在表单中输入的用户名和密码,但是页面的行为就像没有输入任何内容。我在这里做错了什么?
旁注:我们要连接的站点上的按钮没有元素ID,仅显示类型...因此,Invokemember(“ Click”)的解决方法
感谢您的帮助。
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Label3.Visible = False
End Sub
Private Function login_thesite() As Task
WebBrowser1.Document.GetElementById("username").SetAttribute("value", "Username")
WebBrowser1.Document.GetElementById("Password").SetAttribute("value", "Password")
Dim allelements As HtmlElementCollection = WebBrowser1.Document.All
For Each webpageelement As HtmlElement In allelements
If webpageelement.GetAttribute("type") = "submit" Then
webpageelement.InvokeMember("click")
End If
Next
End Function
Private Property pageready As Boolean = False
#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
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If CheckBox1.Checked = True Then
login_thesite()
WaitForPageLoad()
End If
End Sub
Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged
TextBox1.Text = ""
TextBox2.Text = ""
Label3.Visible = True
WebBrowser1.Navigate("https://thesite.com/#/login")
WaitForPageLoad()
End Sub
End Class
答案 0 :(得分:1)
这里不需要任何async
过程。 WebBrowser.DocumentCompleted事件已被异步调用。 DoEvents()
即使没有破坏性,也同样没有用。
您只需要预订DocumentCompleted
事件并调用Navigate
方法,即可让WebBrowser加载远程Html资源。
当最终加载HtmlDocument
时,WebBrowser将发出其完成状态的信号,将其状态设置为WebBrowserReadyState.Complete
。
关于HTML输入元素和表单:
在这里,代码假设HtmlDocument中只有一个Form。
可能是这样,但事实并非如此。一个HTML文档可以有多个表单,并且每个框架可以有自己的文档。 iframe肯定会有一个。
阅读this answer(C#代码中的注释,但您只需要注释)以获取有关如何处理多个Frame / IFrame的更多信息
Button1
将接通DocumentCompleted
事件并致电 Navigate()
。
完成文档后,事件处理程序中的代码将运行并执行LogIn过程。
然后,事件处理程序将被删除,因为它已经完成了任务,并且您仍然需要将WebBrowser用于其他目的。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Button1.Enabled = False
WebSiteLogIn()
End Sub
Private Sub WebSiteLogIn()
AddHandler WebBrowser1.DocumentCompleted, AddressOf PageWaiter
WebBrowser1.Navigate("https://thesite.com/#/login")
End Sub
Private Sub PageWaiter(ByVal sender As Object, ByVal e As WebBrowserDocumentCompletedEventArgs)
If WebBrowser1.ReadyState = WebBrowserReadyState.Complete Then
WebBrowser1.Document.GetElementById("username").SetAttribute("value", "Username")
WebBrowser1.Document.GetElementById("Password").SetAttribute("value", "Password")
Dim allInputElements = WebBrowser1.Document.Body.All.
Cast(Of HtmlElement).Where(Function(h) h.TagName.Equals("INPUT")).ToList()
For Each element As HtmlElement In allInputElements
If element.GetAttribute("type").ToUpper().Equals("SUBMIT") Then
element.InvokeMember("click")
End If
Next
RemoveHandler WebBrowser1.DocumentCompleted, AddressOf PageWaiter
Button1.Enabled = True
End If
End Sub