Vb.net 自动网站登录:SetAttribute不工作

Vb.net 自动网站登录:SetAttribute不工作,vb.net,winforms,Vb.net,Winforms,我正在创建一个程序仪表板,其中一个功能是用户使用程序中存储的凭据自动登录到网站(无需打开chrome或FF) 在程序中,“等待任务延迟”正在工作,我看到用户名和密码字段在提交前填充(单击),但当它尝试提交时,内置在表单中的浏览器会表现为页面为空且未输入凭据?我应该提到的是,我可以看到表单中输入的用户名和密码,但是页面的行为就像什么都没有输入一样。我做错了什么 旁注:我们连接到的站点上的按钮没有元素ID,只显示了一个类型…因此,Invokemember(“单击”)的解决方法 感谢您的帮助

我正在创建一个程序仪表板,其中一个功能是用户使用程序中存储的凭据自动登录到网站(无需打开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事件。因此,添加处理程序并在登录完成后将其删除并不是错误的。这里可以做的是禁用触发登录过程的按钮,并在过程完成后再次启用。谢谢您的建议和输入,这里。我很感激!我一定会研究一下你的建议并试一试。如果您有问题(与此代码直接相关),请在此处发表评论。