等待在asp.net站点中更新元素

时间:2013-12-16 20:25:16

标签: asp.net vba excel-vba excel

我正在使用excel vba为第三方.aspx网站创建各种API。 为了进行测试,我已将其设置为按ID搜索某人并打印网页上显示的姓名。

问题是,即使页面显示正确的名称,该函数也会打印搜索到的最后一个人的姓名而不是当前人员的姓名。 所以,

  • 搜索John Cleese的ID
    • 打印“Cleese,John”
  • 搜索Michael Palin的ID
    • 打印“Cleese,John”
  • 搜索Eric Idle的ID
    • 打印“佩林,迈克尔”
  • 搜索Terry Jones的身份证
    • 打印“Idle,Eric”

我相信原因是该函数在特定的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更适合这个吗?

0 个答案:

没有答案