【问题标题】:Invalid postback or callback argument. Event validation is enabled... - Under IIS 10 Selenium testing only无效的回发或回调参数。启用事件验证... - 仅在 IIS 10 Selenium 测试下
【发布时间】:2021-11-10 23:08:28
【问题描述】:

我正在努力解决一个仅在特定场景中出现的非常奇怪的问题。

我们正在将我们的网络托管环境从 win 2012 IIS 8 升级到 win 2019 IIS 10。我们在 .NET Framework 4.7.2 中构建了网络应用程序,并在 CLR 4.0 集成版下运行。

我有很多使用 Selenium 运行的自动化测试(Selenium.WebDriver nuget 包 3.141)。我们的其中一个页面能够根据它所显示的表单交换它使用的母版页。该测试在我们现有的环境中运行良好。其他形式也能正常工作。

但是,在新的 IIS 10 环境中,只有一个特定的母版页,并且仅适用于这个特定的表单页,如果:

  • Selenium 发布页面(通过提交按钮)
  • 返回验证错误
  • Selenium 然后通过同一个按钮使用有效或无效数据再次发布它
  • 页面因以下错误而崩溃:

错误级别 1

HttpUnhandledException -> 引发了“System.Web.HttpUnhandledException”类型的异常。堆栈跟踪:在 System.Web.UI.Page.HandleError(异常 e)在 System.Web.UI.Page.ProcessRequestMain(布尔值 includeStagesBeforeAsyncPoint,布尔型 includeStagesAfterAsyncPoint)
在 System.Web.UI.Page.ProcessRequest(布尔 includeStagesBeforeAsyncPoint,布尔型 includeStagesAfterAsyncPoint)
在 System.Web.UI.Page.ProcessRequest() 在 System.Web.UI.Page.ProcessRequest(HttpContext 上下文)在 ASP.plt_pltgeneral_aspx.ProcessRequest(HttpContext context) 在 c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET 文件\root\82a5c1fe\a330c9cd\App_Web_w4e2wdui.14.cs:第 0 行 System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 在 System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep 步骤)
在 System.Web.HttpApplication.ExecuteStep(IExecutionStep 步骤, Boolean & completedSynchronously)

错误级别 2

ArgumentException -> 无效的回发或回调参数。使用配置或 在页面中。出于安全目的, 此功能验证回发或回调事件的参数 源自最初呈现它们的服务器控件。如果 数据有效且符合预期,请使用 ClientScriptManager.RegisterForEventValidation 方法,以便 注册回发或回调数据以进行验证。堆栈跟踪:
在 System.Web.UI.ClientScriptManager.ValidateEvent(字符串唯一 ID, 字符串参数)在 System.Web.UI.Control.ValidateEvent(字符串 唯一ID,字符串事件参数)在 System.Web.UI.WebControls.DropDownList.LoadPostData(字符串 postDataKey, NameValueCollection postCollection) 在 System.Web.UI.Page.ProcessPostData(NameValueCollection postData, 布尔 fBeforeLoad) 在 System.Web.UI.Page.ProcessRequestMain(布尔值 includeStagesBeforeAsyncPoint,布尔型 includeStagesAfterAsyncPoint)

如果通过手动测试以相同的顺序提交相同的表单,它就可以正常工作。但是,如果您通过 selenium 启动浏览器,然后暂停测试并手动完成序列,它仍然会爆炸。因此,Selenium、IIS 10、第二次回发的页面以及此特定母版页的组合存在一些问题。

我目前的理论是,因为这一切都在现有环境中有效,所以在 IIS 10 中必须随着事件验证的发生方式发生变化。它是在两种环境中运行的相同代码。

我正在寻找有关 IIS 升级为什么会触发这个非常具体的问题的理论/修复,以及可能触发它的原因,以便我可以解决它。

编辑:

我已将问题追溯到一个旧的隐藏下拉列表:

            <div style="float: right; position: relative; visibility: hidden;" class="nav2">
                &nbsp;&nbsp;&nbsp;&nbsp;
                &nbsp;&nbsp;
                <asp:DropDownList ID="ddlCountry" runat="server" AutoPostBack="true" Visible="false" EnableViewState="false" OnSelectedIndexChanged="ddlCountry_OnSelectedIndexChanged" />
            </div>

呈现为以下 HTML:

            <div style="float: right; position: relative; visibility: hidden;" class="nav2">
                &nbsp;&nbsp;&nbsp;&nbsp;
                &nbsp;&nbsp;
                <select name="ctl00$ddlCountry" onchange="javascript:setTimeout(&#39;__doPostBack(\&#39;ctl00$ddlCountry\&#39;,\&#39;\&#39;)&#39;, 0)" id="ctl00_ddlCountry">
<option value="All">All</option>
<option selected="selected" value="1">United States</option>

如果我修改包装 div 使其不呈现:

<div style="float: right; position: relative; visibility: hidden;" class="nav2" runat="server" Visible="false">

然后问题就消失了。

在这种情况下,这对我来说是一个很好的解决方案,因为无论如何这都会清除旧代码。然而,它仍然感觉 IIS 中发生了一些变化(可能已经修复),导致它的行为有所不同。

【问题讨论】:

  • 这是服务器端错误,服务器不知道Selenium 来自真人。您是否尝试过使用浏览器的开发工具、Fiddler、Wireshark 或其他工具检查 HTTP 请求,以了解 Selenium 与手动执行相比有何不同?
  • 我没有,不过那会是一个有趣的练习。

标签: c# asp.net iis selenium-chromedriver


【解决方案1】:

问题最终是隐藏的 DropDownList 控件,即使它被设置为不可见,.net 仍在呈现该控件。一旦我删除了旧代码,问题就解决了。

我最好的猜测是这里有两个错误。呈现一个本应不可见的控件的 .net 错误。还有一个新的 IIS 10/CLR 错误,它不会忽略对不可见控件的更改。

这两个潜在的错误以及可能被 selenium 修改的不可见控件可能都合并在一起为我创建了这个场景。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 2014-11-18
    相关资源
    最近更新 更多