【发布时间】:2016-03-02 00:18:02
【问题描述】:
我正在尝试构建一个模拟器,在 Web 应用程序上模拟数百个用户。
我通常使用 Microsoft Load Simulator 和 WebTests。 如果网页有些复杂,我会使用 WebTest 插件来正确调整它。
现在,我有一个网页,我访问的每个 url 都会执行大量的 ajax 请求,ajax 请求是基于在浏览器中完成的复杂计算。 如果我只是浏览到 url 并记录所有流量,即使我做了一些动态参数,我仍然无法正确模拟它,因为可能会根据之前的服务器发送不同的请求回复。
如果我要构建一个能够正确模拟它的 webtest,它将需要大量 webtest 插件,并且由于站点可能每隔几周就会更改一次,因此无法维护。
我考虑过使用 selenium,但如果我要使用它,我将需要太多的硬件资源来运行数百个用户。
我想出了使用无头浏览器的想法,例如 PhantomJs、SimpleBrowser、HtmlUnit 等。 SimpleBrowser 和 HtmlUnit 都不支持执行 javascript/AJAX,这对我来说毫无用处。
我尝试使用 PhantomJs,但我在并行运行多个用户时遇到了问题,因为 localStorage 对所有人都是相同的,因此它为所有人保持相同的会话,因此我无法并行模拟不同的用户。
有人对复杂的 ajax Web 应用程序进行负载测试有经验吗?
如果你能帮我解决这个问题,我会永远爱你。
附言 我通常使用 C# 进行编码,但我对新的语言\技术持开放态度。
【问题讨论】:
-
(1) HtmlUnit 确实支持 JavaScript,但不是全部。 (2) PhantomJS 每个进程有一个缓存。你是说你在一个 PhantomJS 实例中为多个用户运行模拟吗? (不过,我没有任何负载测试经验。)
-
是的,我知道它确实支持 JS,这就是为什么添加“/AJAX”,因为它不支持 ajax,这更重要.. 关于 PhantomJS,即使我退出进程,它也是蔡斯还是得救了。我使用 selenium 使用 ChromeDriver 自动化我的网站,它工作得很好 - 也可以并行运行多个用户,但是当我切换到 PhantomJs 时,它的缓存似乎仍然被保存(它让我一直登录到该网站......等等。 )
-
这很奇怪。只有 localStorage 在多个 PhantomJS 进程之间持久化,但缓存通常是单个进程私有的。如果 PhantomJS 使用
--disk-cache=true命令行选项运行,这将会改变。 -
你是对的。经过检查我发现sessionId保存在localStorage中。有没有办法运行多个 PhantomJs,每个都有单独的 localStorage
-
不,没有,AFAIK。
标签: ajax selenium phantomjs load-testing headless-browser