Доступ к объекту в 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"> </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"> </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>