2

在我的 C# 代码中,我Watin用来浏览网页,登录到一个页面,我需要点击登录按钮,但是在我想注销之后,所以我有点击注销按钮,但是注销部分不起作用。我什至尝试在登录后关闭浏览器(使用 close 方法),但没有奏效。感觉一旦页面发生更改(即登录后),来自 c# 的更多命令将不再起作用。

有谁知道出了什么问题?

4

4 回答 4

1

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

我走过的路线是:

  1. 放入 Thread.Sleep()s 以确定它是否是“等待”问题。
  2. 如果要多次使用带有 Sleep() 的代码,请找出导致需要 sleep() 的原因。
  3. 使用各种 Wait...() 方法重构 Sleep()。WaitTilExists、WaitForAttributeEqualsWhatever、WaitForAsyncToFinish <- 不是真正的方法,但 WatiN 内置了一堆

现在等待我的主要原因是 ASP.NET 中的 JQuery 异步调用,我创建了一个静态帮助器类,它可以很好地等待异步调用完成。这些往往非常特定于您正在测试的网站所使用的框架。

于 2013-02-04T15:22:16.317 回答
0

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

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

同样,在继续执行代码之前,您应该控制登录后的页面是否存在。例如,如果您登录到一个您知道将包含文本的页面:“您的帐户详细信息”,您可能会执行以下操作:

<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 秒它可能永远不会回来,那时服务器将终止打开的连接)。

希望能帮助到你。

于 2014-10-30T20:01:41.777 回答
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();

于 2013-02-03T13:48:38.067 回答
-1

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

于 2013-02-04T14:17:12.123 回答