C# Selenium-如何验证单击时未提交的表单?(客户验证工作)

C# Selenium-如何验证单击时未提交的表单?(客户验证工作),c#,selenium,C#,Selenium,是否有方法验证在使用Selenium单击“提交”时未重新加载页面 目前,测试指示浏览器打开提交表单,并立即单击“提交”,而不填写字段 通过这种方式,我将验证客户端验证是否有效,并且不会向服务器发出不必要的请求 顺便说一句,我在用C#,如果有关系的话 我认为在这种情况下,您必须在提交时验证页面,无论是成功的页面还是原始页面,以确定表单输入是否成功:) 通常,您将验证给定弹出窗口或登录表单上返回的错误消息,这将导致您得出输入不成功的结论,但在本例中,这似乎是不可能的 断言给定的页面URI和/或页面元

是否有方法验证在使用Selenium单击“提交”时未重新加载页面

目前,测试指示浏览器打开提交表单,并立即单击“提交”,而不填写字段

通过这种方式,我将验证客户端验证是否有效,并且不会向服务器发出不必要的请求


顺便说一句,我在用C#,如果有关系的话

我认为在这种情况下,您必须在提交时验证页面,无论是成功的页面还是原始页面,以确定表单输入是否成功:)

通常,您将验证给定弹出窗口或登录表单上返回的错误消息,这将导致您得出输入不成功的结论,但在本例中,这似乎是不可能的


断言给定的页面URI和/或页面元素将帮助您确定结果。

如果只需要重新加载检查,您可以检查页面上先前存在的元素是否过时。一个小代码示例:

    public bool IsNewPageLoaded(IWebElement elementToGoStale)
    {
        try
        {
            var enabled = elementToGoStale.Enabled;
            return false;
        }
        catch(Exception ex)
        {
            if (ex is StaleElementReferenceException || ex is NoSuchElementException)
            {
                return true; // Expected exception on accessing stale element: page has been renewed
            }

            throw ex;
        }
    }
很好的一点是,您不需要任何关于页面加载后发生什么的额外信息:您所需要的只是存储一个IWebElement,稍后可以在其上进行检查


我在测试中使用类似的检查。虽然我仍然认为尝试/捕获部分很丑陋,到目前为止已经证明是非常可靠的。

< P>基于@ Tyb的回答,我已经管理了一个助手类。
public类noreloadvericationcontext:IDisposable
{
私有只读IWebElement bodyElement;
公共NORELOAdvertificationContext(IWebDriver webDriver)
{
this.bodyElement=webDriver.FindElement(按.TagName(“body”));
}
public void Dispose()=>Assert.True(this.bodyElement.Enabled);
}
我在一些提供API的软件项目中见过这种方法——例如,创建一个上下文,在处理之前不需要以管理员身份签名就可以进行操作

用法示例:

//此块断言在内部执行操作后没有重新加载
//否则它会抛出一个异常——这对我来说没关系。
使用(新的NoreloAdvertificationContext(驱动程序))
{
//由于缺少客户端验证,这将提交表单并导致页面重新加载
driver.findelementbycsselector(“表单输入[type=submit]”)。单击();
}//此处将发生异常。
我不知道这是否是最好的解决方案,但它在大多数情况下都会起作用(不仅仅是在形式上)


另一种方法是在我的表单中获取
\uu RequestVerificationToken
的值(MVC在每个表单的末尾生成该值),然后执行一些操作,然后再次获取值并与旧值进行比较。但这只适用于表单提交

成功提交时会发生什么?服务器在出现错误时会呈现相同的页面,成功提交时会返回一个重定向到成功页面,我会搜索事件处理程序之类的内容,例如页面是否正在刷新、加载或导航发生等。感谢您的评论,我将在这个案例上做一些扩展方法…并将分享一些解决方案,@mihkov如果你觉得这条评论有希望达成一个解决方案,当你得到一个好的解决方案时,不要害怕标记它,它是否在其他浏览器中工作-Firefox、Internet explorer、Edge?目前,我只有两个使用ChromeI的测试,主要在Chrome和Firefox中工作,尽管我为IE编写的少数测试也使用了这个概念。IE还带来了许多其他(不相关的)问题,所以最终我限制了我们在那里的测试。