При выборе значения Asp.Net DropDownList с помощью Watin генерируется исключение System.FormatException - PullRequest
2 голосов
/ 07 апреля 2011

Я пытаюсь протестировать asp: DropDownList с помощью Watin, но когда я пытаюсь выбрать опцию из визуализированного 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: Строка не была признана действительной Boolean. в System.Boolean.Parse (String value) в WatiN.Core.Option.setSelected (Boolean значение, Boolean 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:

...
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>

Таким образом, он не может разобрать "выбранный" в логическое значение, что имеет смысл. Как я могу пройти через это?

Ответы [ 4 ]

3 голосов
/ 12 июля 2011
<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>

Попробуйте и дайте мне знать, что происходит.

1 голос
/ 07 апреля 2011

Кажется, что это ошибка в WatiN, об этом упоминалось на днях вместе с атрибутом «только для чтения»:

Как справиться с атрибутами «только для чтения» и «выбранными» в WatiN 2.0 против IE9

Предполагая, что это так, одним из решений будет изменение источника Ватина аналогично помеченному ответу на этот вопрос. И отправьте патч, если можете, чтобы он работал и для всех нас!

0 голосов
/ 03 мая 2011

Как уже упоминалось, это похоже на ошибку в WatiN при тестировании на IE9.Как и предполагалось, исправление кода и отправка исправления, вероятно, является лучшим решением, но временно вы также можете настроить IE9 для запуска тестируемой страницы в представлении совместимости.По крайней мере, в моем случае это сработало.

Просто один раз перейдите на страницу вручную, нажмите кнопку Просмотр совместимости, и IE должен запомнить это при следующем запуске тестов.

0 голосов
/ 08 апреля 2011

Кажется, это ошибка в WatiN.Внутренне Internet Explorer до версии 8 возвращал логическое значение при вызове getAttribute метода для таких атрибутов, как readonly или selected, даже если у вас было selected='selected' или readonly='readonly':

Internet Explorer 8 или более поздняя версия.В режиме IE8 свойство value корректно отображается как имя канонического атрибута.Например, и оба установят поле ввода текста только для чтения.В режиме IE8 значение оценивается как каноническое значение «только для чтения».В IE7 и более ранних режимах оно оценивается как логическое значение, true.

Как вы, вероятно, сейчас, IE выбирает, как интерпретировать ваш документ, используя такие вещи, как doctype и т. Д. Я пытаюсь сказать, чтокогда я запускал твой код в IE 9, у меня была та же проблема, что и у тебя.Когда я запустил его в IE 8, все было в порядке, вероятно, потому что мой html был искажен, и IE изменил режим совместимости на режим совместимости.

Вы можете попробовать настроить реестр, чтобы заставить ваш IE вести себя как IE 7. К сожалению,Я не могу проверить это сейчас - у меня установлен IE 9 на другом компьютере.Ознакомьтесь с статьей Internet Feature Controls на MSDN или Подробнее в статье об улучшениях расширения IE8 на ieblog и попробуйте установить в реестре значение от iexplore.exe до 7000.

...