VBA Я не могу взаимодействовать с элементами на следующей странице после входа в систему - PullRequest
0 голосов
/ 08 ноября 2018

Хорошо, так что мой макрос VBA Excel тоскует по моему сайту, и с лендинга я направляю его на страницу поиска, но я получаю Эта ошибка после того, как IE попадает на страницу поиска. Я думал, что сброс objcollection на новой странице будет работать, но я не знаю, как установить фокус или выбрать новую страницу или что ... Я новичок в использовании VBA с IE для автоматизации, извините, если это супер очевидно.

Sub GoToWebsiteTest2()
Dim appIE As InternetExplorerMedium
Dim objElement As Object
Dim objCollection As Object

Set appIE = New InternetExplorerMedium
sURL = "https://example.login.aspx"
With appIE
    .Navigate sURL
    .Visible = True
End With

Do While appIE.Busy Or appIE.ReadyState <> 4
    DoEvents
Loop

Set objCollection = appIE.Document.getElementsByTagName

'Set appIE = Nothing
appIE.Document.getElementById("txtUsername").Value = "user"
appIE.Document.getElementById("txtPassword").Value = "Pass"
appIE.Document.getElementById("btnLogin").Click

Do While appIE.Busy Or appIE.ReadyState <> 4
    DoEvents
Loop

appIE.Navigate "https://example.Search.aspx"

Do While appIE.Busy Or appIE.ReadyState <> 4
    DoEvents
Loop

Set objCollection = appIE.Document.getElementsByTagName
*appIE.Document.getElementById("txtNum").Value = "0000000"*
appIE.Document.getElementById("btnSearch").Click
End Sub

Я изменил это на это, и он работал отлично, элементы были в iframe

Sub GoToWebsiteTest2()
Dim appIE As InternetExplorerMedium
Dim objElement As Object
Dim objCollection As Object
Dim iframeDoc As MSHTML.HTMLDocument
Dim doc As MSHTML.HTMLDocument

Set appIE = New InternetExplorerMedium
sURL = "https://example.login.aspx"
With appIE
    .Navigate sURL
    .Visible = True
End With

Do While appIE.Busy Or appIE.ReadyState <> 4
    DoEvents
Loop

Set objCollection = appIE.Document.getElementsByTagName

'Set appIE = Nothing
appIE.Document.getElementById("txtUsername").Value = "user"
appIE.Document.getElementById("txtPassword").Value = "Pass"
appIE.Document.getElementById("btnLogin").Click

Do While appIE.Busy Or appIE.ReadyState <> 4
    DoEvents
Loop

appIE.Navigate "https://example.Search.aspx"

Do While appIE.Busy Or appIE.ReadyState <> 4
    DoEvents
Loop

Set doc = appIE.Document
Set iframeDoc = doc.frames("EncJump").Document
iframeDoc.getElementById("txtNum").Value = "0000000"
iframeDoc.getElementById("btnSearch").Click
End Sub

1 Ответ

0 голосов
/ 08 ноября 2018

Поскольку вы не можете опубликовать HTML, это больше спекуляция, чем что-либо еще. Есть 2 вероятных проблемы:

  1. Ваша проблема связана с iframe - в этом случае мы мало что можем сделать, не увидев HTML.
  2. Ваша проблема в том, что ваш элемент загружен не полностью (да, это происходит, даже если readystate = complete).

Итак, измените строку, в которой возникают проблемы:

dim startTime as single
starttime = timer

on error resume next
do while appIE.Document.getElementById("txtNum") is nothing
    if timer - starttime > 10 then       'Change 10 to # of max seconds to wait
        msgbox "Element didn't load! Check internet connection, aborting"
        exit sub
    else
        doevents
    end if
loop
on error goto 0
appIE.Document.getElementById("txtNum").Value = "0000000"

Построение по пункту №1. Вы можете думать о iFrame как о своем собственном документе. Обычно вы увидите тэг <iframe>. Вам нужно будет использовать документ этого объекта (я обычно устанавливаю его равным iframe.contentdocument), а затем действовать как обычно.

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