Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Watin等邮件?_C#_Web_Watin - Fatal编程技术网

C# 如何在Watin等邮件?

C# 如何在Watin等邮件?,c#,web,watin,C#,Web,Watin,在我的C#code中,我使用Watin浏览网页,要登录到某个页面,我需要单击登录按钮,但在我想注销之后,我立即使用了单击注销按钮,但注销部分不起作用。我甚至尝试在登录后关闭浏览器(使用close方法),但没有成功。感觉上,一旦页面被更改(即登录后),c#的命令就不再有效 有人知道出了什么问题吗?watin click命令等待浏览器加载,实际上它会等待回发。 如果您使用ClickNoWait()命令,它将不会等待。 因此,如果您的代码看起来像这样,它应该可以工作: browser.GoTo("ww

在我的C#code中,我使用
Watin
浏览网页,要登录到某个页面,我需要单击登录按钮,但在我想注销之后,我立即使用了单击注销按钮,但注销部分不起作用。我甚至尝试在登录后关闭浏览器(使用close方法),但没有成功。感觉上,一旦页面被更改(即登录后),c#的命令就不再有效


有人知道出了什么问题吗?

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实例重新登录到另一个应答线程中提到的应用程序,而不是注销。睡眠(毫秒)是等待一段时间以加载某个内容的一种方式。非常、非常容易实现,但由于负载时间的变化,它远远不是最优的,如果您让它等待足够长的时间,那么最终将浪费大量的时间。在一次测试中,这并不是什么大问题,但例如,如果您必须等待5秒,并且您有1000次测试。。。。等等等等等等

我走的路线是:

  • 放入Thread.Sleep()以确定是否存在“等待”问题
  • 如果包含Sleep()的代码将被多次使用,请找出导致需要Sleep()的原因

  • 使用各种Wait…()方法重构Sleep()。WaitTilExists、WaitForAttributeEqualsWhatever、WaitForAsyncToFinish在Watin中,您将遇到许多代码不阻塞的情况(您将执行一行代码并立即继续),因此对于这些情况,您需要找到一种不同的方式来知道下一页(操作等)已经存在。例如,在登录页面上,您可以检查该页面是否有名为“用户名”的文本框:

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


    希望能有所帮助。

    OCary,你说得对,但很少有人会这样想。睡眠必须在上述情况下使用。如果网站的响应时间不可预测,尤其是在响应时间不可预测的情况下,您希望等待加载所需的时间,而不是等待任意长度的时间。我通过等待正确的项而不是使用sleep()从测试套件中删除了大量的执行时间。