在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。这可能吗?
答案 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;
}
}
}
}
}