- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我想用 PhantomJS 检查我的脚本是否在点击时正确打开一个新窗口/标签。打开由js事件监听器触发,通过window.open(url, "_blank")
打开。
如何使用 PhantomJS 监听新窗口?
最佳答案
似乎有三种方法可以做到这一点:
CasperJS 通过使用 page.onPageCreated
解决了这个问题.因此,当在页面中调用 window.open
时,将创建一个新页面,并使用新创建的页面触发 page.onPageCreated
。
page.open(address, function (status) {
if (status !== 'success') {
console.log('Unable to load the address!');
phantom.exit();
} else {
page.onPageCreated = function(newPage){
newPage.onLoadFinished = function(){
console.log(newPage.url);
phantom.exit();
};
};
page.evaluate(function(url){
window.open(url+"?something=other", "_blank");
}, address);
}
})
PhantomJS 的页面
有一个pages
处理子页面的属性。因此,当您打开
一个新页面/选项卡时,会为该页面创建一个新的webpage
对象。您需要尝试在页面触发之前向页面添加一个 onLoadFinished
事件监听器(无 promise )。这可能很难,并且当 window.open
被页面上下文以未知延迟调用时。
这可以通过使用 waitFor
之类的东西来解决。等待新页面出现并在加载页面之前附加事件处理程序。这是经过小调整的完整代码。重试间隔从 250 毫秒减少到 50 毫秒。
var page = require('webpage').create();
var address = "http://example.com/";
function waitFor(testFx, onReady, timeOutMillis) {
var maxtimeOutMillis = timeOutMillis ? timeOutMillis : 3000, //< Default Max Timout is 3s
start = new Date().getTime(),
condition = false,
interval = setInterval(function() {
if ( (new Date().getTime() - start < maxtimeOutMillis) && !condition ) {
// If not time-out yet and condition not yet fulfilled
condition = (typeof(testFx) === "string" ? eval(testFx) : testFx()); //< defensive code
} else {
if(!condition) {
// If condition still not fulfilled (timeout but condition is 'false')
console.log("'waitFor()' timeout");
phantom.exit(1);
} else {
// Condition fulfilled (timeout and/or condition is 'true')
console.log("'waitFor()' finished in " + (new Date().getTime() - start) + "ms.");
typeof(onReady) === "string" ? eval(onReady) : onReady(); //< Do what it's supposed to do once the condition is fulfilled
clearInterval(interval); //< Stop this interval
}
}
}, 50); //< repeat check every 50ms
};
page.open(address, function (status) {
if (status !== 'success') {
console.log('Unable to load the address!');
phantom.exit();
} else {
console.log("p:", page.ownsPages, typeof page.pages, page.pages.length, page.pages);
waitFor(function test(){
return page.pages && page.pages[0];
}, function ready(){
page.pages[0].onLoadFinished = function(){
console.log("p:", page.ownsPages, typeof page.pages, page.pages.length, page.pages);
console.log("inner:", page.pages[0].url);
phantom.exit();
};
});
page.evaluate(function(url){
window.open(url+"?something=other", "_blank");
}, address);
}
})
可以代理 window.open
函数,在页面上下文中打开页面后,可以在通过 window.callPhantom
发出信号的幻象上下文中注册事件处理程序并陷入onCallback
.
page.onInitialized = function(){
page.evaluate(function(){
var _oldOpen = window.open;
window.open = function(url, type){
_oldOpen.call(window, url, type);
window.callPhantom({type: "open"});
};
});
};
page.onCallback = function(data){
// a little delay might be necessary
if (data.type === "open" && page.pages.length > 0) {
var newPage = page.pages[page.pages.length-1];
newPage.onLoadFinished = function(){
console.log(newPage.url);
phantom.exit();
};
}
};
page.open(address, function (status) {
if (status !== 'success') {
console.log('Unable to load the address!');
phantom.exit();
} else {
page.evaluate(function(url){
window.open(url+"?something=other", "_blank");
}, address);
}
})
关于javascript - 如何在 PhantomJS 中捕获 window.open(url, _blank) 打开的新窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27980178/
target="_blank" 和 target=_blank 有区别吗? 似乎具有相同的行为,但只是想确定一个是否比另一个更好(以及为什么)。我一直使用引号,但在阅读 Rails 教程时发现 Mic
外部网站的链接是否应该设置 target=_blank?例如。我在 www.acme.net 上并且有一个指向 www.otherplace.net 的链接,该链接应该是: otherplace's
当我使用 target="_blank" 的常规链接时,我会打开一个新选项卡,但是当我使用 JS window.open(url, "_blank"); 我得到一个新窗口(我从 Response.Wr
在插入某些带有滚动条的 jQuery DIV 滚动条后,我花了 2 天的时间修复了故障 href="" 链接。 我在这些 DIV 中有 href="" 链接,单击它们但浏览器没有执行任何操作,无论它们
Drupal 中是否有任何模块可以为所有外部站点设置 target="_blank" 最佳答案 我认为这里有一个用 javascript 实现的模块:http://drupal.org/project
这个问题已经有答案了: How can I open a link in a new window? (10 个回答) 已关闭10 年前。 我已经根据其他 StackOverflow 问题/答案设置了
如何替换所有出现的 所以在这里我想将 target="_bank"添加到所有具有 ' http://localhost:4000/disease/description/ 的 anchor 标记。
我已经通过js添加了一个图像,但似乎不知道如何向该图像添加链接以及target="_blank"...这是我正在使用的代码: $(function() { $('body').delegate('
在你们的帮助下,我现在有了一个可以像魅力一样工作的脚本。我现在唯一需要的是在新选项卡/窗口中打开 URL 的脚本。 $(document).ready(function() { $("#ons
我使用链接标签将我的页面重定向到新选项卡中的另一个页面,但 target="_blank"不起作用! { e.preventDefault();
我在我的 asp 页面上添加了一个按钮,我正在服务器端执行一些过程,然后将链接重定向到另一个页面。 我在页面中所做的是在 asp:Button 上调用一个方法OnClientClick我分配 aspn
我正在尝试以全屏方式打开新页面。下面的尺寸是我的屏幕分辨率。我仍然必须单击浏览器上的可调整大小的按钮才能将其扩展到全屏。 如何在不单击重新调整大小的情况下打开它以填充屏幕? Helper.Redire
这个问题在这里已经有了答案: JavaScript: location.href to open in new window/tab? (7 个答案) How to add/update an at
我正在研究 jQuery,遇到了一个我似乎无法解决的问题。我知道使用 jQuery 是可能的,但找不到合适的示例来处理。我有一个页面,其中包含几个添加了属性/值 target="_blank" 的常规
页面有带超链接的图像,超链接有 target="_blank",每次我按该图像加载新的 firefox 并且该超链接被重定向到新的 firefox 网站 我失去了对该网页的所有控制权。可以删除或更改超
有些情况下我必须在新窗口/选项卡中打开链接。有没有一种对严格的 HTML 有效的方法?使用 jQuery 这样做是可以接受的,但我不想只是将 target="_blank" 偷偷带回 jQuery,这
target="_blank" 的最佳替代方案是什么? 这是我们使用的文档类型和 html 声明: 最佳答案 它只是按照 XHTML Transitional 有效。您可以继续使用它们。它仅根据
什么时候适合在超链接上使用 target="_blank" 属性? 编辑: 澄清一下,我知道语法会打开一个新的浏览器窗口。我想问的是什么时候这样做合适? 最佳答案 每当您想惹恼用户时。 更严重的是,因
我正在 Android Studio 中构建一个在 WebView 中显示页面的应用程序,但我似乎无法让 WebView 在同一个 WebView 中打开带有 target='_blank' 的页面。
It's valid in XHTML 1.1和WCAG 2.0准则没有有关其用法的任何信息? 我知道在严格的XHTML 1.0中这是无效的,但是如果很多人都在使用其他功能,例如JavaScript,
我是一名优秀的程序员,十分优秀!