【发布时间】:2012-05-06 19:29:52
【问题描述】:
我发现使用 Selenium WebDriver 运行并行嵌套循环 Web 压力测试时出现了一些死实例怪异现象,简单的例子是,例如,点击 300 个独特页面,每个页面有 100 次展示。
我“成功地”让 4 - 8 个 WebDriver 实例使用 ThreadLocal<FirefoxWebDriver> 将它们隔离在每个任务线程上,并在 ParallelOptions 实例上使用 MaxDegreeOfParallelism 来限制线程。我只对外部循环(页面集合)进行分区和并行化,并在每个分区的“长时间运行任务”方法的开头内的ThreadLocal<> 容器上检查.IsValueCreated。为了便于稍后进行清理,我将每个新实例添加到以线程 ID 为键的 ConcurrentDictionary 中。
无论我使用何种并行化或分区策略,WebDriver 实例偶尔都会执行以下操作之一:
- 启动但从不显示 URL 或进行展示
- 启动,运行任意数量的展示次数,然后在某个时候闲置
当其中任何一种发生时,并行循环最终似乎注意到一个线程没有做任何事情,它产生了一个新的分区。如果 n 是允许的线程数,这将导致 n 个生产线程只有大约 50-60% 的时间。
清理最后仍然可以正常工作;可能有 2n 个或更多打开的浏览器,但有效率的和无效率的都会被清理干净。
有没有办法监控这些无用的 WebDriver 实例,并且 a) 立即清除它们,以及 b) 让并行循环立即替换任务段,而不是像现在经常那样滞后几分钟?
【问题讨论】:
-
这看起来你的一些线程被阻塞了。您是否尝试过调试以查看它们在哪里被阻止?
-
在实例化
IWebDriver时,Selenium 控制服务器的异步初始化过程似乎有点慢。问题是,在对new FirefoxDriver()的调用停止阻塞之后,工作仍在继续。如果您尝试太快地创建其他实例,它们中的大多数将无法连接。由于没有OnReady事件和IsReady属性,我在创建每个实例后通过休眠线程几秒钟来解决它。这样做似乎给了我 100% 持久、正常运行的 WebDriver 实例。 -
只是好奇,您是针对 Selenium Grid 2 执行的吗?
-
不,我使用的是普通的 ol' webDriver 类。也准备拿 NHtmlUnit 来试驾。
标签: c# webdriver task-parallel-library thread-local