VBA не будет нажимать на гиперссылку, пока не пройдёт - PullRequest
0 голосов
/ 27 мая 2018

Я работаю над проектом для компании, в которой я работаю, и я новичок в VBA.Я пытаюсь зайти на сайт поставщика и перейти на страницу запроса цен.

Я могу войти, но после входа в систему я не могу заставить VBA щелкнуть гиперссылку, на которую я хочу, еслиЯ перешагиваю код, используя F8.Я пытался сделать паузу в определенных местах кода, но он все равно не работает.

Я разместил часть кода, которая вызывает проблемы.Любая помощь будет принята с благодарностью.

Sub getDurablePrices()
Dim IE As Object
Dim i As Long
Dim objElement As Object
Dim objCollection As Object
Set IE = CreateObject("InternetExplorer.Application")

IE.Navigate "http://duraweb.durableusa.com/Acct%20Mgmt/Login.aspx"
IE.Visible = True
Do While IE.Busy
'nothing
Loop

IE.document.All("htmUserName").Value = "******"
IE.document.All("htmPwd").Value = "******"

Set objCollection = IE.document.getElementsByTagName("input")

i = 0
While i < objCollection.Length
    If objCollection(i).Type = "submit" Then
        Set objElement = objCollection(i)
    End If
    i = i + 1
Wend

objElement.Click

'Code added as suggested.
Do While IE.Busy Or IE.readyState <> 4
    DoEvents
Loop

Set AllHyperLinks = IE.document.getElementsByTagName("A")

For Each hyper_link In AllHyperLinks
    If hyper_link.innerText = "Customer Price Inquiry" Then
        hyper_link.Click
        Exit For

    End If
Next


End Sub

Вот HTML-код, который я пытаюсь нажать:

<a class="ctl00_ContentPlaceHolder1_MenuTree_0" 
href="Customer/CustomerPriceInquiry.aspx" 
id="ctl00_ContentPlaceHolder1_MenuTreet4">Customer Price Inquiry</a>

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

Вы пытались после второго

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

Чтобы затем сделать

IE.navigate Trim$(Split(Split(IE.document.body.innerHTML, "id=""ctl00_ContentPlaceHolder1_MenuTreet4""")(0), "href =")(1))

Это предполагает, что вы не можете сделать

IE.document.getElementByID("ctl00_ContentPlaceHolder1_MenuTreet4").Click

Или

Dim targetElement As Object

Do
    On Error Resume Next
    Set targetElement = IE.document.getElementById("ctl00_ContentPlaceHolder1_MenuTreet4")
    On Error GoTo 0
    DoEvents
Loop While targetElement Is Nothing
0 голосов
/ 27 мая 2018

Не используйте таймер - вместо этого дождитесь окончания загрузки страницы с чем-то вроде этого:

Do While ie.Busy Or ie.readyState <> 4
    DoEvents
Loop

... или в виде одной строки, которую я помещаю после любого «щелчка»или другие действия, которые вызывают изменения на странице:

Debug.Print"Waiting, ";:Do While ie.Busy Or ie.readyState<>4:DoEvents:Loop:Debug.Print"Loaded."

Дополнительная информация:

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