Webbrowser 自动登录,没有输入框的 id/name

技术员

我需要在 VB.NET 中使用 WebBrowser 控件自动登录网站(https://kite.zerodha.com/),但问题是输入字段没有任何 id/name 以便搜索元素并设置值,这是我在该输入文本字段上使用检查元素时显示的内容。

<input type="text" placeholder="User ID" autocorrect="off" maxlength="6" autofocus="autofocus" autocapitalize="characters" animate="true" label="" rules="[object Object]" dynamicwidthsize="8"> event

[更新] 我尝试了下面的代码并且能够设置值,但是当我调用方法(提交按钮)时,两个输入都为空。

        Dim ele As HtmlElement
        ele = WebBrowser1.Document.GetElementsByTagName("input")(0)
        ele.SetAttribute("value", "test")
        ele = WebBrowser1.Document.GetElementsByTagName("input")(1)
        ele.SetAttribute("value", "test")

[更新2]

这段代码帮助我将文本插入到文本框中。

    WebBrowser1.Document.Forms(0).GetElementsByTagName("input")(0).SetAttribute("innertext", "username")
    WebBrowser1.Document.Forms(0).GetElementsByTagName("input")(0).SetAttribute("value", "username")
    WebBrowser1.Document.Forms(0).GetElementsByTagName("input")(1).SetAttribute("innertext", "password")
    WebBrowser1.Document.Forms(0).GetElementsByTagName("input")(1).SetAttribute("value", "password")

吉米

我仔细查看了 WebForm 登录结构:

  • HTML 输入和提交元素实现了一个生成动画的事件。
  • 元素具有附加的html<INPUT><BUTTON><SUBMIT>内部 html 的动态重新定义(元素的属性会即时修改)。

这意味着我们必须:

  • 设置InnerTextvalue属性HtmlElement
  • 使用IHTMLScriptElement接口的eventreadystate属性来确定当动画已经结束推迟执行HtmlElement.SetAttributeHtmlElement.InvokeMember

由于我们需要添加对mshtmlCOM 库的引用来实现IHTMLScriptElement接口,所以这里我选择了延迟执行方法:它只需要一个异步任务。

我使用 aDictionary(Of Uri, String)来存储登录地址和相应的 UserId/Password 对。然后在DocumentCompleted事件中解析该集合以确定当前是否WebBrowser.Url需要登录过程。
如果是这种情况 - 并且WebBrowser.Document.Forms集合不为空(实际上需要填写一个表单) - 将DoWebFormLogin调用Async函数,传递执行登录所需的用户 ID 和密码。

Dim loginAddresses As New Dictionary(Of Uri, String)() From {
    {New Uri("https://kite.zerodha.com"), "testId|TestPassword1"},
    {New Uri("https://www.someothersite.com/login") "[email protected]|ThePassword1"}
}

Private Async Sub WebBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
    Dim wb As WebBrowser = DirectCast(sender, WebBrowser)
    If wb.ReadyState <> WebBrowserReadyState.Complete OrElse wb.Document.Forms.Count = 0 Then Return
    Dim values As String = String.Empty
    If loginAddresses.TryGetValue(wb.Url, values) Then
        Dim usrPwd = values.Split("|"c)
        Await DoWebFormLogin(wb, usrPwd(0), usrPwd(1))
    End If
End Sub

Private Async Function DoWebFormLogin(wb As WebBrowser, usrId As String, pwd As String) As Task
    Dim userIDSet As Boolean = False
    Dim passwordSet As Boolean = False
    Dim inputElms = wb.Document.GetElementsByTagName("INPUT").OfType(Of HtmlElement)().ToList()
    If inputElms.Count < 2 Then
        Return
    End If
    For Each elm As HtmlElement In inputElms
        If elm.GetAttribute("type").Equals("text") Then
            elm.Focus()
            Await Task.Delay(50)
            elm.InnerText = usrId
            elm.SetAttribute("value", usrId)
            userIDSet = True
        End If
        If elm.GetAttribute("type").Equals("password") Then
            elm.Focus()
            Await Task.Delay(50)
            elm.InnerText = pwd
            elm.SetAttribute("value", pwd)
            passwordSet = True
        End If

        If userIDSet AndAlso passwordSet Then
            Dim buttonElms = wb.Document.GetElementsByTagName("BUTTON").OfType(Of HtmlElement)().ToList()
            For Each button As HtmlElement In buttonElms
                If button.GetAttribute("type").Equals("submit") Then
                    button.Focus()
                    Await Task.Delay(50)
                    button.InvokeMember("click")
                    Exit For
                End If
            Next
        End If
    Next
End Function

相同过程的 C# 版本,因为您要标记两种语言:

Dictionary<Uri, string> loginAddresses = new Dictionary<Uri, string>()
{
    { new Uri("https://kite.zerodha.com"), "testId|TestPassword1" },
    { new Uri("https://www.someothersite.com/login") "[email protected]|ThePassword1" }
};

private async void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    var wb = sender as WebBrowser;
    if (wb.ReadyState != WebBrowserReadyState.Complete || wb.Document.Forms.Count == 0) return;
    if (loginAddresses.TryGetValue(wb.Url, out string values)) {
        var usrPwd = values.Split('|');
        await DoWebFormLogin(wb, usrPwd[0], usrPwd[1]);
    }
}

