什么是等待页面上的元素的更好方法Waitforcomplete()或system.threading.thread.sleep()

时间:2009-04-15 09:16:53

标签: nunit cruisecontrol.net watin

我在watiN中使用WaitforComplete()但它似乎不能正常工作。即使您有更长的等待时间,它也会执行下一个语句。我正在使用thread.sleep()来停止我的应用程序,直到它获得所需的页面或元素。但事情是页面非常动态,有时需要更长的时间。

任何更好的解决方案。任何会捕获页面的东西都会动态返回,不会在应用程序中执行下一个语句。

代码示例

    'Show Details page
    Assert.AreEqual("Confirmation", _internetExplorer.Title)

    If (_internetExplorer.Button(Find.ById(New Regex("btnFinish"))).Exists) Then
        _internetExplorer.Button(Find.ById(New Regex("btnFinish"))).Click()
    Else
        Assert.Fail("Could not Find Finish Booking Button on Confirmation Page")
    End If

    System.Threading.Thread.Sleep(100000)

'显示预订摘要页面         Assert.AreEqual(“显示预订”,_internetExplorer.Title)

我想要一些动态检测页面返回的东西。而不是给出一些恒定的价值。

3 个答案:

答案 0 :(得分:5)

WaitForComplete仅在某些操作后有回发时才有效。否则你必须找到别的东西等待。下面是一个关于如何等待指定标题的示例:

_internetExplorer.Element("title", "Confirmation").WaitUntilExists();

我总是更喜欢使用WaitXXX方法之一而不是Thread.Sleep,因为WaitXXX方法只会等到达到约束。睡眠等待你指定的时间。如果它很长,时间就会缩短。如果简短,就会出现问题。

HTH, 的Jeroen

答案 1 :(得分:4)

一旦浏览器将其准备状态设置为comllete并将busy状态设置为false,WaitForComplete方法将继续显示。

我通常做的是尝试访问您需要的内容,然后执行thread.sleep半秒钟,然后再试一次。我还有一个全局超时,在10秒后退出。

    int timeout = 20;
    bool controlFound = false;
    for (int i = 0; i < timeout; i++)
    {
        if (_internetExplorer.Button(Find.ById(New Regex("btnFinish"))).Exists)
        {
            _internetExplorer.Button(Find.ById(New Regex("btnFinish"))).Click();
            controlFound = true;
            break;
        }
        else
        {
            System.Threading.Thread.Sleep(500);
        }   
    }


   if (!controlFound)
   {
        Assert.Fail("Control not found");
   }

答案 2 :(得分:0)

如果正在执行下一个语句,则应该找到相应的元素。我建议发布您正在尝试的代码示例。