当Selected Option上下文参数不存在时,在Visual Studio 2013 webtest中抑制WebTestException

时间:2016-01-29 15:54:08

标签: visual-studio-2013 web-testing

在Visual Studio 2013 WebTest中,我正在使用" Selected Option"提取规则将DropDown的值提取到Context参数中。只要存在选定的选项,它就可以正常工作。如果选择的选项不存在(在我的测试中完全可以接受),则测试会抛出异常,"选择标记' SuchAndSuch'没找到。"

错误消息具有误导性。当我看到响应时,我看到了select标签" SuchAndSuch"确实存在,它只是没有选定的选项。也就是说,这个Html标签存在:

<select name="SuchAndSuch">

但它没有这样的子标签:

<option selected="selected">

我也尝试使用&#34;提取属性值&#34;提取规则以在下拉列表中提取所选项目,因为后一规则具有&#34;必需&#34;属性。

规则是寻找标签的第一个实例&#34;选项&#34;具有属性&#34; selected = selected,&#34;然后提取&#34;值&#34;的值属性。我有&#34;必需&#34; false,因为此下拉菜单不会始终包含所选项目。

我的Extract Attribute Value规则的属性如下:

<RuleParameters>
        <RuleParameter Name="TagName" Value="option" />
        <RuleParameter Name="AttributeName" Value="value" />
        <RuleParameter Name="MatchAttributeName" Value="selected" />
        <RuleParameter Name="MatchAttributeValue" Value="selected" />
        <RuleParameter Name="HtmlDecode" Value="True" />
        <RuleParameter Name="Required" Value="False" />
        <RuleParameter Name="Index" Value="0" />
</RuleParameters>

只要下拉列表中包含所选项目,此方法就可以正常工作。当它没有时,WebTest抛出WebTestException

  

上下文参数&#39; SuchAndSuch&#39;在测试环境中找不到

并且请求未执行。

我希望的行为是当这个特定的下拉列表缺少一个选定的项目时,我希望特定的请求继续执行,我希望测试不记录WebTestException。这可能吗?

1 个答案:

答案 0 :(得分:0)

这种情况下的答案是编写自定义提取规则:https://msdn.microsoft.com/en-us/library/ms243179(v=vs.120).aspx

我为自己创建的规则如下,它基于我从这里偷走的代码:https://social.msdn.microsoft.com/Forums/en-US/df4f2a0b-2fc4-4d27-9380-ac80100ca0b7/need-help-with-complex-extraction-rule?forum=vstswebtest

我首先在与webtest相同的项目中创建规则。当我运行webtest时,它在尝试加载提取规则时立即出现“FileNotFound”异常错误。我将提取规则移动到一个单独的项目,并从Web测试项目中引用它,它解决了这个问题。

[DisplayName("Extract Single-Select Dropdown")]
    [Description("Extracts the attribute value of AttributeName from the selected option if selected option exists.")]
    public class ExtractSingleSelectDropdown : ExtractionRule
    {
        [Description("The 'name' attribute of the rendered 'select' tag.")]
        public string DropdownName { get; set; }
        [Description("The name of the attribute of the rendered 'option' tag that contains the value that is extracted to the Context Parameter.")]
        public string OptionAttributeName { get; set; }
        [Description("When true, sets Success 'false' if a selected option is not found.")]
        public bool Required { get; set; }

        public override void Extract(object sender, ExtractionEventArgs e)
        {
            if (e.Response.HtmlDocument != null)
            {
                var tags = e.Response.HtmlDocument.GetFilteredHtmlTags(new string[] { "select", "option" });
                if (tags != null && tags.Count() > 0)
                {
                    //find the first <select><option selected="selected"> tag
                    var selectedOption = tags.SkipWhile(tag => String.IsNullOrWhiteSpace(tag.GetAttributeValueAsString("name")) || !tag.GetAttributeValueAsString("name").Equals(this.DropdownName, StringComparison.InvariantCultureIgnoreCase)) // skip tags that aren't the select tag we're looking for
                        .Skip(1) // skip the <select> tag
                        .TakeWhile(tag => tag.Name.Equals("option"))
                        .Where(tag => String.IsNullOrWhiteSpace(tag.GetAttributeValueAsString("selected"))) //
                        .FirstOrDefault();

                    if (selectedOption == null)
                    {
                        e.Message = string.Format("Zero selected options in Dropdown {0}", DropdownName);
                        e.WebTest.Context[ContextParameterName] = string.Empty;
                        e.Success = (this.Required ? false : true);
                    }
                    else
                    {
                        e.WebTest.Context[ContextParameterName] = selectedOption.GetAttributeValueAsString(OptionAttributeName);
                        e.Success = true;
                    }
                }
            }
        }
    }