To pause code until a web page is fully loaded, I've been using the method below with great success almost all of the time.
Do While objIE.Busy = True Or objIE.readyState <> 4: DoEvents: Loop
But occasionally, I see text content load after the method determines that the page is fully loaded, and so that content is not extracted.
However, if I step through the code via F8, the content is extracted every time. This is done about as fast as I can press the F8 key repeatedly.
So how can I check to ensure the page, and all its content, is fully loaded before the code continues to extract data?
In both cases, IE is running invisibly. However, I've tried this with IE visible and there is actually content in this specific location on the pages I'm working with.
This is being done in Excel 2016, using VBA script. The specific content request is written like:
'get item name from page and write it to the first cell on the first empty row available
Set itemName = objIE.document.querySelector(".the-item-name")
Worksheets("Results").Range("A1048576").End(xlUp).Offset(1, 0).Value = itemName.innerText
I've read through Excel VBA: Wait for JavaScript execution in Internet Explorer because I think that maybe the values are getting added after the document is loaded, in an effort to prevent anyone from scraping data. However, I can't seem to identify any script that may be doing that. Doesn't mean it isn't there. I just can't see it yet.
A specific example of the page with this issue is URL
https://www.homedepot.ca/en/home/p.dry-cloth-refills-32---count.1000660019.html
Initially product-total-price
div element contains dash (-), prior to the price being loaded, so that's what the request will return: - / each
instead of $11.29 / each
.
I have a workaround, but it's not as efficient or as concise as I'd like it to be. I test the string returned for the presence of the dash. If it's there, loop and check it again, else capture it and insert it into the worksheet.
setPriceUM:
Set hdPriceUM = objIE.document.querySelector(".product-total-price").innerTe????xt
hdPriceUMString = hdPriceUM.innerText
stringTest = InStr(hdPriceUMString, "-")
If stringTest = True Then
GoTo setPriceUM
Else
Debug.Print hdPriceUMString
End If
Thank you for taking the time to read this and consider it.
See Question&Answers more detail:
os