Vb.net 自动网站登录:SetAttribute不工作
我正在创建一个程序仪表板,其中一个功能是用户使用程序中存储的凭据自动登录到网站(无需打开chrome或FF) 在程序中,“等待任务延迟”正在工作,我看到用户名和密码字段在提交前填充(单击),但当它尝试提交时,内置在表单中的浏览器会表现为页面为空且未输入凭据?我应该提到的是,我可以看到表单中输入的用户名和密码,但是页面的行为就像什么都没有输入一样。我做错了什么 旁注:我们连接到的站点上的按钮没有元素ID,只显示了一个类型…因此,Invokemember(“单击”)的解决方法 感谢您的帮助Vb.net 自动网站登录:SetAttribute不工作,vb.net,winforms,Vb.net,Winforms,我正在创建一个程序仪表板,其中一个功能是用户使用程序中存储的凭据自动登录到网站(无需打开chrome或FF) 在程序中,“等待任务延迟”正在工作,我看到用户名和密码字段在提交前填充(单击),但当它尝试提交时,内置在表单中的浏览器会表现为页面为空且未输入凭据?我应该提到的是,我可以看到表单中输入的用户名和密码,但是页面的行为就像什么都没有输入一样。我做错了什么 旁注:我们连接到的站点上的按钮没有元素ID,只显示了一个类型…因此,Invokemember(“单击”)的解决方法 感谢您的帮助
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
这里不需要任何
async
过程。已异步调用该事件DoEvents()
如果没有中断,同样是无用的
您只需订阅DocumentCompleted
事件并调用Navigate
方法,即可让WebBrowser加载远程Html资源
最后加载HtmlDocument
时,WebBrowser将发出完成信号,将其状态设置为WebBrowserReadyState.Complete
关于Html输入元素和表单:这里,代码假设该HtmlDocument中只有一个表单。
可能是这样,但可能不是这样。一个Html文档可以有多个表单,每个框架可以有自己的文档。IFrames肯定每个都有一个 阅读(C#代码,但您只需要注释)中的注释,了解有关如何处理多个帧/iFrame的更多信息
按钮1
将连接DocumentCompleted
事件并调用导航()
文档完成后,事件处理程序中的代码将运行并执行登录过程。
然后删除事件处理程序,因为它已完成任务,您仍需要将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
您是否在等待文档加载完成?使用DocumentCompleted事件。那么为什么会发生所有异步/等待事件?@LarsTech是的,文档已完全加载。@LarsTech我是vb新手,正在进行故障排除。请摆脱DoEvents和while循环。去掉AddHandler,只需在其末尾完成方法Handles DocumentCompleted
。该事件将在加载文档后激发。Loginthesite不再是一个任务函数,看起来它应该只是一个Sub。您的按钮单击正在检查文档,然后等待加载页面。听起来不对。在我们进入调试部分之前,您需要修复所有这些问题。您的代码可以添加多个AddHandler,但并不总是添加相应的RemoveHandler。不知道为什么你甚至想在AddHandler和RemoveHandler这两个东西之间进行切换。只需通过设计器添加一次事件即可完成。@LarsTech根据OP的说法,在登录完成后也会使用WebBroser;登录后访问的所有网页都将引发DocumentCompleted事件。因此,添加处理程序并在登录完成后将其删除并不是错误的。这里可以做的是禁用触发登录过程的按钮,并在过程完成后再次启用。谢谢您的建议和输入,这里。我很感激!我一定会研究一下你的建议并试一试。如果您有问题(与此代码直接相关),请在此处发表评论。