我需要监控我的网站渲染时间以执行常见任务(登录,搜索等)。我需要一些可以模仿用户对I.E.操作的自动化内容。并能够计算页面渲染的时间长度 示例自动执行:
1)打开无头IE浏览器
3)输入“stackoverflow”
4)按提交按钮
5)启动计时器
6)等待结果页面完全 渲染
7)停止计时器
8)关闭IE
9)记录结果
我需要在服务器上作为计划任务运行,而无需用户登录。
我一直在寻找帮助我这样做的东西。任何人都有这方面的经验或知道任何可以实现这一目标的事情吗?
答案 0 :(得分:11)
这取决于您关注的内容,功能或性能。
监控功能时,您的目标是自动确保Web应用程序仍能正常运行。通常,这是持续集成过程的一部分 - 而不是生产监控的一部分。使用HtmlUnit,Selenium或WebDriver可以很好地完成它。不再推荐使用 HttpUnit (API更低级别,JavaScript不太受支持,广泛采用,错误修复和增强功能更少)。
HtmlUnit 模拟浏览器。因此,您永远无法确定您的应用程序在真实浏览器中的行为完全相同。这对于复杂的Ajax应用程序尤为重要。这与FireFox和Internet Explorer之间的所有小不兼容性相当。优点:无头,易于理解。缺点:未检测到不兼容的风险。
Selenium 远程控制真正的浏览器。在我们的设置中,我们无法无头地使用它,尤其是在Internet Explorer中。但如果你将它嵌入虚拟机中,它会无头地运行。如果您的应用程序可通过公共互联网访问,您甚至可以使用Selenium Grid和Amazon Elastic Cloud EC2中的预配置虚拟机。 Selenium的优点:真实世界兼容性,易于编写脚本。缺点:仅在虚拟机中无头,性能开销,更复杂的运行时设置,仅在云中对并发用户进行压力模拟。
最高版本1.5,Selenium使用名为Selenium Core的JavaScript部件来控制浏览器。如果您的应用程序对JavaScript有安全限制,则Selenium可能无法正常运行。
WebDriver 为每个浏览器使用特定的界面,例如适用于FireFox的扩展和Internet Explorer自动化控件。另外,它使用操作系统,例如,用于模拟击键。这比Selenium Core更强大,更强大,更可靠。从Selenium 2.0版开始,WebDriver被集成到Selenium中。但是Selenium 2.0仍处于测试阶段。
您提到使用计时器进行测量并提及渲染时间。监视Web应用程序的性能时,如果由于响应时间过长而无法再使用应用程序,则需要收到警报。
在这种情况下,您通常不会对精确结果感兴趣(以毫秒为单位)。您仍然可以使用上面提到的工具之一。例如,使用Selenium Core的浏览器比实际浏览器慢 - 但这与连续监控无关。
如果您绝对需要精确测量,则以上都不适用。您应该区分客户端持续时间和网络加服务器端持续时间。
渲染HTML和执行JavaScript需要客户端持续时间。它不依赖于并发用户的数量。您可以测量一次,例如使用 Firebug 。您无需永久监控它。
将请求传输到服务器,处理请求并生成响应并将响应传输到客户端需要网络加服务器端持续时间。它们根据网络使用情况和并发用户数而有所不同。您可以使用 JMeter 精确测量和监控它们。但是在复杂的Ajax功能的情况下,在JMeter中模拟正确的客户端请求是一项复杂的任务。 JMeter的优点:精确的测量,可能会给许多并发用户带来压力。缺点:对于Ajax有限,为构建请求付出了很多努力。
答案 1 :(得分:3)
另一个选项可能是Selenium Remote Control(或一般Selenium)。
答案 2 :(得分:1)
无头自动化的一个选择是使用HtmlUnit。有关详细信息,请查看此链接:Using HtmlUnit on .NET for Headless Browser Automation
答案 3 :(得分:0)
PhantomJS的以下无头IE端口目前处于测试阶段(v0.2):
<强> http://triflejs.org/ 强>
这是一个快速介绍:
API与PhantomJs相同,因此最终您将能够执行以下操作:
// 1. Create Page Object and navigate to Google
page = require("webpage").create();
page.open("http://www.google.com", function(status) {
if ( status === "success" ) {
// 2. Inject jQuery for DOM operations
page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() {
// 3. Start Timer
console.log('Start Timer: ' + (new Date()).getTime());
// 4. Type string and click search
page.evaluate(function() {
$(("input[type=text")[0]).val("stackoverflow");
$("button:contains('Google Search')).click();
});
// 5. Wait for loading and end timer.
page.onLoadFinished = function() {
console.log('Load Finished. End Timer:' + (new Date()).getTime());
phantom.exit();
};
});
}
});