Phantomjs 在流浪者外通过测试,在流浪者内失败
我在Mac电脑上运行CasperJS脚本,在一个流浪者盒子里测试在“流浪者”之外成功,但在“流浪者”内部却不成功。为什么? 作为参考,我把测试结果放在这篇文章的底部 版本(与《流浪汉》相同)Phantomjs 在流浪者外通过测试,在流浪者内失败,phantomjs,vagrant,casperjs,Phantomjs,Vagrant,Casperjs,我在Mac电脑上运行CasperJS脚本,在一个流浪者盒子里测试在“流浪者”之外成功,但在“流浪者”内部却不成功。为什么? 作为参考,我把测试结果放在这篇文章的底部 版本(与《流浪汉》相同) 卡斯珀:1.1.0-beta3 幻影:1.9.7 OSX:10.9.4 流浪汉:1.3.5 如果需要调试更多内容,请告诉我,我将添加:-) 测试命令 这就是我在控制台中用来运行测试的内容 casperjs test price_filter.js 测试脚本 这应该也适用于您,因为ww3.smatch.
- 卡斯珀:1.1.0-beta3
- 幻影:1.9.7
- OSX:10.9.4
- 流浪汉:1.3.5
casperjs test price_filter.js
测试脚本
这应该也适用于您,因为ww3.smatch.com
是可公开访问的。基本上,脚本转到“Lady Accessoires”部分,在DOM中查找产品并获取其价格。然后检查至少一种产品的价格是否较高,应用价格过滤器后检查是否不再有高价产品
var x = require('casper').selectXPath;
casper.test.begin(
'max price filter',
function suite(test) {
casper.start('http://www3.smatch.com/');
casper.then(function() {
this.mouseEvent('mouseover', '.header a[title="Damenmode"]');
});
casper.thenClick(x('//*[text()="Accessoires"]'));
casper.then(function() {
var elements = this.evaluate(function() {
var elements = __utils__.findAll('.category-content .products[data-result] .price');
return elements.map(function(el) {
return el.textContent.trim();
});
});
var haveExpensive = false;
for (var i = 0; i < elements.length; i++)
{
if (elements[i].match(/^[0-9]{2,},[0-9][0-9]/))
{
haveExpensive = true;
}
else if (!elements[i].match(/^[0-9]+,[0-9][0-9]/))
{
throw new Error('invalid price');
}
}
if (!haveExpensive)
throw new Error('no expensive products');
test.assert(elements.length > 0, 'Before filter, we have expensive products');
});
casper.then(function() {
this.fillSelectors('#price-filter-form', {
'input[name="max"]': '7'
});
});
casper.thenClick('#price-filter-submit');
casper.then(function() {
var elements = this.evaluate(function() {
var elements = __utils__.findAll('.category-content .products[data-result] .price');
return elements.map(function(el) {
return el.textContent.trim();
});
});
for (var i = 0; i < elements.length; i++)
{
if ( ! elements[i].match(/^[0-7],[0-9][0-9]/))
throw new Error(elements[i]);
}
test.assert(elements.length > 0, 'After filter, we have cheap products');
});
casper.run(function () {
test.done();
});
}
);
内部流浪者
Test file: price_filter.js
# max price filter
PASS Before filter, we have expensive products
PASS After filter, we have cheap products
PASS 2 tests executed in 1.202s, 2 passed, 0 failed, 0 dubious, 0 skipped.
Test file: critical/price_filter.js
# max price filter
PASS Before filter, we have expensive products
FAIL Error: 89,90
* €
# type: uncaughtError
# file: critical/price_filter.js:62
# error: 89,90
* €
# Error: 89,90
#
# * €
# at critical/price_filter.js:62
# at runStep (/usr/lib/node_modules/casperjs/modules/casper.js:1553)
# at checkStep (/usr/lib/node_modules/casperjs/modules/casper.js:399)
# stack: not provided
FAIL 2 tests executed in 21.873s, 1 passed, 1 failed, 0 dubious, 0 skipped.
Details for the 1 failed test:
In critical/price_filter.js:62
max price filter
uncaughtError: Error: 89,90
* €
这真的很奇怪,但似乎可以通过在单击后添加一个空步骤来解决:
casper.thenClick('#price-filter-submit');
casper.then(function(){});
或
我无法解释为什么会这样。可能是casperjs的错误。这可能是事件委派系统理解点击处理的时间吗?表格是这样提交的。无论如何,谢谢:)可能是表单提交在某种程度上被触发,而不是完全同步的,这样casper就看不到
page.navigation.requested
事件,因此它只是继续执行,而不等待加载新页面。空步骤可能会捕捉到这种轻微的异步行为。
casper.thenClick('#price-filter-submit');
casper.wait(1); // 1 msec