private async Task DoWebFormLogin(WebBrowser wb, string usrId, string pwd)
{
    bool userIDSet = false;
    bool passwordSet = false;
    var inputElms = wb.Document.GetElementsByTagName("INPUT").OfType<HtmlElement>().ToList();
    if (inputElms.Count < 2) return;
    foreach (var elm in inputElms)
    {
        if (elm.GetAttribute("type").Equals("text")) {
            elm.Focus();
            await Task.Delay(50);
            elm.InnerText = usrId;
            elm.SetAttribute("value", usrId);
            userIDSet = true;
        }
        if (elm.GetAttribute("type").Equals("password")) {
            elm.Focus();
            await Task.Delay(50);
            elm.InnerText = pwd;
            elm.SetAttribute("value", pwd);
            passwordSet = true;
        }

        if (userIDSet && passwordSet) {
            var buttonElms = wb.Document.GetElementsByTagName("BUTTON").OfType<HtmlElement>().ToList();
            foreach (var button in buttonElms) {
                if (button.GetAttribute("type").Equals("submit")) {
                    button.Focus();
                    await Task.Delay(50);
                    button.InvokeMember("click");
                    break;
                }
            }
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

带有WebBrowser控件的Excel CustomTaskPane-键盘/焦点问题

尽管我使用#idname选择了所有ID,但为什么所有ID都不会改变?

没有输入时的输入框验证

DOM找到2个具有非唯一ID #idName的元素

C#WebBrowser单击提交按钮没有响应

WPF / WebBrowser-没有重载匹配委托

自动填充具有预定值的输入框

如何确定自动登录是否可以在WebBrowser控件上使用?

Webbrowser完成不显示所有元素

在Webbrowser中获取完整的输入标签字符串

如何填写WebForm并单击带有WebBrowser控件的Submit按钮?

将具有className的元素添加到具有idName的其他元素

Windows窗体中的Webbrowser控件无法登录

.NET Webbrowser控件-自动输入弹出的登录表单

为什么我的输入框阴影没有被重置?

具有自定义IDownloadManager的WebBrowser控件的AccessViolationException

C#WebBrowser没有加载页面

如何确认WebBrowser中的脚本错误对话框?

带有Doctype的WebBrowser中的不同JavaScript行为

具有包含WebBrowser的C#Windows窗体的Selenium

无法使用WebBrowser控件登录

输入框中的“取消”按钮没有关闭

在C#Winforms对话框中使用WebBrowser控件

使用 WebBrowser 自动填写 AngularJS 表单

VB.NET Webbrowser,htmlelement 通过没有 ID 的元素获取文本框

如何在WebBrowser控件中自动输入

getElementById(idname) 如何找到正确的元素,而 element.id 将 id 显示为“”而不是“idname”?

输入框自动

自动填充输入框