我目前在我的生产代码中使用HtmlUnit和Selenium来驱动它(Webdriver)。
我通过这些库以编程方式进行网站抓取和交互,并取得了一定的成功并且没有经历过内存问题(确保会话始终被清理)。
我想知道这些库是否适用于生产环境或不推荐使用。由于关于自动化测试的大量信息,这很难通过Google找到针对我的使用方式的答案。
我意识到这是一个相当通用的问题,但我正在寻求有关这些库和潜在更好替代方案的建议。
WebDriver和Selenium非常适合生产环境。 我们在多台机器/多数据中心分布式网格上广泛使用它们已经2年了,没有遇到无法应对的性能或稳定性问题。
我们首选的驱动程序是Firefox驱动程序(比HTMLUnit更重,更难配置),我们不得不调整网格以了解可以运行多少实例。 对于稳定性,我们的最大值是每个核心1个实例
我们的selenium/webdriver实例已经连续两年24/7运行(1年使用selenium 1,另一年逐步迁移到selenium 2 / WebDriver),并配合适当的监控(您应该监控内存使用情况/CPU使用情况)和一堆负载测试,我们达到了良好的水平,几个月内没有重新启动过进程
我们也广泛使用了HTMLUnit,并对此库同样满意
本文的要点是:是的,这些库已准备好用于生产。 但是,就像所有生产软件一样,您必须基准测试它们的使用,以找到最佳稳定性的适当配置。 我建议您在生产中使用Selenium Grid,这是并行处理的一个很好的方式
我在生产中使用HtmlUnit进行类似的操作,但是遇到了很多问题,主要是性能方面的问题。目前,我切换到HtmlUnit 2.10的快照版本,其中实现了一些对我来说很重要的性能改进(例如,在DomNode.addDomChangeListener()
上将ArrayList.contains()
替换为HashSet.contains()
)。
尽管如此,在JavaScript密集页面上CPU负载仍然相当高。通常,在双核Linux机器上不能同时运行超过10个这样的页面。我相信HtmlUnit只使用Rhino(JavaScript引擎)的解释器模式,这非常慢。此外,您需要小心地释放HtmlUnit使用的所有资源,以避免内存泄漏。
总的来说,HtmlUnit显然是设计用于运行相对短暂的测试用例,而不是长时间运行的服务器应用程序。可以通过调整使其足够可管理,但肯定可以更好。
我发现另一种有希望的方法是phantom-js,它是WebKit浏览器的无头版本,是一个本地应用程序,运行JavaScript速度更快。