【问题标题】:Selecting Asp.Net DropDownList Value with Watin throws an System.FormatException使用 Watin 选择 Asp.Net DropDownList 值会引发 System.FormatException
【发布时间】:2011-07-31 16:50:22
【问题描述】:

我正在尝试使用 Watin 测试一个 asp:DropDownList,但是当我尝试从呈现的 SelectList 中选择一个选项时,它会引发 System.FormatException:字符串未被识别为有效的布尔值。

我的页面代码是:

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
    CodeBehind="Default.aspx.cs" Inherits="TesteSelect._Default" %>

<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
   <asp:DropDownList  ID="ddl"
    Width="75px" runat="server">

    <asp:ListItem Text="Yes" Value="true" Selected="true"></asp:ListItem>
    <asp:ListItem Text="No" Value="false"></asp:ListItem>
    </asp:DropDownList>
</asp:Content>

我的测试是:

using NUnit.Framework;
using WatiN.Core;

namespace Test
{
    [TestFixture]
    public class ATest
    {
        [Test]
        public void Should_be_able_to_select_yes_from_ddl()
        {
            using( var browser = new IE())
            {
                browser.GoTo(Properties.Settings.Default.ServerAddress + "Default.aspx");
                SelectList ddl = browser.SelectList(Find.ById("MainContent_ddl"));
                ddl.Option("Yes").Select();

                Assert.That(ddl.SelectedItem.Equals("Yes"));
            }
        }
        [Test]
        public void Should_be_able_to_select_no_from_ddl()
        {
            using (var browser = new IE())
            {
                browser.GoTo(Properties.Settings.Default.ServerAddress + "Default.aspx");
                SelectList ddl = browser.SelectList(Find.ById("MainContent_ddl"));
                ddl.Option("No").Select();

                Assert.That(ddl.SelectedItem.Equals("No"));
            }
        }
    }
}

“否”测试没有问题通过,但“是”测试失败并出现该异常和此堆栈跟踪:

ATest.Should_be_able_to_select_yes_from_ddl :FailedSystem.FormatException: 字符串未被识别为有效 布尔值。在 System.Boolean.Parse(字符串值)在 WatiN.Core.Option.setSelected(布尔 值,布尔值 WaitForComplete) 在 WatiN.Core.Option.Select() 在 Test.ATest.Should_be_able_to_select_yes_from_ddl() 在 ATest.cs:第 16 行

查看此处提供的源代码 => http://watin.svn.sourceforge.net/viewvc/watin/trunk/src/Core/Option.cs?revision=1194&view=markup

我可以看到错误发生在第 136 行的这个 sn-p 处:

...
134             private void setSelected(bool value, bool WaitForComplete)
135                 {
136                     if (bool.Parse(GetAttributeValue("selected")) == value) return;
137 
138             SetAttributeValue("selected", value.ToString().ToLowerInvariant());
139                     if (WaitForComplete)
140                     {
141                         ParentSelectList.FireEvent("onchange");
142                     }
143                     else
144                     {
145                         ParentSelectList.FireEventNoWait("onchange");
146                     }
147                 }

当我查看生成的 HTML 时,这是有道理的,因为这是呈现的内容:

<select name="ctl00$MainContent$ddl" id="MainContent_ddl" style="width:75px;">
    <option selected="selected" value="true">Yes</option>
    <option value="false">No</option>

</select>

因此它无法将“选择”解析为布尔值,这是有道理的。我该怎么办?

【问题讨论】:

  • GetAttributeValue("selected") 应该返回 true。你用的是什么版本的IE?
  • 我使用的是 IE9。但是源代码没有为'selected="selected''准备好'。
  • 它已准备好,因为 IE 的内部行为。 “证明”:您的代码在我的带有 IE 8 的计算机上运行良好。编辑:在 IE 8 及更高版本中,它取决于 IE“模式”。请参阅:msdn.microsoft.com/en-us/library/ms536429(VS.85).aspx 是的 - 这是 WatiN IMO 中的一个错误,但与 IE 的某些版本和模式有关。
  • 你应该把它作为答案,@prostynick
  • 即使在 IE8 模式下,我也无法使用 IE8 复制此内容。这一定是我错过的 IE9 问题,导致 WatiN 测试套件中的所有页面强制 IE(9) 以 IE8 运行,可能导致旧行为。

标签: asp.net select drop-down-menu watin


【解决方案1】:
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<asp:DropDownList  ID="ddl" Width="75px" runat="server">
    <asp:ListItem Text="Yes" Value="1" Selected="true"></asp:ListItem>
    <asp:ListItem Text="No" Value="0"></asp:ListItem>
</asp:DropDownList>

试试这个,让我知道会发生什么。

【讨论】:

    【解决方案2】:

    似乎是WatiN中的一个错误,前几天与'readonly'属性一起提到过:

    How to cope with 'readonly' and 'selected' attributes in WatiN 2.0 against IE9

    假设是这种情况,一种解决方案是以与该问题的标记答案类似的方式修改 Watin 源。如果可以,请提交补丁,这样它也适用于我们其他人!

    【讨论】:

    • 格兰特,你也用IE 9吗?当selected='selected' 在IE 7 和8 中GetAttributeValue("selected") 将返回true。这就是 IE 在内部的工作方式。
    • 在问题下查看我的评论。
    • 不,我什至没有使用下拉菜单,只是指向一个类似的答案。没有安装 iE9 试试看。
    • 是的。在问题和链接下查看我的评论:msdn.microsoft.com/en-us/library/ms536429(VS.85).aspx(以“Internet Explorer 8 或更高版本”开头的段落)
    • 谢谢,我想我会更改源代码并作为补丁提交。
    【解决方案3】:

    这似乎是 WatiN 中的一个错误。在版本 8 之前的内部 Internet Explorer 在为 readonlyselected 之类的属性调用 getAttribute method 时返回布尔值,即使您有 selected='selected'readonly='readonly'

    Internet Explorer 8 或更高版本。在 IE8 模式下,value 属性被正确报告为规范属性名称。例如,并且都将输入文本字段设置为只读。在 IE8 模式下,该值被评估为规范值,“只读”。在 IE7 和更早的模式下,它被评估为布尔值,true。

    正如您现在可能的那样,IE 选择如何使用 doctype 等内容来解释您的文档。我想说的是,当我在 IE 9 上运行您的代码时,我遇到了和您一样的问题。当我在 IE 8 上运行它时,一切正常,可能是因为我的 html 格式错误,并且 IE 将其兼容模式更改为 quirks 模式。

    您可以尝试设置注册表以强制您的 IE 像 IE 7 一样运行。不幸的是,我现在无法测试它 - 我在不同的计算机上安装了 IE 9。查看Internet Feature Controls article on MSDNMore IE8 Extensibility Improvements article on ieblog 并尝试将iexplore.exe 的注册表设置为7000。

    【讨论】:

      【解决方案4】:

      正如其他人所提到的,在针对 IE9 进行测试时,这似乎是 WatiN 的一个错误。正如建议的那样,修复代码并提交补丁可能是最好的解决方案,但您也可以暂时将 IE9 设置为在 Compability View 中运行被测页面。至少在我的情况下这是有效的。

      只需手动导航到该页面一次,单击 Compability View 按钮,IE 应该会在您下次运行测试时记住这一点。

      【讨论】:

      • 顺便提一下:从 WatiN 版本 2.1.0.1196 开始,这似乎已得到修复。我的测试至少通过了,即使 IE9 不在 Compability View 中。
      猜你喜欢
      • 1970-01-01
      • 2019-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多