在我的 C# 代码中,我Watin
用来浏览网页,登录到一个页面,我需要点击登录按钮,但是在我想注销之后,所以我有点击注销按钮,但是注销部分不起作用。我什至尝试在登录后关闭浏览器(使用 close 方法),但没有奏效。感觉一旦页面发生更改(即登录后),来自 c# 的更多命令将不再起作用。
有谁知道出了什么问题?
正如另一个答案中提到的 Thread.Sleep(milliseconds) 是一种等待一段时间以加载某些内容的方法。非常非常容易实现,但由于加载时间不同,它远非最佳,如果你让它足够长以至于它总是等待足够长的时间,你最终会浪费很多时间。在一次测试中,这没什么大不了的,但是例如,如果您必须等待 5 秒钟并且您有 1000 次测试......等等等等等等。
我走过的路线是:
现在等待我的主要原因是 ASP.NET 中的 JQuery 异步调用,我创建了一个静态帮助器类,它可以很好地等待异步调用完成。这些往往非常特定于您正在测试的网站所使用的框架。
在 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 秒它可能永远不会回来,那时服务器将终止打开的连接)。
希望能帮助到你。
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();
在脚本中使用 Thread.sleep 与注销和登录同步...或者直接关闭应用程序并使用 ie 实例重新登录应用程序而不是注销