Html VBA通过两步登录登录到网站

Html VBA通过两步登录登录到网站,html,excel,vba,internet-explorer,login,Html,Excel,Vba,Internet Explorer,Login,正如标题所述,我在htdoc.all.verificationcode.Value=otp处出现错误 它显示运行时错误“438”: 对象不支持此属性或方法 我花了一个下午的时间试图找出问题所在,我真的希望你们能帮我解决 Dim HTMLDoc As HTMLDocument Dim htdoc As HTMLDocument Dim MyBrowser As InternetExplorer Sub login() Dim username As Range Dim password As Ra

正如标题所述,我在htdoc.all.verificationcode.Value=otp处出现错误

它显示运行时错误“438”: 对象不支持此属性或方法

我花了一个下午的时间试图找出问题所在,我真的希望你们能帮我解决

Dim HTMLDoc As HTMLDocument
Dim htdoc As HTMLDocument
Dim MyBrowser As InternetExplorer
Sub login()
Dim username As Range
Dim password As Range
Dim otp As Range
Dim myValue As Variant
Dim MyHTML_Element As IHTMLElement
Dim MyURL As String
MyURL = "XXXXXXXXXXXXXXXXXXXXXX"
Set MyBrowser = New InternetExplorer
MyBrowser.silent = True
MyBrowser.navigate MyURL
MyBrowser.Visible = True
Set username = Range("B1")
Set password = Range("B2")
Set otp = Range("B3")
Do
Loop Until MyBrowser.readyState = READYSTATE_COMPLETE
Set HTMLDoc = MyBrowser.document
HTMLDoc.all.UserId.Value = username
HTMLDoc.all.password.Value = password
For Each MyHTML_Element In HTMLDoc.getElementsByTagName("input")
If MyHTML_Element.Type = "submit" Then MyHTML_Element.Click: Exit For
Next

MyURL2 = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
MyBrowser.silent = True
MyBrowser.navigate MyURL2
MyBrowser.Visible = True
myValue = InputBox("Enter OTP")
Range("B3").Value = myValue
Application.Wait (Now + TimeValue("0:00:10"))

Do
Loop Until MyBrowser.readyState = READYSTATE_COMPLETE
Set htdoc = MyBrowser.document
htdoc.all.verificationcode.Value = otp
For Each MyHTML_Element In htdoc.getElementsByTagName("input")
If MyHTML_Element.Type = "btnobj" Then MyHTML_Element.Click: Exit For
Next


Err_Clear:
 If Err <> 0 Then
 Err.Clear
 Resume Next
 End If

End Sub



HTML in the webpage for the form is
<input name="verficationcode" id="verficationcode" type="password" size="18" maxlength="16" autocomplete="off">
<input name="btnobj" class="inputbutton" id="submitButton" onclick="checkSubmit(this);" type="button" value="Submit">
Dim HTMLDoc作为HTMLDocument
作为HTMLDocument的Dim htdoc
将MyBrowser设置为InternetExplorer
子登录()
将用户名设置为范围
将密码设置为范围
调暗otp As范围
Dim myValue作为变量
将MyHTML_元素设置为IHTMlement
将MyURL设置为字符串
MyURL=“XXXXXXXXXXXXXXXXXX”
设置MyBrowser=New InternetExplorer
MyBrowser.silent=True
MyBrowser.navigate MyURL
MyBrowser.Visible=True
设置用户名=范围(“B1”)
设置密码=范围(“B2”)
设置otp=范围(“B3”)
做
循环,直到MyBrowser.readyState=readyState\u完成
设置HTMLDoc=MyBrowser.document
HTMLDoc.all.UserId.Value=用户名
HTMLDoc.all.password.Value=密码
对于HTMLDoc.getElementsByTagName(“输入”)中的每个MyHTML_元素
如果MyHTML\u Element.Type=“submit”,则MyHTML\u Element.Click:退出以获取
下一个
MyURL2=“xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx”
MyBrowser.silent=True
MyBrowser.navigate MyURL2
MyBrowser.Visible=True
myValue=InputBox(“输入OTP”)
范围(“B3”)。值=myValue
Application.Wait(现在+时间值(“0:00:10”))
做
循环,直到MyBrowser.readyState=readyState\u完成
设置htdoc=MyBrowser.document
htdoc.all.verificationcode.Value=otp
对于htdoc.getElementsByTagName(“输入”)中的每个MyHTML_元素
如果MyHTML_Element.Type=“btnobj”,则MyHTML_Element.Click:退出
下一个
错误清除:
如果错误为0,则
呃,明白了
下一步继续
如果结束
端接头
表单网页中的HTML为

好的。这看起来是个好的开始。您将进入一个页面,输入一些值并单击Submit>。您没有将MyBrowser.visible设置为False,因此我假设您可以看到这一情况

您需要做的第一件事是等待MyBrowser在您
之后加载页面。单击
提交>。每次进入新页面时,您都需要等待;我最喜欢的是把所有的等待都排成这样一行

MyHTML_Element.Click
Do While (MyBrowser.Busy Or MyBrowser.readyState <> READYSTATE_COMPLETE): DoEvents: Loop
dim  myOTP as string
myOTP = MyBrowser.getElementsById("One_Time_Password").innerText

现在您已经存储了密码,可以对其进行操作。

有什么原因不能在代码中使用从标准获取其值的私有/公共变量,或从XMLHTTP post的responseText读取OTP吗?我是新手,但我还没有学会这一点。谢谢你的帮助!别担心。开始编写一些代码,如果遇到问题,请回来编辑您的问题,以包括您自己的努力(注意产生任何错误的行以及错误消息)。我会期待的!请参阅最近的一个示例。我已经完成了一些代码,但我又卡住了…谢谢你,吉普车,我稍后会尝试。我的OTP被发送到我的手机,我在主登录页面后的inputbox提示符中键入它,这会将我的OTP放入单元格。我可以将myOTP设置为单元格吗?例如,设置myOTP=range(“B3”)。在我完成等待之后,我在哪里继续填写OTP字段?@JustinMichaelChia-很抱歉,每个网页都使用不同的方法传递OTP。您需要指定网页的实际URl,以便检查其方法,或编辑原始问题以包含足够的代码,以便我们确定方法。这可能是一个问题,因为我需要登录才能访问OTP页面。我会看看我能从网站上得到什么你有我可以发送HTML代码的电子邮件吗?也许我们可以在那里讨论一些事情
dim  myOTP as string
myOTP = MyBrowser.getElementsById("One_Time_Password").innerText