2017-04-26 2 views
1

I 웹 양식을 채우기 위해 다음 코드를 가지고 있지만이 특정 웹 사이트의 코드가 작동하지 않는 :VBA Internet Explorer를 WebForm의 채울 수없는

Const loginSelectSistema_Name = "url" 
Const loginInputUsuário_Name = "Usuario" 
Const loginInputSenha_Name = "Senha" 
Const loginInputOk_Name = "imageField2" 

Const USERNAME = "NomeUsuário" 
Const PASSWORD = "SenhaAcesso" 

Dim ieApp As InternetExplorer 
Dim iePage As HTMLDocument 

Function loginPage() 
    ' 
    Set ieApp = New InternetExplorer 
    ' 
    ieApp.Visible = True 
    ieApp.navigate (loginWebsite) 
    ' 
    'Wait for page to load 
    Do Until ieApp.ReadyState = READYSTATE_COMPLETE 
    Loop 
    ' 
    ' 
    Set iePage = ieApp.Document 
    ' 
    fillInputObject loginSelectSistema_Name, "jcaa" 
    fillInputObject loginInputUsuário_Name, USERNAME 
    fillInputObject loginInputSenha_Name, PASSWORD 
    ' 
    iePage.all.Item(loginInputOk_Name).Click 
End Function 

Private Sub fillInputObject(ByVal objectName As String, ByVal value As String, Optional IdentificadorElemento As IdentificadorElementoHTML = Nome) 
' 
'Preenche o Objeto Input com um determinado valor 
    Dim elementHTML As HTMLObjectElement 
    ' 
    If (IdentificadorElemento = Nome) Then 
     Set elementHTML = iePage.getElementsByName(objectName).Item 
    End If 
    ' 
    If (IdentificadorElemento = Id) Then 
     Set elementHTML = iePage.getElementById(objectName) 
    End If 
    ' 
    If (IsObject(elementHTML)) Then 
     If (Not (elementHTML Is Nothing)) Then 
      elementHTML.value = value 
     End If 
    End If 
End Sub 

때 디버깅 기능 fillInputObject의 라인 : If (Not (elementHTML Is Nothing)) Then 값은 항상 Nothing이며 webform은 채워지지 않습니다.

<table width="90%" cellspacing="0" cellpadding="0" bordercolor="#DADADA" border="1" bgcolor="#F7F7F8" align="center" height="110"> 
    <tbody><tr height="2"><td width="62"></td><td width="0"></td><td width="592"></td><td width="223"></td></tr> 
      <tr height="15"> 
      <td colspan="4" bordercolor="#F7F7F8" style="vertical-align:left"><strong>Selecione o Sistema:</strong></td> 
      </tr> 
      <tr height="15"> 
      <td colspan="4" bordercolor="#F7F7F8" style="vertical-align:left"> 
       <font size="1px" face="Verdana, Arial, Helvetica, sans-serif"> 
       <select name="url" class="combobox" style="width:180px;"> 

       <option value="jcaa">Cadastro de Alunos</option> 
       <option value="paef">Cadastro Funcional</option> 
       <option value="paec">Controle de Freqüência</option> 
       <option value="papc">Desp de Pessoal (SDPE)</option> 

       <option value="jcgo">Cargos</option> 
       <option value="paea">Contagem de Tempo</option> 
       <option value="jata">Formação Curricular</option> 
       <option value="jrha">Gratificação/Promoção QM</option> 
       <option value="paex">PAEX - Cadastro Funcional</option> 
       </select> 
      </font> 
      </td> 
      </tr> 
      <tr height="2"><td colspan="4" bordercolor="#F7F7F8"></td></tr> 
      <tr><td colspan="2" bordercolor="#F7F7F8" align="left"> 
        <font size="1" face="Verdana, Arial, Helvetica, sans-serif"> 
         Usuário 
        </font> 
       </td> 
       <td colspan="2" bordercolor="#F7F7F8" align="left"> 
        <input id="Usuario" name="Usuario" size="10" maxlength="10" value="SE0452336A" type="text"> 
       </td></tr> 
      <tr><td colspan="2" bordercolor="#F7F7F8" align="left"> 
        <font size="1" face="Verdana, Arial, Helvetica, sans-serif"> 
        Senha 
        </font> 
       </td> 
       <td colspan="2" bordercolor="#F7F7F8" align="left"> 
        <input id="Senha" name="Senha" size="14" maxlength="14" type="password"> 
       </td></tr> 
      <tr> 
       <td colspan="2" bordercolor="#F7F7F8" align="left"> 
        <font size="1" face="Verdana, Arial, Helvetica, sans-serif">&nbsp; 

        </font> 
       </td> 
       <td colspan="2" bordercolor="#F7F7F8" align="left"> 
        <input name="imageField2" src="images/ok_sen.gif" width="24" type="image" border="0" height="17"> 
       </td></tr> 

     </tbody></table> 

