Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.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
Javascript 在CasperJS中测试URL列表_Javascript_Casperjs - Fatal编程技术网

Javascript 在CasperJS中测试URL列表

Javascript 在CasperJS中测试URL列表,javascript,casperjs,Javascript,Casperjs,我试图避免进行20个左右的非常小的测试,每个测试基本上都测试一个白标签站点列表,并显示一些基本信息 我有一个网站列表(数组),它们的URL,预期的标题和网站的名称 我想迭代数组,转到每个URL并验证标题是否正确 像这样: var x = require('casper').selectXPath; var white_labels = [ { URL: "http://site1.com", Title: "Site 1 Title",

我试图避免进行20个左右的非常小的测试,每个测试基本上都测试一个白标签站点列表,并显示一些基本信息

我有一个网站列表(数组),它们的URL,预期的标题和网站的名称

我想迭代数组,转到每个URL并验证标题是否正确

像这样:

var x = require('casper').selectXPath;

var white_labels = [
    {
        URL: "http://site1.com",
        Title: "Site 1 Title",
        Name: "Site 1"
    },
    {
        URL: "http://site2.com",
        Title: "Site 2 Title",
        Name: "Site 2"
    }
]

casper.test.begin('White Labels Test Suite', white_labels.length, function suite(test) {
    var urls; 
    var i = -1;

    casper.start(white_labels[0]["URL"], function() {
        urls = white_labels; 
    });

    casper.then(function() {
        this.each(urls, function() {
            i++;  
            this.echo("I: " + i);
            this.thenOpen(urls[i].URL, function() {
                this.echo("URL: " + urls[i].URL);
                test.assertTitle(urls[i].Title, urls[i].Name + " title is correct");
            });
        });
    });

    casper.run(function() {
        test.done();
    });
});
当我运行这个时,每次我打印出“I”,它都是正确的…0,然后是1

但是,第一个测试失败,因为它返回的标题是站点2的标题,而不是站点1的标题。第二次测试成功


这一点我很困惑。

问题在于
I
的可变范围<代码>casper。每个本质上是一个同步for循环。它的内部是asynchronous
casper.thenOpen
语句,它只调度一个操作。它实际上是同步调用的,并将正确的url传递给它。执行
每个
循环后,casper步骤队列开始执行(通过
casper.run
触发),其中包括所有
然后*
调用

问题是
i
是全局的,这意味着当两个
casper.thenOpen
回调最终执行时,
i
对它们都是1

对于您的案例,有不同的解决方案:

  • 通过交换
    i++,将每次迭代的索引固定到该迭代对于
    var j=++i
    i
    内的所有其他
    casper。每个
    用于
    j
  • 使用以下事实:
    casper.each
    将迭代项注入迭代,并且根本不使用任何索引:
    this.each(url,函数(self,url){…})
  • 最简单的方法就是将
    这个。每个
    都改成
    这个。然后每个
    都是步进的,这样就不会出现
    i
    -问题

最后,有关更多信息,请参见和。

问题在于
i
的可变范围<代码>casper。每个
本质上是一个同步for循环。它的内部是asynchronous
casper.thenOpen
语句,它只调度一个操作。它实际上是同步调用的,并将正确的url传递给它。执行
每个
循环后,casper步骤队列开始执行(通过
casper.run
触发),其中包括所有
然后*
调用

问题是
i
是全局的,这意味着当两个
casper.thenOpen
回调最终执行时,
i
对它们都是1

对于您的案例,有不同的解决方案:

  • 通过交换
    i++,将每次迭代的索引固定到该迭代对于
    var j=++i
    i
    内的所有其他
    casper。每个
    用于
    j
  • 使用以下事实:
    casper.each
    将迭代项注入迭代,并且根本不使用任何索引:
    this.each(url,函数(self,url){…})
  • 最简单的方法就是将
    这个。每个
    都改成
    这个。然后每个
    都是步进的,这样就不会出现
    i
    -问题

最后,有关更多信息,请参阅和。

工作非常出色!最糟糕的是我不得不把你的回答读成“精通Javascript”!呃…真相有时会伤人。非常感谢。工作得很有魅力!最糟糕的是我不得不把你的回答读成“精通Javascript”!呃…真相有时会伤人。非常感谢。