一些 CasperJS 函数不一致
Some CasperJS functions not consistent
出于测试目的,我已经为 CasperJS 编写了一些模块。它们由重复使用的各种功能组成。我注意到相同的功能不适用于不同页面的相同功能。当我调查它时,我发现实际上原生的 CasperJS 函数才是造成问题的原因。
例如:
waitUntilVisible('.buy')
一直在为我工作,最近在编写新代码时它不再 return 正确。我试着用
替换它
waitFor(function(){
return this.exists('.buy');
}
仍然没有运气......之后我尝试使用这样的评估
waitFor(function(){
return this.evaluate(function(){
return $('.buy').length > 0;
})
}
通常断言为真。以及查看此代码段前后的屏幕截图,清楚地表明该元素在那里。
奇怪的是,这段检查购买按钮并点击它(如果有)的确切代码片段适用于其他相同的页面。
这是不起作用的功能之一
this.checkButton = function(){
casper.waitUntilVisible('.buy',function(){
this.test.pass('Button visible');
this.click('.buy');
},function(){
this.test.fail('Button not visible');
}).waitUntilVisible('div.header h2', function(){
this.test.pass('Button works');
},function(){
this.test.fail('Button does not work');
})
}
听 page.error 和 remote.message 什么也没说。
我当前的等待超时设置为 30 秒。
有谁知道会出什么问题吗?
谢谢
编辑:
所以看起来这个问题与模块有关。我从字面上将代码从模块中的各种功能复制到 1 个程序文件。它工作正常。程序代码如下:
.then(function(){
var records = casper.evaluate(function(){
return document.querySelectorAll('.content table tr').length;
});
if(records > 0) this.test.pass(records +' records shown');
else this.test.fail(records +' records shown');
})
.waitForSelector('#main .btn.small',function(){
this.test.pass('Load more button found')
}, function(){
this.test.fail('Load more button not found')
})
.then(function(){
if(this.exists('#main .btn.small')) this.test.pass('Button exists');
else this.test.fail('Button does not exist !?');
})
.thenClick('#main .btn.small')
.then(function(){
this.sendKeys('.listfilter-wrapper input','2487');
})
.wait(5000)
.then(function(){
var length = casper.evaluate(function(){
return $('.content table tr').length;
});
if(length < 40) this.test.assert(true,'Search works, number of results for "2487": '+length);
else this.test.assert(false, 'Search does not work');
})
这是在模块中编写的相同代码:
this.isLoaded = function(){
casper.then(function(){
var records = casper.evaluate(function(){
return document.querySelectorAll('.content table tr').length;
});
if(records > 0) this.test.pass(records +' records shown');
else this.test.fail(records +' records shown');
});
},
this.loadMore = function(){
casper.then(function(){
if(this.exists('#main .btn.small')) {
this.test.pass('Load more button exists');
casper.click('#main .btn.small');
casper.wait(500);
}
else this.test.fail('Load more button does not exist')
})
},
this.search = function(){
casper.then(function(){
this.sendKeys('.listfilter-wrapper input','2487');
}).wait(5000);
casper.then(function(){
var length = casper.evaluate(function(){
return $('.content table tr').length;
});
if(length < 40) this.test.assert(true,'Search works, number of results for "2487": '+length);
else this.test.assert(false, 'Search does not work');
});
}
这是调用steps的函数
module.exports = function(){
this.check = function(){
platform.navigateTo('Actions');
this.isLoaded();
this.loadMore();
this.search();
}
}
这是模块的调用
a = require('./modules/actions');
var actions = new a();
casper.test.begin('Testing',8,function suite(test){
casper.start();
actions.check();
casper.run(function(){
test.done();
});
})
经过更多调查,我认为这个问题与 css 选择器与第 nth-of-type 的一致性和调用 casper.reload() 的 phantomJS 问题有关。通过删除 reload() 函数,我消除了测试中的大部分失败,还有更多的选择器需要替换以测试它是否与此相关。
希望对您有所帮助。
出于测试目的,我已经为 CasperJS 编写了一些模块。它们由重复使用的各种功能组成。我注意到相同的功能不适用于不同页面的相同功能。当我调查它时,我发现实际上原生的 CasperJS 函数才是造成问题的原因。
例如:
waitUntilVisible('.buy')
一直在为我工作,最近在编写新代码时它不再 return 正确。我试着用
替换它waitFor(function(){
return this.exists('.buy');
}
仍然没有运气......之后我尝试使用这样的评估
waitFor(function(){
return this.evaluate(function(){
return $('.buy').length > 0;
})
}
通常断言为真。以及查看此代码段前后的屏幕截图,清楚地表明该元素在那里。
奇怪的是,这段检查购买按钮并点击它(如果有)的确切代码片段适用于其他相同的页面。
这是不起作用的功能之一
this.checkButton = function(){
casper.waitUntilVisible('.buy',function(){
this.test.pass('Button visible');
this.click('.buy');
},function(){
this.test.fail('Button not visible');
}).waitUntilVisible('div.header h2', function(){
this.test.pass('Button works');
},function(){
this.test.fail('Button does not work');
})
}
听 page.error 和 remote.message 什么也没说。
我当前的等待超时设置为 30 秒。
有谁知道会出什么问题吗?
谢谢
编辑: 所以看起来这个问题与模块有关。我从字面上将代码从模块中的各种功能复制到 1 个程序文件。它工作正常。程序代码如下:
.then(function(){
var records = casper.evaluate(function(){
return document.querySelectorAll('.content table tr').length;
});
if(records > 0) this.test.pass(records +' records shown');
else this.test.fail(records +' records shown');
})
.waitForSelector('#main .btn.small',function(){
this.test.pass('Load more button found')
}, function(){
this.test.fail('Load more button not found')
})
.then(function(){
if(this.exists('#main .btn.small')) this.test.pass('Button exists');
else this.test.fail('Button does not exist !?');
})
.thenClick('#main .btn.small')
.then(function(){
this.sendKeys('.listfilter-wrapper input','2487');
})
.wait(5000)
.then(function(){
var length = casper.evaluate(function(){
return $('.content table tr').length;
});
if(length < 40) this.test.assert(true,'Search works, number of results for "2487": '+length);
else this.test.assert(false, 'Search does not work');
})
这是在模块中编写的相同代码:
this.isLoaded = function(){
casper.then(function(){
var records = casper.evaluate(function(){
return document.querySelectorAll('.content table tr').length;
});
if(records > 0) this.test.pass(records +' records shown');
else this.test.fail(records +' records shown');
});
},
this.loadMore = function(){
casper.then(function(){
if(this.exists('#main .btn.small')) {
this.test.pass('Load more button exists');
casper.click('#main .btn.small');
casper.wait(500);
}
else this.test.fail('Load more button does not exist')
})
},
this.search = function(){
casper.then(function(){
this.sendKeys('.listfilter-wrapper input','2487');
}).wait(5000);
casper.then(function(){
var length = casper.evaluate(function(){
return $('.content table tr').length;
});
if(length < 40) this.test.assert(true,'Search works, number of results for "2487": '+length);
else this.test.assert(false, 'Search does not work');
});
}
这是调用steps的函数
module.exports = function(){
this.check = function(){
platform.navigateTo('Actions');
this.isLoaded();
this.loadMore();
this.search();
}
}
这是模块的调用
a = require('./modules/actions');
var actions = new a();
casper.test.begin('Testing',8,function suite(test){
casper.start();
actions.check();
casper.run(function(){
test.done();
});
})
经过更多调查,我认为这个问题与 css 选择器与第 nth-of-type 的一致性和调用 casper.reload() 的 phantomJS 问题有关。通过删除 reload() 函数,我消除了测试中的大部分失败,还有更多的选择器需要替换以测试它是否与此相关。
希望对您有所帮助。