C# Regex:从 Web 性能和负载测试项目中的 HTTP 响应中获取随机 URL
Posted
技术标签:
【中文标题】C# Regex:从 Web 性能和负载测试项目中的 HTTP 响应中获取随机 URL【英文标题】:C# Regex: Get random URL from HTTP response in Web Perfomance and Load Test Project 【发布时间】:2016-12-07 12:58:08 【问题描述】:你能帮我解决这个问题吗?
我有网络请求
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,并在下一步中随机使用它们。 据我了解,我应该使用
string response = LastResponse.BodyString;
比正则表达式,创建一个ArrayList
类并采用随机网址。
有人可以帮我吗?
【问题讨论】:
【参考方案1】:我主要使用了两种方法。首先使用正则表达式并获取所有匹配项。
创建一个匹配所有想要的 URL 但不匹配不需要的 URL 的正则表达式。
我测试的一个网站有许多 URL,其中 href=
前面有一个 class=
有几个数字级别。我只想要级别 2 和 3,导致下面代码中的表达式。
当您确信 html 在测试开发和测试执行的整个持续时间内将采用固定格式时,此方法将起作用。如果href=
s(或附近)的 HTML 可能会发生变化,那么您需要更复杂的正则表达式或其他方法。
我使用了GetARandomNumber
方法,因为.NET 随机数生成器不是线程安全的。例如,请参阅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");
然后您筛选节点集合以选择感兴趣的节点,然后随机选择一个。
【讨论】:
嗨@AdrianHHH,感谢您的帮助。我真的很感激。我会尝试弄清楚并在我的项目中使用它。【参考方案2】:结果:
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;
【讨论】:
正如我在回答中所说,Random
不是线程安全的。此外,调用new Random()
使用当前时间作为随机数的种子。在负载测试中,我们经常会得到几个以相同的“当前时间”值开始的测试用例,因此它们都会生成相同的随机数集。请对线程安全的随机数做一些研究。以上是关于C# Regex:从 Web 性能和负载测试项目中的 HTTP 响应中获取随机 URL的主要内容,如果未能解决你的问题,请参考以下文章
在 Visual Studio 中录制 Web 负载测试项目