Как получить элемент по тегу, имени тега, затем щелкнуть позицию тега (не работает) // зеркальная программа iMacros (работает) - PullRequest
1 голос
/ 08 апреля 2019

Цель: автоматически запускать веб-отчеты, сохранять в файл, загружать на FTP

Проблема: не может щелкнуть элементы в VBA, но я знаю маршрут, по которому мне нужно идти, потому что макрос успешно работает в программе iMacros (https://imacros.net/download/)

Вопрос: как мне отразить команду iMacro в VBA или как лучше написать в VBA? Я взволнован, чтобы получить решение, и спасибо, что нашли время, чтобы помочь мне!

HTML:

<frame name="leftFrame" src:"/client1-power/utility/CommonControllerServlet?action=folderAction&subaction=getRootFolders&folderId=null" frameBorder="0" marginHeight="0" noResize="noresize" scrolling="no">

<a title="Workspaces" class="leftnavleaflink" id="itemTextLink5" onmouseover="return true;" onclick="javascript:clickOnFolder("5");" oncontextmenu="showContextMenu("5");return false;" target="mainFrame" shape="">Workspaces</a>

iMacros - Рабочая:)

VERSION BUILD=12.5.503.8802
TAB T=1
TAB CLOSEALLOTHERS
'SET !PLAYBACKDELAY 0.00
URL GOTO=https://advantage.iriworldwide.com/client1-power/SplashLogin.jsp
TAG POS=1 TYPE=INPUT:TEXT ATTR=NAME:j_username CONTENT=xxxxx
TAG POS=1 TYPE=INPUT:PASSWORD ATTR=NAME:j_password CONTENT=xxxxx
TAG POS=1 TYPE=INPUT:SUBMIT ATTR=NAME:submitButton
FRAME NAME=leftFrame
TAG POS=1 TYPE=A ATTR=TXT:Workspaces
TAG POS=1 TYPE=A ATTR=TXT:"My Workspaces"
TAG POS=1 TYPE=A ATTR=TXT:XP3
TAG POS=1 TYPE=A ATTR=TXT:"Data for Interactive Edge"
TAG POS=2 TYPE=A ATTR=TXT:"Salty Snacks"
FRAME NAME=mainFrame
TAG POS=1 TYPE=A ATTR=TXT:"26 Weeks - Regions"
TAG POS=1 TYPE=A ATTR=TXT:"13 Weeks - Regions"
TAG POS=1 TYPE=A ATTR=TXT:"13 Weeks - Markets-Parent Company"
TAG POS=1 TYPE=A ATTR=TXT:"52 Weeks - Regions"

Код VBA - не работает: (

Sub iriAutomation()
    Dim objIE As InternetExplorer
    Set objIE = New InternetExplorer
    objIE.Visible = True

    objIE.navigate "https://advantage.iriworldwide.com/client1-power/SplashLogin.jsp"
    Do While objIE.Busy = True Or objIE.readyState <> 4: DoEvents: Loop
    objIE.document.getElementById("usrname").Value = "xxxxx"
    objIE.document.getElementById("password").Value = "xxxxx"
    objIE.document.getElementById("submitButton").Click
    Do While objIE.Busy = True Or objIE.readyState <> 4: DoEvents: Loop
    'objIE.document.getElementById("5").Click -----NOT WORKING
    'objIE.document.parentWindow.execScript "javascript:clickOnFolder(""5"");" -----NOT WORKING
    'objIE.document.HTMLDocument.getElementsByTagName ("Workspaces") -----NOT WORKING
    'objIE.document.getElementById("itemTextLink5").Click -----NOT WORKING
    'objIE.document.getElementById("5").getElementsByTagName("a").click -----NOT WORKING
    'objIE.document.HTMLDocument.getElementsByName ("leftFrame") -----NOT WORKING
End Sub

Ошибка времени выполнения '438': Объект не поддерживает это свойство или метод

Для подсчета кадров: enter image description here

Ответы [ 2 ]

1 голос
/ 08 апреля 2019

Узнайте, как работать с HTTP-запросами.

Вы должны войти в систему:

Sub iri()
Dim req As WinHttpRequest
Set req = New WinHttpRequest
Dim doc As HTMLDocument
set doc = New HTMLDocument
Dim reqBody As String
Dim userName As String
Dim pswd As String
userName = "user"
pswd = "12345"
reqBody = "j_username=" & userName & "&j_password=" & pswd & "&login-form-type=pwd&submitButton=Login"
With req
    .Open "POST", "https://advantage.iriworldwide.com/client1-power/SplashLogin.jsp", False
    .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    .send reqBody
    doc.body.innerHTML = .responseText
End With
End Sub

После входа в систему вы можете манипулировать HTML-кодом ответа, который хранится в doc, как вам угодно. Использованные ссылки:

Microsoft WinHTTP Services, version 5.1

Microsoft HTML Object Library
1 голос
/ 08 апреля 2019

Обычный подход для обработки фреймов - получить объект фрейма, а затем получить доступ к контенту внутри. Например, предполагая, что нужный подэлемент находится в кадре 1:

objIE.document.getElementsByTagName("frame")(0).contentDocument.getElementById("itemTextLink5").click

Использование имени

objIE.document.getElementsByName("leftFrame")(0).contentDocument.getElementById("itemTextLink5").click

Как кажется, у вас есть наборы кадров в качестве родителей, вам может понадобиться их убрать, например,

objIE.document.getElementsByTagName("frameset")(1).getElementsByTagName("frame")(1).contentDocument.getElementById("itemTextLink5").click
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...