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

发布于 2024-07-17 06:41:01 字数 789 浏览 4 评论 0原文

我在 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("Display Booking", _internetExplorer.Title)

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

I am Using WaitforComplete() in watiN but it doesnt seems to work well. As it executes the next statement even if you have given longer time to wait. I am using thread.sleep() to stop my application until it gets the desired page or element. But the thing is pages are so much dynamic that sometimes it takes much longer time as specified.

Any better solution. Any thing that will catch the page return dynamically and dont go to execute next statments in application.

Sample of Code

    '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)

'Show Booking Summary page
Assert.AreEqual("Display Booking", _internetExplorer.Title)

I want something that detect the return of page dynamically. instead of giving some constant value.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

秉烛思 2024-07-24 06:41:01

只有在执行某些操作后有回发时,WaitForComplete 才能正常工作。 不然就得找别的事等着。 下面是有关如何等待指定标题的示例:

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

我总是更喜欢使用 WaitXXX 方法之一而不是 Thread.Sleep,因为 WaitXXX 方法只会等待直到满足约束。 Sleep 会等待您指定的时间。 如果太长,时间就被浪费了。 如果它太短,就会出现问题。

哈特哈,
杰罗恩

WaitForComplete only works well if there is a postback after some action. Otherwise you have to find something else to wait for. Following an example on how to wait for the specified title:

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

I would always prefer to use one of the WaitXXX methods instead of Thread.Sleep cause the WaitXXX methods do only wait until the contraint is met. Where as Sleep waits for the time you specified. If its to long, time is waisted. If its to short, problems arise.

HTH,
Jeroen

与酒说心事 2024-07-24 06:41:01

一旦浏览器将其就绪状态设置为完成并将繁忙状态设置为 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");
   }

The WaitForComplete method esentially moves on once the browser has set it's readystate to comllete and the busy state to false.

What I typically do is to try and access what you need to, then perform a thread.sleep for say half a second, then try again. I also have a global timeout that quits after say 10 seconds.

    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");
   }
彡翼 2024-07-24 06:41:01

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

If it is executing the next statement, it should be finding the corresponding element. I suggest posting a sample of the code you are trying.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文