自动网站登录:SetAttribute不起作用

时间:2019-01-03 19:49:47

标签: vb.net winforms

我正在创建一个程序仪表板,其功能之一是使用程序中存储的凭据(无需打开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     

1 个答案:

答案 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