VBA Web Scraping:宏在运行时停止,但不是在调试模式下
我尝试过一些事情,比如在出现“Html.querySelector”(“a[href=”#tab import'])问题的行代码之前等待1到10秒。单击“停止位置”或添加“循环”,直到页面充电,但我不知道为什么它只在调试模式下工作 HTML来源:VBA Web Scraping:宏在运行时停止,但不是在调试模式下,vba,excel,web-scraping,Vba,Excel,Web Scraping,我尝试过一些事情,比如在出现“Html.querySelector”(“a[href=”#tab import'])问题的行代码之前等待1到10秒。单击“停止位置”或添加“循环”,直到页面充电,但我不知道为什么它只在调试模式下工作 HTML来源: <a href="#tab-import" data-toggle="tab">Import</a> 每次单击某项内容时,应等待浏览器再次“就绪”: 另外,不要使用应用程序。等待这类事情——它实际上只是在给定的时间内冻结代码
<a href="#tab-import" data-toggle="tab">Import</a>
每次单击某项内容时,应等待浏览器再次“就绪”:
另外,不要使用
应用程序。等待这类事情——它实际上只是在给定的时间内冻结代码执行。它不允许处理事件,也不允许与broswer的就绪状态有任何类型的链接。好吧,在几行之后移动此行码“IE.Visible=True”终于奏效了。非常感谢您的支持。如果它在调试/分步执行模式下运行,而不是在直接执行时运行,则通常表明存在计时问题。页面可能已加载,但您尝试访问的元素尚未创建:它可能通过脚本动态构建。您需要添加“wait”或使用某种循环来检测元素何时存在。抱歉,我已将html源代码添加到问题中。如果存在readyState,则不确定您是否可以可靠地使用readyState(例如)加载页面源后,正在进行其他调用或正在构造动态内容?我不确定您是否可以使用VBA可靠地操作IE!哈哈,但是你的观点是正确的——例如,如果点击触发了一个AJAX调用,readystate就不会改变。您必须编写一个循环来检查元素是否存在,这显然带来了一组全新的计时问题!
Sub Direnet()
Dim ieApp As InternetExplorer
'create a new instance of ie
Set ieApp = New InternetExplorer
'you don’t need this, but it’s good for debugging
ieApp.Visible = True
'go to the page we want
ieApp.Navigate "http://direnetdemos.com/casagarza-op/admin/index.php?route=tool/export_import&token=9reP7LOHg0SMChCYFBbcLPoQSjiQ72W1"
Do While ieApp.Busy: DoEvents: Loop
Do Until ieApp.ReadyState = READYSTATE_COMPLETE: DoEvents: Loop
With ieApp
.document.all.Item("input-username").Value = "xxxx"
.document.all.Item("input-password").Value = "xxxx"
.document.forms(0).submit
Do While ieApp.Busy: DoEvents: Loop
Do Until ieApp.ReadyState = READYSTATE_COMPLETE: DoEvents: Loop
'Click en pestaña Import
Dim Html As HTMLDocument
Set Html = ieApp.document
Application.Wait (Now + TimeValue("0:00:02"))
Html.querySelector("a[href='#tab-import']").Click
Html.querySelectorAll("input[name='incremental']")(1).Click
Html.querySelector("input[id='upload']").Click
Html.querySelector("a[onclick='uploadData();']").Click
End With
End Sub
Html.querySelector("a[href='#tab-import']").Click
Do
DoEvents
Loop Until Not ieApp.Busy And ieApp.ReadyState = READYSTATE_COMPLETE
Html.querySelectorAll("input[name='incremental']")(1).Click
Do
DoEvents
Loop Until Not ieApp.Busy And ieApp.ReadyState = READYSTATE_COMPLETE
Html.querySelector("input[id='upload']").Click
Do
DoEvents
Loop Until Not ieApp.Busy And ieApp.ReadyState = READYSTATE_COMPLETE
Html.querySelector("a[onclick='uploadData();']").Click
Do
DoEvents
Loop Until Not ieApp.Busy And ieApp.ReadyState = READYSTATE_COMPLETE