我正在尝试使用casperJS自动化一些任务,并且需要打开多个弹出窗口。但是,所有弹出窗口都具有完全相同的url(http://.../printit.aspx/..。),因此无论何时我使用
this.withPopup(/printit/, function() {...});
它总是打开第一个弹出窗口。我无法访问其他人。
我想有两种可能:
casper.popups
,但是文档对此非常含糊。没有消除两个弹出窗口的歧义的简便方法。文档说casper.popups
是类似数组的属性。因此,您可以对其进行迭代。判断by the code,popups
属性本身就是pagestack
。可以轻松地修改pagestack
函数来执行这种操作。
似乎pagestack.findByRegExp()
属性包含重复的条目,因此可以将其过滤掉。
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()
就我而言,我有一个链接列表。每个链接都会调用一些javascript,这些javascript会始终使用相同的网址(withPopup()
)打开一个新标签(casperjs中的popup)。在选项卡内部,我必须单击一个可更改选项卡(casper.then(function(){
var popups = this.findAllPopupsByRegExp(/printit/);
this.withPopup(popups[1], function(){
...
});
});
)中的url的按钮。...\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/