내가 잘못 뭐하는 거지 :

아래는 내가 웹 양식을 채우기 위해 노력하고 HTML의 페이지는?

+0

은'Nome'과'IdentificadorElementoHTML가'어떻게 구현에 무엇입니까? – dee

+0

@dee IdentificadorElementoHTML은 Nome (정수를 나타냅니다.)의 일부 요소를 보유하는 Enum입니다. 코드의 유연성을 높이기위한 것이고, 값이 Nome이면 값이 Id 인 경우 요소의 이름을 가져오고, 요소는 ID에 의해 얻고, 등등 ... 그것은 단지 웹 페이지 요소 식별자에 달려있다 ... – tdmsoares

+0

주어진 HTML로 코드를 테스트 할 때'Usuario'와'Senha'에 대해 잘 작동한다. 'loginInputUsuário_Name'과'loginInputSenha_Name'에 어떤 값이 있습니까? – dee

답변

1

마지막 줄에 제공된 URL은 문제를 보여줍니다. 로그인 양식은 IFrame 안에 있으므로 현재 문서는 요소가 없기 때문에 요소에 대해 알지 못합니다.

IFrame의 문서가 검색에 사용되도록 코드를 약간 수정해야합니다.

Set iePage = ieApp.document 

Dim fr As HTMLIFrame 
Set fr = iePage.frames("aplicativos") 

Dim iframeDoc As HTMLDocument 
Set iframeDoc = iePage.frames("aplicativos").document 

fillInputObject iframeDoc, loginSelectSistema_Name, "jcaa" 
fillInputObject iframeDoc, loginInputUsuário_Name, USERNAME 
fillInputObject iframeDoc, loginInputSenha_Name, PASSWORD 

iframeDoc.all.Item(loginInputOk_Name).Click 

그리고 기능 fillInputObject 수정은 그래서 오른쪽 Document 개체를 사용합니다.

Private Sub fillInputObject(doc As HTMLDocument, ByVal objectName As String, ByVal Value As String, Optional IdentificadorElemento As IdentificadorElementoHTML = Nome) 
' 
'Preenche o Objeto Input com um determinado valor 
    Dim elementHTML As HTMLObjectElement 
    ' 
    If (IdentificadorElemento = Nome) Then 
     Set elementHTML = doc.getElementsByName(objectName).Item 
    End If 
    ' 
    If (IdentificadorElemento = ID) Then 
     Set elementHTML = doc.getElementById(objectName) 
    End If 
    ' 
    If (IsObject(elementHTML)) Then 
     If (Not (elementHTML Is Nothing)) Then 
      elementHTML.Value = Value 
     End If 
    End If 
End Sub 

enter image description here

+0

남자, 너 멋지다! 나는 거기에 프레임이 있다는 것을 깨닫지 못했습니다! 고맙습니다! – tdmsoares

+0

@tdmsoares 당신을 환영합니다! – dee

관련 문제