我看到一些使用 Selenium WebDriver 运行并行嵌套循环 Web 压力测试的死实例怪异现象,简单的例子是,比如说,点击 300 个独特的页面,每个页面有 100 次展示。
我“成功”获得 4 - 8 个 WebDriver 实例ThreadLocal<FirefoxWebDriver>
每个任务线程隔离它们,并在 ParallelOptions 实例上使用 MaxDegreeOfParallelism 来限制线程。我仅对外部循环(页面集合)进行分区和并行化,并检查.IsValueCreated
on the ThreadLocal<>
容器内部每个分区的“长时间运行任务”方法的开始。为了便于稍后清理,我将每个新实例添加到以线程 id 为键控的 ConcurrentDictionary 中。
无论我使用什么并行化或分区策略,WebDriver 实例偶尔都会执行以下操作之一:
- 启动但从不显示 URL 或运行展示
- 启动,运行任意数量的展示次数,然后在某个时刻闲置
当其中任何一种发生时,并行循环最终似乎注意到一个线程没有做任何事情,并且它生成了一个新的分区。如果n是允许的线程数,这会导致n生产线程只有大约 50-60% 的时间。
最后清理工作仍然很好;可能有 2n 个或更多打开的浏览器,但高效和低效的浏览器都会被清理。
有没有办法监视这些无用的 WebDriver 实例,并且 a) 立即清除它们,再加上 b) 让并行循环立即替换任务段,而不是像现在那样滞后几分钟?
我也有类似的问题。事实证明,WebDriver 没有查找开放端口的最佳方法。如上所述here https://groups.google.com/forum/?fromgroups#!topic/selenium-developers/nYFkIgXQcbw它会在端口上获得系统范围的锁定,找到开放的端口,然后启动实例。这可能会导致您尝试启动的其他实例缺乏端口。
我通过直接在委托中指定随机端口号来解决这个问题ThreadLocal<IWebDriver>
像这样:
var ports = new List<int>();
var rand = new Random((int)DateTime.Now.Ticks & 0x0000FFFF);
var driver = new ThreadLocal<IWebDriver>(() =>
{
var profile = new FirefoxProfile();
var port = rand.Next(50) + 7050;
while(ports.Contains(port) && ports.Count != 50) port = rand.Next(50) + 7050;
profile.Port = port;
ports.Add(port);
return new FirefoxDriver(profile);
});
这对我来说效果相当一致,尽管如果您最终使用了列表中未解决的所有 50 个,则会出现问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)