Используя VBA, чтобы щелкнуть ссылку javascript, вы получите ошибку «Требуется объект» - PullRequest
0 голосов
/ 19 марта 2020

Я пытаюсь получить доступ к веб-сайту на IE, используя VBA, чтобы получить отчет о транзакциях за предыдущие недели. Я смог войти и перейти на страницу отчета. Однако, когда я пытаюсь щелкнуть ссылку для расширенного поиска, я получаю сообщение об ошибке «Требуется объект»

Ниже указан HTML, который я выделил как принадлежащий ссылке:

<!-- Form Actions -->


<input type="button" id="searchtTxn" value="Search"
    class="align-right margin-top"
    style="float: right; font-size: 11px; margin-top: 5px;">
**<div id="secondary-button"
    style="border: none; background: none; height: 26px; font-size: 11px; float: right;">
    <a href="javascript:void(0);" id="moreOptions" class="mouseover"><strong>More
            Options</strong>**
    </a>
</div>

В частности, я пытаюсь выбрать пункт «moreOptions». Я также попытался выбрать на основе класса "mouseover" без удачи. Я также попытался создать сохраненный отчет, который я мог бы просто щелкнуть на основе класса и идентификатора. HTML для этого поиска ниже:

<div class="div-scroll portletContentJS" 
 style="height:145px !important;" id="savedSearchPortlet" 
  style="overflow-y: auto;">


     <div class="savedsearch-record"> 
     <table style="width:100%;" class='draggable' >

     <tr>
         <td class="wrap-savedsearch-report">
         <div class="constrained"> 
         <a href="javascript:void(0);" class="searchtResultTxn hasTooltip"
          id="164035" style="text-decoration: underline;font-size:11px; padding-left: 2px;">Prev Week ACH </a>
           <div class="hidden"> 
            <!-- This class should hide the element, change it if needed -->
            <table>
               <tr> 
                    <td style='word-wrap:break-word;word-break:break-all;max-width:150px;min-width:50px;'>Prev Week ACH</td>
              </tr>
            </table>
        </div>

Я использую приведенный ниже VBA для доступа к веб-сайту и перейдите на страницу мне нужно. Ошибки кода при попытке вытащить элемент «moreOptions». Я добавил 20-секундное время ожидания на странице, которое не работает, если ссылка еще не была доступна, но безрезультатно. Я поднялся до 1 минуты безрезультатно.

Sub login1()
  Dim IE As Object
  Dim HTMLDoc As Object
  Dim objCollection As Object
  Dim allHREFs As New Collection


  Const navOpenInNewTab = &H800
  Set IE = CreateObject("InternetExplorer.Application")
  IE.Visible = True
  IE.Navigate "https://www.treasury.pncbank.com/idp/esec/login.ht"

  Do While IE.Busy Or IE.readyState <> 4: Loop

  Set HTMLDoc = IE.Document

  With HTMLDoc
  HTMLDoc.getElementById("txtUserID").value = "XXXX"
  HTMLDoc.getElementById("txtOperID").value = "XXXXXX"
  HTMLDoc.getElementById("txtPwd").value = "XXXXXX"
  End With


  Set objCollection = IE.Document.getElementById("loginFormButton")
  objCollection.Click

Do While IE.Busy Or IE.readyState <> 4: Loop
Application.Wait (Now + TimeValue("0:00:10"))
   Set objCollection = IE.Document.getElementById("IR")
  objCollection.Click
  Application.Wait (Now + TimeValue("0:01:00"))
   Set objCollection = IE.Document.getElementById("moreOptions")
  objCollection.Click
  Do While IE.Busy Or IE.readyState <> 4: Loop
End Sub

Любая помощь здесь будет принята с благодарностью. Пожалуйста, дайте мне знать, если вам нужны дополнительные детали. Поскольку это банковский веб-сайт, я не смогу предоставить учетные данные для входа, но сообщите мне, если вам потребуется больше кода HTML.

РЕДАКТИРОВАТЬ, чтобы добавить полную страницу HTML

image

1 Ответ

0 голосов
/ 24 марта 2020

Мне удалось определить, что элемент "moreOptions" находится внутри iFrame, я отредактировал свое исходное сообщение, чтобы получить полную HTML для страницы. Я вижу, что элемент "IR" находится за пределами iFrame.

Чтобы получить доступ к элементам, расположенным внутри тега, сначала нужно найти тег iframe, а затем получить доступ к элементам. Вы пытаетесь использовать следующий код для получения элементов из Iframe:

IE.Document.getElementsbyTagName("iframe")(0).contentDocument.getElementbyId("txtcontentinput").Value = "BBB"
IE.Document.getElementsbyTagName("iframe")(0).contentDocument.getElementbyId("btncontentSayHello").Click

[Примечание] Индекс массива начинается с 0. Если веб-сайт содержит несколько тегов iframe, обязательно используйте правильный индекс массива. Кроме того, вы можете использовать метод getElementbyId (), чтобы найти тег iframe.

Подробный пример кода, как показано ниже:

индексная страница:

<input id="txtinput" type="text" /><br />
<input id="btnSayHello" type="button" value="Say Hello" onclick="document.getElementById('result').innerText = 'Hello ' + document.getElementById('txtinput').value" /><br />
<div id="result"></div><br />
<iframe width="500px" height="300px" src="vbaiframecontent.html">

</iframe>

vbaframeContent. html

<input id="txtcontentinput" type="text" /><br />
<input id="btncontentSayHello" type="button" value="Say Hello" onclick="document.getElementById('content_result').innerText = 'Hello ' + document.getElementById('txtcontentinput').value" /><br />
<div id="content_result"></div>

Сценарий VBA, как показано ниже:

Sub extractTablesData1()    
    Dim IE As Object   

    Set IE = CreateObject("InternetExplorer.Application")

    With IE
        .Visible = True
        .navigate ("<your website url>")

        While IE.ReadyState <> 4
            DoEvents
        Wend

        'access elements outside the iframe tag and set value.
        IE.Document.getElementbyId("txtinput").Value = "AAA"
        IE.Document.getElementbyId("btnSayHello").Click

        'access elements inside the iframe tag.

    IE.Document.getElementsbyTagName("iframe")(0).contentDocument.getElementbyId("txtcontentinput").Value = "BBB"
    IE.Document.getElementsbyTagName("iframe")(0).contentDocument.getElementbyId("btncontentSayHello").Click



    End With
    Set IE = Nothing
End Sub

После запуска сценария результат будет следующим:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...