Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/90.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Phantomjs 在流浪者外通过测试,在流浪者内失败_Phantomjs_Vagrant_Casperjs - Fatal编程技术网

Phantomjs 在流浪者外通过测试,在流浪者内失败

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.

我在Mac电脑上运行CasperJS脚本,在一个流浪者盒子里测试在“流浪者”之外成功,但在“流浪者”内部却不成功。为什么?

作为参考,我把测试结果放在这篇文章的底部

版本(与《流浪汉》相同)
  • 卡斯珀: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