如何确定自动登录是不是适用于 WebBrowser 控件?

Posted

技术标签:

【中文标题】如何确定自动登录是不是适用于 WebBrowser 控件?【英文标题】:How can I determine if an automated login worked on the WebBrowser control?如何确定自动登录是否适用于 WebBrowser 控件? 【发布时间】:2018-09-06 20:55:20 【问题描述】:

我正在使用 WebBrowser 控件来确定站点列表是否使用其出厂默认用户名和密码。但是,我遇到了麻烦,因为一旦登录完成,我用来模拟登录的 DocumentCompleted 也会被调用。

此外,当它工作时,它会循环并错误地报告其他几个站点具有默认登录。

我已经注意到这些问题,今天下午无法解决。不知道是因为我累了,还是因为我隔壁的那个人每隔一段时间就唱他喜欢的某个新乐队的歌词。

如果不出意外,有时它可以帮助我将所有内容输入并在第二天阅读,也许我的一些工作资源可以帮助其他人。

问题:

使用默认凭据跟踪实际站点的误报 当页面 404 或加载意外页面时停止处理

代码:

Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    WebBrowser.Navigate(linqData(i).URL)

End Sub

Private Sub WebBrowser_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser.DocumentCompleted

    ' Check for Default Login
    Login("administrator", "password")

    ' Determine Results
    If WebBrowser.Url.ToString.Contains("index.php") Then
        ' Successfully Logged In
        LogData("Successfully Logged In to " & linqData(i).Name)
        NextSite()
    ElseIf WebBrowser.Url.ToString.Contains("loginfailed.php") Then
        ' Failed to Login
        NextSite()
    End If

End Sub

Sub Login(Username As String, Password As String)
    Dim FoundUsernameTextbox As Boolean = False
    Dim FoundPasswordTextbox As Boolean = False

    Try
        ' Find Username Textbox
        Try
            WebBrowser.Document.GetElementById("nameInput").InnerText = Username
            FoundUsernameTextbox = True
        Catch ex As Exception

        End Try

        ' Find Password Textbox
        Try
            WebBrowser.Document.GetElementById("pass").InnerText = Password
            FoundPasswordTextbox = True
        Catch ex As Exception

        End Try

        ' Find Login Button and Click
        Try
            If FoundUsernameTextbox And FoundPasswordTextbox Then
                WebBrowser.Document.GetElementById("submit").InvokeMember("click")
            End If
        Catch ex As Exception

        End Try

    Catch ex As Exception

    End Try
End Sub

Sub NextSite()

    Try

        i += 1

        If i < linqDataRecordCount Then
            WebBrowser.Navigate(linqData(i).URL)
        Else
            LogData("Finished at " & DateTime.Now)
        End If

    Catch ex As Exception

    End Try

End Sub

【问题讨论】:

【参考方案1】:

在 DocumentCompleted 中,您应该检查事件 url 是否是浏览器的目标 url。这样可以确保在页面完全加载后调用一次代码。

此外,您正在调用 Login,然后继续处理再次处理浏览器的代码。这可能会导致不需要的行为。你应该有一个 Else 并在那里尝试登录。

If e.Url = WebBrowser.Url Then    
    ' Determine Results
    If WebBrowser.Url.ToString.Contains("index.php") Then
        ' Successfully Logged In
        LogData("Successfully Logged In to " & linqData(i).Name)
        NextSite()
    ElseIf WebBrowser.Url.ToString.Contains("loginfailed.php") Then
        ' Failed to Login
        NextSite()
    Else
        Login("administrator", "password")
    End If
End If

将 Login 设为布尔函数也是一个好主意。如果找不到要调用的登录元素,则返回 false 并重试或转到下一个站点。

【讨论】:

以上是关于如何确定自动登录是不是适用于 WebBrowser 控件?的主要内容,如果未能解决你的问题,请参考以下文章

C# winform webbrowser 自动登录网站?

c#添加webBrowser控件,如何实现自动填写打开的网页中的登录帐号,密码,并且自动登陆?

wpf下如何去除webbrowser的滚动条

C# 使用webBrowser控件获取网页中的账号密码登录网页元素并自动填写模拟自动登录?

具有自动代理登录的 WebBrowser 控件

VB中如何让WebBrowser打开一个网址后就自动跳转到另一个网址