Để tạm dừng mã cho đến khi trang web được tải đầy đủ, tôi đã sử dụng phương pháp dưới đây với thành công lớn gần như mọi lúc.Trong Excel VBA, cách nào để kiểm tra xem trang web đã được tải hoàn toàn chưa?
Do While objIE.Busy = True Or objIE.readyState <> 4: DoEvents: Loop
Nhưng đôi khi, tôi thấy tải nội dung văn bản sau khi phương pháp xác định rằng trang được tải đầy đủ và để nội dung không được trích xuất.
Tuy nhiên, nếu tôi duyệt qua mã qua F8, nội dung sẽ được trích xuất mọi lúc. Điều này được thực hiện nhanh như tôi có thể nhấn phím F8 nhiều lần.
Vậy làm cách nào tôi có thể kiểm tra để đảm bảo trang và tất cả nội dung của trang, được tải đầy đủ trước khi mã tiếp tục trích xuất dữ liệu?
Trong cả hai trường hợp, IE đang chạy vô hình. Tuy nhiên, tôi đã thử điều này với IE có thể nhìn thấy và có thực sự nội dung trong vị trí cụ thể này trên các trang tôi đang làm việc với.
Việc này đang được thực hiện trong Excel 2016, sử dụng tập lệnh VBA. Yêu cầu nội dung cụ thể được viết như sau:
'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
Tôi đã đọc qua Excel VBA: Wait for JavaScript execution in Internet Explorer bởi vì tôi nghĩ rằng có lẽ các giá trị đang nhận được thêm vào sau khi tài liệu được nạp, trong một nỗ lực để ngăn chặn bất cứ ai từ cào dữ liệu. Tuy nhiên, tôi dường như không thể xác định bất kỳ tập lệnh nào có thể làm điều đó. Không có nghĩa là nó không có ở đó. Tôi chưa thể nhìn thấy nó.
Một ví dụ cụ thể của trang với vấn đề này là URL
https://www.homedepot.ca/en/home/p.dry-cloth-refills-32---count.1000660019.html
Ban đầu product-total-price
div yếu tố chứa dấu gạch ngang (-), trước khi giá đang được nạp, vì vậy đó là những gì được yêu cầu sẽ trở lại: -/each
thay vì $11.29/each
.
Tôi có giải pháp thay thế, nhưng không hiệu quả hoặc ngắn gọn như tôi muốn. Tôi kiểm tra chuỗi trả lại cho sự hiện diện của dấu gạch ngang. Nếu nó ở đó, lặp lại và kiểm tra nó một lần nữa, khác nắm bắt nó và chèn nó vào bảng tính.
setPriceUM:
Set hdPriceUM = objIE.document.querySelector(".product-total-price").innerText
hdPriceUMString = hdPriceUM.innerText
stringTest = InStr(hdPriceUMString, "-")
If stringTest = True Then
GoTo setPriceUM
Else
Debug.Print hdPriceUMString
End If
Cảm ơn bạn đã dành thời gian đọc và xem xét điều này.
Câu hỏi hay. Tôi đấu tranh với vấn đề này là tốt, nhưng may mắn thay, một cách tôi đã luôn luôn giải quyết vấn đề của tôi đã được thêm một vòng lặp sau khi vòng lặp ban đầu có chứa '.Busy' - looping cho đến khi đối tượng của tôi trở nên có sẵn. Vì vậy, câu hỏi của tôi là: tất cả các đối tượng của bạn có sẵn sau khi trang hoàn toàn "tải" không? Ví dụ: Bạn 'Đặt SubmitBtn = doc.getElement .....' ... Đó có phải là 'Nothing', nhắc một lỗi runtime? –
Tôi cũng đã gặp phải vấn đề này, nhưng nó thường là một vấn đề về mạng. Khi mạng đang chạy nhanh, không có vấn đề gì, nhưng khi mạng bắt đầu hiển thị thời gian trễ, các trang không tải đầy đủ. Tôi đã phải nghỉ mát để thêm một bộ đếm thời gian chờ đợi để cho phép thêm thời gian. 'Application.Wait (Now + TimeValue (" 0:00:06 "))' Đây là thời gian chờ đợi thứ 6. – Mitch
@Mitch Timers là giải pháp không đáng tin cậy, đặc biệt đối với mạng chậm. – omegastripes