如何在Watin等待帖子?

时间:2013-02-02 20:23:19

标签: c# web watin

在我的C#代码中,我使用Watin来浏览网页,登录页面,我需要点击登录按钮,但是在我想要注销后,我就有了之后单击“注销”按钮,但注销部分不起作用。我甚至尝试在登录后关闭浏览器(使用close方法),但它不起作用。感觉就像页面一改变(即登录后),c#中的命令就不再有效。

有谁知道什么是错的?

4 个答案:

答案 0 :(得分:1)

正如另一个答案中所提到的,Thread.Sleep(毫秒)是一种等待加载某个时间段的方法。非常,非常容易实现,但由于加载时间不同,它远远不是最佳的,如果你把它做得足够长以至于总是等待足够长的时间,你最终会浪费很多时间。在一次测试中,这不是什么大问题,但是例如,如果你必须等待5秒钟,你有1000次测试......等等。

我走的路线是:

  1. 输入Thread.Sleep()以确定它是否是“等待”问题。
  2. 如果要使用Sleep()的代码不止一次,请找出导致睡眠需求的原因()。
  3. 使用各种Wait ...()方法重构Sleep()。 WaitTilExists,WaitForAttributeEqualsWhatever,WaitForAsyncToFinish< - 不是真正的方法,但WatiN内置了一堆
  4. 现在等待我的主要原因是ASP.NET中的JQuery异步调用,我创建了一个静态帮助程序类,对我来说等待异步调用完成。这些往往非常特定于您正在测试的站点所编写的框架。

答案 1 :(得分:0)

watin click命令等待浏览器加载,所以实际上它等待回发。 如果您使用ClickNoWait()命令它将不会等待。 因此,如果您的代码看起来像这样,它应该可以工作:

browser.GoTo("www.your-site.com");
// fill user/pass
browser.Button(Find.ByClass("login-class")).Click();
browser.Button(Find.ByClass("logout-class")).Click();

如果它仍无法正常工作,您可以在登录后添加此内容点击 browser.WaitForComplete();

答案 2 :(得分:0)

在Watin中,您会遇到许多代码无阻塞的情况(您将执行一行代码并立即继续),因此对于这些情况,您需要找到一种不同的方式来了解下一页(动作等)已经存在。例如,在登录页面上,您可以检查该页面是否具有名为UserName的文本框:

<code>      
    TextField uName = browser.TextField(Find.ByName("userName"));    
    if(uName.Exists)
    {
         // Then do the login code....
    }
</code>

以同样的方式,您应该在继续执行代码之前控制登录后的页面。例如,如果您要登录到您知道将包含文本的页面:&#34;您的帐户详细信息&#34;你可能会这样做:

<code>
    browser.GoTo("http://www.yourdomain.com/login.aspx");
    //do your login code

    browser.WaitUntilContainsText("Your Account Details", 240); // the second parameter indicates the seconds it will wait before it times out.

    // your code to deal with the page after the login.  
</code>

使用Thread.Sleep是一个混乱的秘诀,这肯定是一个问题,你永远不会在网页上获得正确的时间(即使你认为它需要10秒钟,它可能永远不会回来和那一点,服务器将终止打开的连接。)

希望它有所帮助。

答案 3 :(得分:-1)

在脚本中使用Thread.sleep与注销和登录同步... 要么 而不是注销你直接关闭应用程序并使用ie实例重新登录到应用程序