2016-01-10 4 views
0

Я использую ниже код в VBA,VBA, doc.getElementsByClassName() работает в режиме отладки не в рабочем режиме

Set results = Doc.getElementsByClassName("a-size-large a-color-price olpOfferPrice a-text-bold") 

If results.Length > 0 Then 

но длина только дает> 1 в режиме отладки не в рабочем режиме, я проверил сайт и дает иметь класс, упомянутый выше, но странно работает в режиме отладки, что тоже линейный режим отладки и не работает в режиме запуска.

Благодаря DJ

+0

Пожалуйста, покажите полный код. Особенно там, где происходит «Doc». Вы должны указать время браузера для загрузки сайта. –

ответ

0

Это звучит, как вы загружаете документ, но это не является полным, прежде чем пытаться проверить документ. Когда вы запускаете режим отладки, у документа есть время для завершения загрузки. Лучший способ заставить VBA дождаться загрузки документа полностью - это открыть URL/Документ в синхронном режиме. Вы также захотите проверить, что запрос документа возвратил действительный код состояния HTTP.

Если ваш источник документа действителен XML/XHTML, вы можете получить объект документа непосредственно из XMLHttpRequest, но я предполагаю, что у вас простой старый HTML.

Вы должны знать, что XMLHttpRequest будет извлекать содержимое HTML страницы, но это не будет загружать или запускать какие-либо из вспомогательных сценариев/CSS, так что если какие-либо из этих сценариев бы породило динамический контент HTML , то он не будет присутствовать в документе HTML.

Sub Test() 

    Const URL As String = "http://stackoverflow.com" 
    Const CLASS_NAME As String = "row-fluid" 

    'The getElementsByClassName method is unavailable under some/all IE versions? 
    'It seems to need to be strongly typed as MSHTML.HTMLDocument 
    'You'll need to Add a reference to Microsoft HTML Object Libarary 
    Dim oDoc As MSHTML.HTMLDocument 

    Dim results As Object 

    With CreateObject("MSXML2.XMLHttp") 
    .Open "GET", "http://www.microsoft.com", False 
    .send 
    'Check the response is valid 
    If .Status = 200 Then 
     Set oDoc = CreateObject("htmlfile") 
     oDoc.body.innerHTML = .responseText 
     Set results = oDoc.getElementsByClassName(CLASS_NAME) 
    End If 
    End With 

End Sub 
+0

это сработало !, спасибо! – user5769212

1

Предполагая, что ваш код пытается получить данные с веб-сайта, используйте метод ниже для выборки данных. Этот код будет ждать, пока HTML-данные не будут получены до выполнения вашего условия IF. (Ссылка: Code Snippet from this website)

'Replace the URL of the webpage that you want to download 
Web_URL = "http://websitename.com" 

'Create HTMLFile Object 
Set HTML_Content = CreateObject("htmlfile") 

'Get the WebPage Content to HTMLFile Object 
With CreateObject("msxml2.xmlhttp") 
    .Open "GET", Web_URL, False 
    .send 
    HTML_Content.Body.Innerhtml = .responseText 
End With 
0

Убедитесь, что страница загружается, прежде чем пытаться получить доступ к DOM элементов, проверяя ReadyState и Busy свойства IE:

Sub Foo() 

    Const READYSTATE_COMPLETE As Integer = 4 

    Set IE = CreateObject("InternetExplorer.Application") 

    IE.Navigate "http://www.stackoverflow.com" 

    '// The important bit: 
    While IE.ReadyState <> READYSTATE_COMPLETE Or IE.Busy 
     DoEvents 
    Wend 

    '// Rest of your code, presumably something like: 
    Set Doc = IE.Document 

    Set results = Doc.getElementsByClassName("a-size-large a-color-price olpOfferPrice a-text-bold") 

    If results.Length > 0 Then 

    '// Rest of code here ..... 
End Sub 
+0

спасибо! я сделал аналогичный путь, также, но он когда-то дает 0 длины когда-то. вот оно. IE.navigate "http://www.amazon.com/gp/offer-listing/" & A_S.Cells (строка, 11) .Value & "/ ref = olp_sss_new? Ie = UTF8 & f_freeShipping = true & condition = new" 'IE .navigate "http://www.amazon.com/gp/offer-listing/" & A_S.Cells (строка, 11) .Value & "/ ref = olp_sss_new? ie = UTF8 & condition = new & shipPromoFilter = 1" 'Do While IE.Busy Или IE.readyState <> READYSTATE_COMPLETE '' DoEvents 'Loop ' Set Doc = IE.document – user5769212

+0

Я бы ввел точку останова непосредственно перед установкой коллекции и проверил, что все ваши переменные имеют ожидаемые значения. Ошибка может быть где-то в другом месте, например, вы можете активировать лист или книгу при переходе вручную, что не происходит в «живом» исполнении. –

Смежные вопросы