【发布时间】: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">
<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">
<select name="ctl00$ddlCountry" onchange="javascript:setTimeout('__doPostBack(\'ctl00$ddlCountry\',\'\')', 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