我需要在 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 登录结构:
<INPUT>
和<BUTTON><SUBMIT>
内部 html 的动态重新定义(元素的属性会即时修改)。这意味着我们必须:
InnerText
和value
属性HtmlElement
event
和readystate
属性来确定当动画已经结束或推迟执行HtmlElement.SetAttribute
和HtmlElement.InvokeMember
。由于我们需要添加对mshtml
COM 库的引用来实现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] 删除。
我来说两句