2016-12-07 4 views
1

問題を解決するのに手伝ってもらえますか? C#Regex:Web Perfomanceと負荷テストプロジェクトのHTTP応答からランダムURLを取得

は私がWebRequestクラス

WebTestRequest request1 = new WebTestRequest("http://www.theverge.com/"); 
     request1.ParseDependentRequests = false; 
     yield return request1; 

と、それに応答があります

 <li><a href="https://www.facebook.com/verge" tabindex="2"> 
     <svg class="p-svg-icon"><use xlink:href="#icon-facebook"></use></svg> 
     </a></li> 

     <li><a href="https://twitter.com/verge" tabindex="3"> 
     <svg class="p-svg-icon"><use xlink:href="#icon-twitter"></use></svg> 
     </a></li> 

     <li><a href="/rss/index.xml" tabindex="4"> 
     <svg class="p-svg-icon"><use xlink:href="#icon-rss"></use></svg> 
     </a></li> 

が、私はこのページのすべてのURLを検索し、ランダムな次のステップでそれらを使用したいと思います。 私が理解したように、私はArrayListクラスを作成し、ランダムなURLを取るために、正規表現よりも、

string response = LastResponse.BodyString; 

を使用する必要があります。

誰かが私にそれを手伝ってもらえますか?

答えて

1

私が使用した主な方法は2つあります。まず、正規表現を使用してすべてのマッチを取得します。 必要なすべてのURLに一致するが、不要なURLには一致しない正規表現を作成します。 私がテストした1つのWebサイトには、href=の前に複数の数値レベルを持つclass=があるURLが多数ありました。私はレベル2と3だけを望んでいたので、下のコードの式につながりました。

このアプローチは、テストの開発とテストの実行の合計時間の間、HTMLが固定形式であると確信している場合に機能します。 href=のHTML(またはその近く)が変更される可能性が高い場合は、より複雑な正規表現または別の方法が必要です。

.NET乱数ジェネレータはスレッドセーフではないため、GetARandomNumberというメソッドを使用しました。たとえば、hereを参照してください。

public class GetAUrl : WebTestRequestPlugin 
{ 
    public string ContextParameter { get; set; } 

    public override void PostRequest(object sender, PostRequestEventArgs e) 
    { 
     string body = e.Response.BodyString; 

     // Looking for requests in a specific class. 

     string pattern = "\\bclass=\"nav__link-[23]\" +href=\"(/[^\"]*)\""; 
     // The URL is in this capture:      ^^^^^^^^^ 

     MatchCollection matches = Regex.Matches(body, pattern); 

     int randomIndex = GetARandomNumber(matches.Count); 
     // Above will get a value 0 <= randomIndex < matches.Count 

     e.WebTest.Context[ContextParameter] = matches[randomIndex].Groups[1].Value; 
    } 
} 

もう一つの方法は、この方法の本質は使用していますHtmlAgilityPack使用しています:

HtmlAgilityPack.HtmlNodeCollection nodes = input_doc.DocumentNode.SelectNodes("//a"); 

をして、あなたは興味のそれらを選択し、ランダムに1つを選択するノードのコレクションを選別。

+0

@AdrianHHHこんにちは、 は助けてくれてありがとう。本当に感謝しております。私は自分のプロジェクトでそれを理解して使用しようとします。 –

0

結果:

string response = LastResponse.BodyString; 
      string pattern = @"regexp"; 

      MatchCollection results = Regex.Matches(response, pattern); 
      Random rnd = new Random(); 
      string randomUrl = results[rnd.Next(results.Count)].Groups[1].Value; 
+0

私が私の答えで言ったように、 'ランダム'はスレッドセーフではありません。さらに、 'new Random()'を呼び出すと、乱数のシードとして現在の時刻が使用されます。負荷テストでは、同じ値の「現在時刻」から始まるいくつかのテストケースを取得することがあります。したがって、すべて同じ乱数セットを生成します。スレッドセーフな乱数に関する研究をしてください。 – AdrianHHH

関連する問題