VBA document.all.item仅适用于用户名但不适用于密码

时间:2015-05-13 21:54:43

标签: excel vba excel-vba url

首先,这里是代码:(代码与vba-open-website的标准代码没什么不同,如果节省你的时间阅读,我放了< ------- --HERE 表示我输入密码的位置

Sub Login_2Wiki()

Dim ieApp As InternetExplorer
 Dim ieDoc As Object
 Dim ieTable As Object
 Dim clip As DataObject
 Dim iusr As Object
 Dim ipwd As Object
 Dim iform As Object

'create a new instance of ie
 Set ieApp = New InternetExplorer

'you don’t need this, but it’s good for debugging
 ieApp.Visible = True

'assume we’re not logged in and just go directly to the login page
 ieApp.Navigate "https://xxx.xxxxx.com/login.action?"
 Do While ieApp.Busy: DoEvents: Loop
 Do Until ieApp.ReadyState = READYSTATE_COMPLETE: DoEvents: Loop

Set ieDoc = ieApp

'fill in the login form – View Source from your browser to get the control names
 With ieDoc
 Set iform = .Document.getElementById("login-container")
 Set iusr = iform.Document.getElementById("os_username")
 iusr.Value = "guest"
 Set ipwd = iform.Document.getElementById("os_password")
 ipwd.Value = "abc"

 .Document.getelementsbyname("loginButton")(0).Click
 End With
 Do While ieApp.Busy: DoEvents: Loop
 Do Until ieApp.ReadyState = READYSTATE_COMPLETE: DoEvents: Loop


'close 'er up
 ieApp.Quit
 Set ieApp = Nothing

End Sub  

以及此处网页上源代码的一部分(如果重要的话,它是 Atlassian Confluence 页面):

<div class="field-group
"
    >
<label id="os_username-label" for="os_username">
Username
    </label>

            <input type="text" name="os_username" id="os_username" class="text   " placeholder="Username" data-focus="0"     />
                  </div>                        

<div class="field-group">
<label id="os_password-label" for="os_password">
Password
    </label>
<input type="password" name="os_password" id="os_password"  class="password " placeholder="Password"  />
              </div>                        

问题:代码只在网页上填写了用户名而不是密码。它没有错误。另外我注意到网页的源视图中有 data-focus =&#34; 0&#34; ,并想知道是否是导致问题的原因。

  编辑:我已经用 .Document.all.Item 替换了 .Document.all.Item    .Document.getElementById 方法,虽然代码可以找到元素os_password(没有错误),但它无法为其赋值。 os_username和以前一样工作。

2 个答案:

答案 0 :(得分:1)

尝试:

With .Document.getElementById("os_password")
    .Focus()
    .Value = "abc"
End With

答案 1 :(得分:1)

我不相信重点与您的问题有关。如果A1是 ActiveCell ,那就好像说Range("B1") = "abc"。只要您将字符串直接传输到.Value属性,焦点就不应成为问题。如果你发送击键,那么焦点可能会变得很重要,但我们不会这样做。

我遇到了类似的情况,这是一个多用途的登录页面。相同的目标网页&#39;为买家和卖家提供单独的登录表格。我怀疑仔细检查该页面后面的HTML会显示实际上有两个具有相同名称/ ID的元素(例如 os_password )。除此之外,.Document.all.Item("something")方法可用于名称或ID;不是分配值的最权威方法。您似乎正在设置标识为 os_password 的内容;只是不正​​确的 os_password

如果出现这种情况,则必须将输入的密码作为要处理的表单的子项,而不是整个文档正文。如果您的表单的ID为 Second_Form ,那么您将访问输入字段,如下所示:

    dim eFRM as MSHTML.IHTMLElement
    set eFRM  = ieApp.document.getElementById("Second_Form")
    eFRM.getElementById("os_username").Value = "guest"
    eFRM.getElementById("os_password").Value = "abc"
    'don't use names to locate elements - horribly unreliable
    eFRM.submit