Доступ к объекту в iframe с помощью VBA

по существу:

я успешно использовал VBA, чтобы сделать следующее:

  • войдите на веб-сайт с помощью getElementsByName

  • выберите параметры для отчета, который будет создан (с помощью getelementsby...)

  • создание отчета после выбора параметров, которые отображают результирующий набор данных в iframe на той же странице

важно отметить - веб-сайт клиентская сторона

выше была простая часть, сложная часть, как показано ниже:

нажатие на gif-изображение в iframe, которое экспортирует набор данных в csv

я попробовал следующее:

Dim idoc As HTMLDocument
Dim iframe As HTMLFrameElement
Dim iframe2 As HTMLDocument

Set idoc = objIE.document
Set iframe = idoc.all("iframename")
Set iframe2 = iframe.contentDocument

    Do Until InStr(1, objIE.document.all("iframename").contentDocument.innerHTML, "img.gif", vbTextCompare) = 0
        DoEvents
    Loop

чтобы дать некоторый контекст логике выше -

  • я получил доступ к основной раме
  • я получил доступ к iframe по его элементу name
  • я получил доступ к материалам внутри iframe
  • я попытался найти gif-изображение, которое нужно щелкнуть, чтобы экспортировать в csv

именно в этой строке он спотыкается, говоря: "объект не поддерживает это свойство или метод"

также попытался получить доступ к iframe gif с помощью элемента a и атрибута href, но это полностью не удалось. Я также попытался захватить изображение из исходного URL-адреса, но все это приведет меня к странице, на которой находится изображение от.

Примечание: iframe не имеет ID и, как ни странно, gif-изображение не имеет элемента/события" onclick"

окончательное рассмотрение-попытка очистки iframe с помощью R

доступ к HTML-узлу iframe был простым, однако попытка получить доступ к атрибутам iframe и впоследствии узлы таблицы оказались безуспешными. Все это возвращается "Символ(0)"

library(rvest)
library(magrittr)

Blah <-read_html("web address redacted") %>%
  html_nodes("#iframe")%>%
  html_nodes("#img")%>%
  html_attr("#src")%>%
  #read_html()%>%
  head()
Blah

как только я включаю read_html, следующая ошибка возвращается в скрипт:

ошибка в if (grepl ( " ", x)) { : аргумент имеет длину ноль

Я подозреваю, что это относится к символу (0)

оцените любое руководство ЗДЕСЬ!

Большое Спасибо,

HTML-код

<div align="center"> 
    <table id="table1" style="border-collapse: collapse" width="700" cellspacing="0" cellpadding="0" border="0"> 
        <tbody>
            <tr>
                <td colspan="6"> &nbsp;</td>
            </tr> 
            <tr> 
                <td colspan="6"> 
                    <a href="href redacted">
                        <img src="img.gif" width="38" height="38" border="0" align="right">
                    </a>
                    <strong>x - </strong>
                </td>
            </tr> 
        </tbody>
    </table>
</div>

1 ответов


это иногда сложно с iframes. На основе html вы при условии, что я создал этот пример. Что работает локально, но будет ли это работать и для вас?

до IFrame на frames коллекция может быть использована. Надеюсь, вы знаете name на IFrame?

Dim iframeDoc As MSHTML.HTMLDocument
Set iframeDoc = doc.frames("iframename").document

затем перейти к image можно использовать querySelector метод, например, такой:

Dim img As MSHTML.HTMLImg
Set img = iframeDoc.querySelector("div table[id='table1'] tbody tr td a[href^='https://stackoverflow.com'] img")

переключатель a[href^='https://stackoverflow.com'] выбирает anchor что есть что начинается с данного текста. на ^ обозначает начало.

тогда, когда у нас есть изображение просто простой вызов click на его родителя, который является желаемым anchor. HTH


пример:

Option Explicit

' Add reference to Microsoft Internet Controls (SHDocVw)
' Add reference to Microsoft HTML Object Library

Sub Demo()

    Dim ie As SHDocVw.InternetExplorer
    Dim doc As MSHTML.HTMLDocument
    Dim url As String

    url = "file:///C:/Users/dusek/Documents/My Web Sites/mainpage.html"
    Set ie = New SHDocVw.InternetExplorer
    ie.Visible = True
    ie.navigate url

    While ie.Busy Or ie.readyState <> READYSTATE_COMPLETE
        DoEvents
    Wend

    Set doc = ie.document

    Dim iframeDoc As MSHTML.HTMLDocument
    Set iframeDoc = doc.frames("iframename").document
    If iframeDoc Is Nothing Then
        MsgBox "IFrame with name 'iframename' was not found."
        ie.Quit
        Exit Sub
    End If

    Dim img As MSHTML.HTMLImg
    Set img = iframeDoc.querySelector("div table[id='table1'] tbody tr td a[href^='https://stackoverflow.com'] img")
    If img Is Nothing Then
        MsgBox "Image element within iframe was not found."
        ie.Quit
        Exit Sub
    Else
        img.parentElement.Click
    End If

    ie.Quit
End Sub

Главная страница HTML используется

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<!-- saved from url=(0016)http://localhost -->
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>x -</title>
</head>

<body>
<iframe name="iframename" src="iframe1.html">
</iframe>
</body>

</html>

iframe HTML используется (сохраняется как файл iframe1.html)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<!-- saved from url=(0016)http://localhost -->
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>Untitled 2</title>
</head>

<body>
<div align="center"> 
    <table id="table1" style="border-collapse: collapse" width="700" cellspacing="0" cellpadding="0" border="0"> 
        <tbody>
            <tr>
                <td colspan="6"> &nbsp;</td>
            </tr> 
            <tr> 
                <td colspan="6"> 
                    <a href="https://stackoverflow.com/questions/44902558/accessing-object-in-iframe-using-vba">
                        <img src="img.gif" width="38" height="38" border="0" align="right">
                    </a>
                    <strong>x - </strong>
                </td>
            </tr> 
        </tbody>
    </table>
</div>

</body>

</html>