VBA - 登录网站然后填写文本元素的网站表单

时间:2018-03-12 07:27:14

标签: html excel vba excel-vba

我刚刚开始使用VBA,我正在尝试编写一个脚本,与网站进行以下交互:

  1. 登录网站

  2. 在后续网页中,从Excel电子表格中填写名字和姓氏,然后点击"提交"

  3. 在随后的网页中,复制生成的ID号

  4. 我已设法通过getElementsById让我的代码登录网站,因为网站的元素没有任何名称。但是,excel会为后续代码返回类型不匹配错误,以便与后续网页进行交互。

    以下是后续网页中firstnamelastnamesubmit字段的HTML脚本:

    名字字段:

    <input class="tfield-def-edit form-control" id="tfield-def-edit_12803" type="text">
    

    姓氏字段:

    <input class="tfield-def-edit form-control" id="tfield-def-edit_12804" type="text">
    

    提交按钮:

    <button class="btn btn-block btn-success" id="btn-submit-registration" type="button">Submit</button>
    

    以下是我的VBA代码:

    Sub getid()
    
    Set IE = CreateObject("InternetExplorer.Application")
    IE.Visible = True
    URL = "https://example.website"
    
    IE.Navigate2 URL 'load webpage
    
    Do While IE.readyState <> 4 Or _
       IE.Busy = True
       DoEvents
    Loop
    
    'login using password
    Set login = IE.document.getElementById("passkey")
    login.Value = "123456"
    Set loginbutton = IE.document.getElementById("login")
    loginbutton.Click
    
    -------------------------------CODE ABOVE WORKS-----------------------------
    ------------------------------ERRORS OCCUR BELOW----------------------------
    
    While IE.Busy
        DoEvents
    Wend
    
    Dim i As Integer
    Dim LastRow as Long
    
    With Worksheets("Sheet1")
    
        Set LastRow = .Range("A" & .Rows.Count).End(xlUp).Rows
    
        For i = 1 To LastRow
    
            Set firstname_field = IE.document.getElementById("tfield-def-edit_12803") 'error most probably occur here
            Set lastname_field = IE.document.getElementById("tfield-def-edit_12804")
            Set submitbutton = IE.document.getElementById("btn-submit-registration")
    
            firstname_field.Value = .Range("B" & i).Value
            lastname_field.Value = .Range("C" & i).Value
            submitbutton.Click
    
            While IE.Busy
                DoEvents
            Wend
    
            Set newregistrationbutton = IE.document.getElementByClassName("btn btn-default")
            Set codeid = IE.document.getElementsByClassName("col-xs-6 col-xs-offset-3")
            .Range(D & i).Value = codeid(0).textContent
            newregistrationbutton.Click
    
        Next i
    End With
    
    End Sub
    

    我最好的猜测是,名字和姓氏字段是文本元素,不能是Set的值。当我尝试删除所有文本元素的Set时,VBA会抛出一个错误&#34; Object Required&#34;。

    我还试图复制第一个和最后一个名称页面成功运行后在后续页面中生成的ID。我无法测试此代码的最后4行,因为上述代码无效。

    我已经花了好几天的时间,如果你们所有人都能对此有所了解,我将非常感激。

1 个答案:

答案 0 :(得分:0)

你的代码工作得很好我只是在虚拟页面上测试它很好,我认为是带有字段的页面(“tfield-def-edit_12803”,“tfield-def-edit_12804”)你是试图改变它的值总是改变所以总是给你

  

运行时错误'13':输入不匹配

所以你必须要做的就是找出它在页面中的创建位置然后从那里获取ID,我希望这有帮助。

或者可能在文档准备好后生成字段尝试等待5秒然后获取数据使用此等待

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub test()
Dim i As Long

For i = 1 To 10
    Debug.Print Now()
    Sleep 5000    'wait 5 seconds
Next i
End Sub 
相关问题