【发布时间】: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