如何在CasperJS中打开具有相同标题的不同弹出窗口?

时间:2015-04-09 20:02:46

标签: javascript popup casperjs

我正在尝试使用casperJS自动执行某些任务,我需要打开多个弹出窗口。但是,所有弹出窗口都具有完全相同的URL(http://.../printit.aspx/..。),因此无论何时使用

this.withPopup(/printit/, function() {...});

它总是打开第一个弹出窗口。我无法访问其他的。

我想有两种可能性:

  • 访问后关闭每个弹出窗口,但我找不到如何做到这一点
  • 使用除URL regex / printit /之外的其他方式访问弹出窗口。也许使用casper.popups,但文档对此非常模糊。

2 个答案:

答案 0 :(得分:1)

没有简单明了的方法可以消除两个弹出窗口的歧义。文档说casper.popups是一个类似数组的属性。所以你可以迭代它。判断by the codepopups属性本身是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
);
.
.