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

问题描述 投票:2回答:2

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

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

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

我想有两种可能:

  • 访问每个弹出窗口后将其关闭,但我找不到如何执行此操作
  • 使用URL正则表达式/ printit /以外的其他方式访问弹出窗口。也许使用casper.popups,但是文档对此非常含糊。
javascript popup casperjs
2个回答
1
投票

没有消除两个弹出窗口的歧义的简便方法。文档说casper.popups是类似数组的属性。因此,您可以对其进行迭代。判断by the codepopups属性本身就是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()

0
投票

就我而言,我有一个链接列表。每个链接都会调用一些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/
© www.soinside.com 2019 - 2024. All rights reserved.