我正在使用excel vba为第三方.aspx
网站创建各种API。
为了进行测试,我已将其设置为按ID搜索某人并打印网页上显示的姓名。
问题是,即使页面显示正确的名称,该函数也会打印搜索到的最后一个人的姓名而不是当前人员的姓名。 所以,
我相信原因是该函数在特定的html元素之前获取了名称,其中的人名已经更新。 .Busy
或.ReadyState
似乎无效,因为该网站是ASP.NET
代码
Public Function search(ID as string)
With IE
.Navigate idSearch_URL
Do While .ReadyState <> 4 Or .Busy: DoEvents: Loop ' wait
With .Document
.getElementByID(idSearchTxt_ID).Vlaue = ID ' enter id
.getEleentById(idFindBtn_ID).Click ' search it
End With
Do While .ReadyState <> 4 Or .Busy: DoEvents: Loop ' wait
Debug.Print .Document.getElementByID(nameLabelID).innerText ' Prints prev. name
End With
End Function
我知道问题是等待循环不等待现有元素更新,因为如果我使用调试器设置或只是在Sleep
之前插入Debug.Print
调用,那么打印正确的名称。我可以使用哪些方法等到nameLabelID
更新或所有网页都已更新。
我不想使用Sleep
电话,因为这是浪费时间,我不能把它缩短到10毫秒,因为我不知道这是否足够长。
我认为我不应该分享网站的大部分源代码。但是,如果解决方案涉及它们,我可以删除一些javascript函数。
PS。我对ASP.NET一无所知。站点的行为表示在导航站点时设置了一些局部变量。他们是客户方吗?有没有办法直接抓住这些并绕过阅读网页?
PPS,这可能只是为了评论,但像perl或ruby这样的其他语言比VBA更适合这个吗?