我正在尝试使用casperJS自动执行某些任务,我需要打开多个弹出窗口。但是,所有弹出窗口都具有完全相同的URL(http://.../printit.aspx/..。),因此无论何时使用
this.withPopup(/printit/, function() {...});
它总是打开第一个弹出窗口。我无法访问其他的。
我想有两种可能性:
casper.popups
,但文档对此非常模糊。答案 0 :(得分:1)
没有简单明了的方法可以消除两个弹出窗口的歧义。文档说casper.popups
是一个类似数组的属性。所以你可以迭代它。判断by the code,popups
属性本身是pagestack
。可以轻松修改pagestack.findByRegExp()
函数来执行此类操作。
似乎casper.popups
属性包含重复的条目,因此可以将它们过滤掉。
casper.findAllPopupsByRegExp = function(regexp){
var popups = this.popups.filter(function(popupPage) {
return regexp.test(popupPage.url);
});
if (!popups) {
throw new CasperError(f("Couldn't find popup with url matching pattern %s", regexp));
}
// remove duplicates
var uniquePopups = [];
popups.forEach(function(p){
if (uniquePopups.indexOf(p) === -1) {
uniquePopups.push(p);
}
});
return uniquePopups;
}
casper.withPopup()
接受三种类型的输入来识别弹出页面。第三个是页面对象本身。因此,您可以使用findAllPopupsByRegExp()
检索匹配的弹出页面对象,选择您想要的对象并将其传递给withPopup()
以更改其上下文:
casper.then(function(){
var popups = this.findAllPopupsByRegExp(/printit/);
this.withPopup(popups[1], function(){
...
});
});
答案 1 :(得分:0)
就我而言,我有一个链接列表。每个链接都会调用一些javascript,这些javascript会打开一个新标签(= casperjs中的popup),并始终使用相同的网址(...\View.aspx
)。
在标签内,我必须单击一个按钮来更改标签(...\List.aspx
)中的网址。
on("popup.loaded"...)
被调用两次,推入casper.popups
数组中的每个新页面。它们通常是交替出现的,但由于某些原因(我想是异步的),并非总是如此:有时casper.popups[/*LAST*/].url
匹配/View\.aspx/
,有时匹配/List\.aspx/
。
我总是不得不使用casper.withPopup( /*LAST VIEW.ASPX LOADED*/, ...)
;那并不总是最后加载的弹出窗口,也不总是匹配的/View.aspx/
(它可能是旧版本之一),所以我不得不找到最新加载的匹配/View\.aspx/
。
这是我的解决方案:
var is_view_loaded=false;
casper.on('popup.loaded', function(page) {
if(page.url.match(/View\.aspx/)) {
is_view_loaded=true;
}
}
// return last popup which url matches the required regexp
casper.getLastRegExPopup=function(regex) {
var l=casper.popups.length;
var i=l-1;
while(!regex.test(casper.popups[i].url)) {
i--;
if(i<0) return null;
}
return casper.popups[i];
}
然后进入我的核心步骤:
.
.
// clicked the link, must wait for popup (but which?!)
casper.waitFor(
function test() {
return is_view_loaded;
},
function then() {
var popup=casper.getLastRegExPopup(/View\.aspx/);
casper.withPopup(popup, function() {
// do things with "this"
});
is_view_loaded=false;
}
//, timeout
);
.
.