Гость
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Method 'Document' of object 'IWebBrouser2' failed / 12 сообщений из 12, страница 1 из 1
02.10.2019, 00:54
    #39870316
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Method 'Document' of object 'IWebBrouser2' failed
Здравствуйте!

Заметил одну странную вещь при написании парсинга на примере Google.com. Есть макрос который сначала выгружает домашнюю страницу, потом вводит значение в поле ввода для поиска и нажимает на кнопку поиска.
VBA
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Option Explicit
Sub IE_Autiomation_Variant1()
    Dim IE As Object   
    Set IE = CreateObject("InternetExplorer.Application")
    IE.Visible = True
    
    Dim URL As String
    URL = "https://www.google.com/"
    
    'If GetURLstatus(URL) = 200 Then
        IE.Navigate URL
        
        Do Until IE.Busy Or IE.READYSTATE = 4
            DoEvents
            'Application.Wait DateAdd("s", 1, Now)
        Loop
       
        IE.document.getElementsByClassName("gLFyf gsfi")(0).Value = "vba" 'Тут появляется ошибка
        Dim HTMLButton As MSHTML.HTMLInputElement
        Set HTMLButton = IE.document.getElementsByClassName("gNO89b")(0)
        HTMLButton.Click
    'End If
End Sub

Если на диалоговом окне нажать "Debug" и продолжить запуск, то запускается дальше.

Почему так происходит? Как правильно написать?
...
Рейтинг: 0 / 0
02.10.2019, 09:00
    #39870351
The_Prist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Method 'Document' of object 'IWebBrouser2' failed
ferzmikk,

попробуйте пошагово:
Код: vbnet
1.
2.
3.
4.
dim oEl_el
set oEl_el = IE.document.getElementsByClassName("gLFyf gsfi")(0)
doevents
oEl_el.Value = "vba"
...
Рейтинг: 0 / 0
02.10.2019, 15:19
    #39870601
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Method 'Document' of object 'IWebBrouser2' failed
The_Pristпопробуйте пошагово:По шагово с помощью F8 - работает. А вот если запускать с помощью F5 - также прерывается.

Может быть объект IE.document надо как то активизировать как Cells(1,1).Activate или Cells(1,1).Select ?
...
Рейтинг: 0 / 0
02.10.2019, 15:29
    #39870611
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Method 'Document' of object 'IWebBrouser2' failed
надо написать код , который после открытия документа дождётся события onload и уже потом рабоать с DOM открытого документа html
...
Рейтинг: 0 / 0
02.10.2019, 15:40
    #39870616
The_Prist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Method 'Document' of object 'IWebBrouser2' failed
ferzmikkПо шагово с помощью F8 - работаетя написал код, который надо было попробовать. Пошагово имелось ввиду пошаговое назначение ссылок на объекты документа, а не отладку.
...
Рейтинг: 0 / 0
02.10.2019, 20:26
    #39870829
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Method 'Document' of object 'IWebBrouser2' failed
The_PristПошагово имелось ввиду пошаговое назначение ссылок на объекты документа.
VBA
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
Option Explicit
Sub IE_Autiomation_Variant1()
    Dim IE As Object
    Dim objCollection As Variant 'Object
   
    Set IE = CreateObject("InternetExplorer.Application")
    IE.Visible = True
    
    Dim URL As String
    URL = "https://www.google.com/"
    
    'If GetURLstatus(URL) = 200 Then
        IE.Navigate URL
        
        Do Until IE.Busy Or IE.READYSTATE = 4
            DoEvents
            Application.Wait DateAdd("s", 1, Now)
        Loop
               
        Dim html_Doc As Object
        Set html_Doc = IE.document 'Тут появляется ошибка
        DoEvents
               
        Dim oEl_el
        Set oEl_el = html_Doc.getElementsByClassName("gLFyf gsfi")(0)
        DoEvents
        oEl_el.Value = "vba"
        
        Dim HTMLButton As MSHTML.HTMLInputElement
        Set HTMLButton = html_Doc.getElementsByClassName("gNO89b")(0)
        HTMLButton.Click
    'End If
End Sub

