【发布时间】:2017-11-23 12:01:35
【问题描述】:
下面是简单的 IE 自动化代码,只需输入订单号,如 1413105088 和邮政编码,始终为 78759,然后点击提交按钮,然后从结果页面获取跟踪号,如 017136295201034
并将它们放在 C 列中。
它按预期工作,但由于 IE 不是那么可靠和缓慢,我想知道是否有更快的方法来执行此过程,如果没有,我可以使其至少可靠,以便在单击提交后它不会失败按钮,意思是
Do While IE.Busy Or IE.ReadyState <> 4
DoEvents
Loop
之后
.document.getElementsByClassName("button_text")(3).Click
失败,因为它并没有真正检查 ie 页面是否已完成加载。
我问这个是因为我必须为 100 个这样的请求做这个。提前致谢。
完整代码:
Sub test()
Dim urL As String, orderNum As String
Dim trackingNum, prodDetail, cet
Dim i As Long, fI As Long
Dim IE
urL = "https://fisher-price.mattel.com/webapp/wcs/stores/servlet/OrderStatusGuestView?catalogId=10101&langId=-1&storeId=10151&krypto=prThs8zyeWG0bkF9ajSr%2FCnzmv1TKodtTEw0EdXtC7NjEmfD3cb6Z75umdkcXCiEPFxvkd0TfHkOswm3ZcMp8sbrU2doZFa6TxVbI%2BW1Lzk%3D"
fI = MAIN.Range("B" & Rows.Count).End(xlUp).Row
Set IE = CreateObject("InternetExplorer.Application")
With IE
.Visible = True
For i = 2 To fI
orderNum = Trim(MAIN.Range("B" & i).Value) 'Sample ordernum = 1413105088
If orderNum <> "" Then
.navigate urL
Do While IE.Busy Or IE.ReadyState <> 4
DoEvents
Loop
.document.getelementbyid("orderNumber").Value = orderNum
.document.getelementbyid("postalCode").Value = 78759
.document.getElementsByClassName("button_text")(3).Click
Application.Wait Now + TimeValue("00:00:02")
Do While IE.Busy Or IE.ReadyState <> 4
DoEvents
Loop
prodDetail = .document.getElementsByClassName("productDetails")(0).innerText
If InStr(prodDetail, "Tracking :") > 0 Then
cet = Split(prodDetail, "Tracking :")
trackingNum = Trim(cet(1))
MAIN.Range("C" & i).Value = trackingNum
Else
MAIN.Range("C" & i).Value = "N/A"
End If
End If
Next i
End With
IE.Quit
Set IE = Nothing
End Sub
【问题讨论】:
-
我会将
IE.Document.ReadyState <> "complete"包含在你的循环中以确保它已加载 - 因为你真的在模拟 IE 交互(而不仅仅是抓取),这是我知道的唯一方法跨度> -
@Jeremy :我不太了解浏览器的工作原理,但我的理解是代码查找浏览器标题或选项卡而不是页面。因此,一旦加载了选项卡或浏览器标题,它就会查找该项目。如果我错了,请纠正我。
标签: vba excel internet-explorer