HOW TO:建立自訂擷取規則
更新:2007 年 11 月
您可以建立自己的擷取規則。若要執行這項操作,可以從擷取規則類別中衍生自己的規則。擷取規則衍生自 ExtractionRule 基底類別。
Visual Studio Team System Test 版提供了一些預先定義的擷取規則。如需詳細資訊,請參閱關於擷取規則。
注意事項: |
---|
您也可以建立自訂驗證規則。如需詳細資訊,請參閱關於驗證規則。 |
若要建立自訂擷取規則
開啟包含 Web 測試的測試專案。
(選擇性) 建立個別的類別庫專案,以存放擷取規則。
重要事項: 您可以在測試所在的同一個專案中建立類別。不過,如果要重複使用規則,最好是建立個別的類別庫專案,以存放規則。如果您要建立個別的專案,必須完成本程序中的選擇性步驟。
(選擇性) 在類別庫專案中,加入 Microsoft.VisualStudio.QualityTools.WebTestFramework dll 的參考。
建立從 ExtractionRule 類別衍生的類別。實作 Extract 和 RuleName 成員。
(選擇性) 建立新的「類別庫」專案。
(選擇性) 在測試專案中,加入包含自訂擷取規則之類別庫專案的參考。
在測試專案中,開啟 [Web 測試編輯器] 中的 Web 測試。
若要加入自訂擷取規則,請以滑鼠右鍵按一下 Web 測試要求,然後選取 [加入擷取規則]。
[加入擷取規則] 對話方塊隨即出現。您會在 [選取規則] 清單中看到您的自訂驗證規則,以及預先定義的驗證規則。選取您的自訂擷取規則,然後按一下 [確定]。
執行您的 Web 測試。
範例
下列程式碼顯示自訂擷取規則的實作。這個擷取規則會從指定的輸入欄位中擷取值。可以使用這個範例做為您自訂擷取規則的起點。
using System;
using System.Collections.Generic;
using Microsoft.VisualStudio.TestTools.WebTesting;
using System.Globalization;
namespace ClassLibrary2
{
//-------------------------------------------------------------------------
// This class creates a custom extraction rule named "Custom Extract Input"
// The user of the rule specifies the name of an input field, and the
// rule attempts to extract the value of that input field.
//-------------------------------------------------------------------------
public class CustomExtractInput : ExtractionRule
{
/// Specify a name for use in the user interface.
/// The user sees this name in the Add Extraction dialog box.
//---------------------------------------------------------------------
public override string RuleName
{
get { return "Custom Extract Input"; }
}
/// Specify a description for use in the user interface.
/// The user sees this description in the Add Extraction dialog box.
//---------------------------------------------------------------------
public override string RuleDescription
{
get { return "Extracts the value from a specified input field"; }
}
// The name of the desired input field
private string NameValue;
public string Name
{
get { return NameValue; }
set { NameValue = value; }
}
// The Extract method. The parameter e contains the Web test context.
//---------------------------------------------------------------------
public override void Extract(object sender, ExtractionEventArgs e)
{
if (e.Response.HtmlDocument != null)
{
foreach (HtmlTag tag in e.Response.HtmlDocument.GetFilteredHtmlTags(new string[] { "input" }))
{
if (String.Equals(tag.GetAttributeValueAsString("name"), Name, StringComparison.InvariantCultureIgnoreCase))
{
string formFieldValue = tag.GetAttributeValueAsString("value");
if (formFieldValue == null)
{
formFieldValue = String.Empty;
}
// add the extracted value to the Web test context
e.WebTest.Context.Add(this.ContextParameterName, formFieldValue);
e.Success = true;
return;
}
}
}
// If the extraction fails, set the error text that the user sees
e.Success = false;
e.Message = String.Format(CultureInfo.CurrentCulture, "Not Found: {0}", Name);
}
}
}
Imports System
Imports System.Collections.Generic
Imports Microsoft.VisualStudio.TestTools.WebTesting
Imports System.Globalization
Namespace ClassLibrary2
'-------------------------------------------------------------------------
' This class creates a custom extraction rule named "Custom Extract Input"
' The user of the rule specifies the name of an input field, and the
' rule attempts to extract the value of that input field.
'-------------------------------------------------------------------------
Public Class CustomExtractInput
Inherits ExtractionRule
' Specify a name for use in the user interface.
' The user sees this name in the Add Extraction dialog box.
'---------------------------------------------------------------------
Public Overrides ReadOnly Property RuleName() As String
Get
Return "Custom Extract Input"
End Get
End Property
' Specify a description for use in the user interface.
' The user sees this description in the Add Extraction dialog box.
'---------------------------------------------------------------------
Public Overrides ReadOnly Property RuleDescription() As String
Get
Return "Extracts the value from a specified input field"
End Get
End Property
' The name of the desired input field
Private NameValue As String
Public Property Name() As String
Get
Return NameValue
End Get
Set(ByVal value As String)
NameValue = value
End Set
End Property
' The Extract method. The parameter e contains the Web test context.
'---------------------------------------------------------------------
Public Overrides Sub Extract(ByVal sender As Object, ByVal e As ExtractionEventArgs)
If Not e.Response.HtmlDocument Is Nothing Then
For Each tag As HtmlTag In e.Response.HtmlDocument.GetFilteredHtmlTags(New String() {"input"})
If String.Equals(tag.GetAttributeValueAsString("name"), Name, StringComparison.InvariantCultureIgnoreCase) Then
Dim formFieldValue As String = tag.GetAttributeValueAsString("value")
If formFieldValue Is Nothing Then
formFieldValue = String.Empty
End If
' add the extracted value to the Web test context
e.WebTest.Context.Add(Me.ContextParameterName, formFieldValue)
e.Success = True
Return
End If
Next
End If
' If the extraction fails, set the error text that the user sees
e.Success = False
e.Message = String.Format(CultureInfo.CurrentCulture, "Not Found: {0}", Name)
End Sub
End Class
end namespace
Extract 方法包含擷取規則的核心功能。之前範例中的 Extract 方法可接受 ExtractionEventArgs (其提供此擷取規則涵蓋的要求所產生之回應)。回應中含有 HtmlDocument,後者又含有回應中的所有標籤。輸出標籤會從 HtmlDocument 中篩選掉。每個輸入標籤都會受到檢查,看其中是否有名為 name 的屬性 (Attribute),其值與使用者提供的 Name 屬性 (Property) 值相同。如果找到屬性相符的標籤,就會試著擷取 value 屬性 (如果存在) 所含的值。如果這個屬性存在,標籤的名稱和值就會被擷取,然後加入到 Web 測試內容中。此擷取規則通過。