...
Рейтинг: 0 / 0
02.10.2019, 20:43
    #39870841
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Method 'Document' of object 'IWebBrouser2' failed
Значит в этот момент документ еще не готов, а когда пошагово или отладчик - успевает загрузиться.
Можно, конечно, просто сделать паузу или зациклить с DoEvents пока ошибка не прекратится.
Но правильнее, как сказал Костя.
...
Рейтинг: 0 / 0
02.10.2019, 20:47
    #39870843
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Method 'Document' of object 'IWebBrouser2' failed
Но в коде же есть
Код: vbnet
1.
2.
3.
4.
Do Until IE.Busy Or IE.READYSTATE = 4
    DoEvents
    'Application.Wait DateAdd("s", 1, Now)
Loop
...
Рейтинг: 0 / 0
02.10.2019, 23:26
    #39870891
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Method 'Document' of object 'IWebBrouser2' failed
В общем, разобрался.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
'Вместо
Do Until IE.Busy Or IE.READYSTATE = 4
    DoEvents
Loop
'написал так
Do IE.READYSTATE = 4
    DoEvents
Loop

VBA
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
Option Explicit
Sub IE_Autiomation_Variant0()
    Dim IE As Object
    Set IE = CreateObject("InternetExplorer.Application")
    IE.Visible = True
    
    Dim URL As String
    URL = "https://www.google.com/"
    
    'If GetURLstatus(URL) = 200 Then
        IE.Navigate URL
        
        Do Until IE.READYSTATE = 4
            DoEvents
        Loop       
     
        'Вариант 1       
            'IE.document.getElementsByClassName("gLFyf gsfi")(0).Value = "vba"
            'Dim HTMLButton As MSHTML.HTMLInputElement
            'Set HTMLButton = IE.document.getElementsByClassName("gNO89b")(0)        
     
        'Вариант 2
            Dim html_Doc As Object
            Set html_Doc = IE.document
            DoEvents
               
            Dim oEl_el
            Set oEl_el = html_Doc.getElementsByClassName("gLFyf gsfi")(0)
            DoEvents
            oEl_el.Value = "vba"
        
            Dim HTMLButton As MSHTML.HTMLInputElement
            Set HTMLButton = html_Doc.getElementsByClassName("gNO89b")(0)

        HTMLButton.Click
    'End If
End Sub

Теперь нормально работает.

Но возникает вопросы.

1. После строки HTMLButton.Click по логике нужно дождаться окончания обновления страницы. Правильно ли будет, если добавить строки Do Until IE.READYSTATE = 4: DoEvents: Loop или тут по другому надо писать?

2. Когда заходим на главную страницу, то нужна проверка If GetURLstatus(URL) = 200 Then , если потом есть строки Do Until IE.READYSTATE = 4: DoEvents: Loop ?

3. Даже если код работает, то лучше оставлять как пошаговое назначение ссылок на объекты документа, то есть вариант 2?

4. Есть еще что-то чего не учитывается?
...
Рейтинг: 0 / 0
02.10.2019, 23:44
    #39870894
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Method 'Document' of object 'IWebBrouser2' failed
ferzmikkВ общем, разобрался.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
'Вместо
Do Until IE.Busy Or IE.READYSTATE = 4
    DoEvents
Loop
'написал так
Do Until IE.READYSTATE = 4
    DoEvents
Loop

пропустил
...
Рейтинг: 0 / 0
03.10.2019, 00:10
    #39870901
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Method 'Document' of object 'IWebBrouser2' failed
Еще странную картину увидел.

Также на странице водится значение для поиска и нажимается кнопка, далее проходит строку Do Until IE.READYSTATE = 4: DoEvents: Loop , но в точке останова в объекте IE.document.getElementsByClassName("results-frame")(0).Children(0).Children(0).Children(0).Children отсутствуют элементы. Но если в окне Watches добавить переменную любую, то у объекта IE.document.getElementsByClassName("results-frame")(0).Children(0).Children(0).Children(0).Children появляются элементы.

Почему так, как правильно написать?
...
Рейтинг: 0 / 0
05.10.2019, 19:40
    #39872068
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Method 'Document' of object 'IWebBrouser2' failed
ferzmikkЕще странную картину увидел.

Также на странице водится значение для поиска и нажимается кнопка, далее проходит строку Do Until IE.READYSTATE = 4: DoEvents: Loop Получается страница все равно не до конца загружается или здесь что то другое влияет?
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Method 'Document' of object 'IWebBrouser2' failed / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]