gpt4 book ai didi

javascript - 按顺序打开 Angular 应用程序页面 - 第二个 page.open 回调不会被调用

转载 作者:数据小太阳 更新时间:2023-10-29 05:31:49 25 4
gpt4 key购买 nike

我正在尝试依次打开 2 个 Angular 应用程序页面,以使用 phantomjs 获取它们的屏幕截图。第 1 页需要在第 2 页之前打开,因为它为第 2 页准备了一些数据。我正在使用两个嵌套的 setTimeout() 函数,方法如下:

var page = require('webpage').create(),
t, url;

phantom.addCookie({
'name': 'token',
'value': '<authentication-token-goes-here>',
'domain': 'localhost'
});

t = Date.now();
url = "http://localhost:8000/#/page1";

page.onConsoleMessage = function(msg, lineNum, sourceId) {
console.log('CONSOLE: ' + msg + ' (from line #' + lineNum + ' in "' + sourceId + '")');
};

page.viewportSize = {
width: 1366,
height: 768
};

page.clipRect = {
top: 0,
left: 0,
width: 1366,
height: 768
};

page.open(url, function(status) {

setTimeout(function() {

console.log('page 1 status: ', status);
page.render("page1.png");

var url = "http://localhost:8000/#/page2";

page.open(url, function(status) {
console.log('page 2 status: ', status);
setTimeout(function() {
page.render("page2.png");
phantom.exit();
}, 5000);
});
}, 5000);
});

第一个控制台语句:console.log('page 1 status: ', status); 被打印出来,我成功获得了应用程序日志和第 1 页的屏幕截图,但第二个控制台日志(第 2 页) status) 不会被打印出来,因为内部 page.open() 的回调没有被调用。它还会挂起控制台本身,因为 phantom.exit() 由于未调用回调而未被调用。

但即使没有调用内部 page.open() 回调,我也可以看到第 2 页的应用程序日志(如 XHR 响应日志)成功打印!只是在第 2 页的最后一个应用程序日志之后没有任何事件。

我在其他网站上尝试了这段代码(依次打开 google 和 facebook),效果很好。但是相同的代码不适用于我的 Angular 应用程序。可能是什么原因?

最佳答案

好的,我可以复制这个问题,这里是 AngularJS 中使用路由的一些代码:

var routingExample = angular.module('Example.Routing', []);
routingExample.controller('HomeController', function($scope) {});
routingExample.controller('BlogController', function($scope) {});

routingExample.config(function($routeProvider) {
$routeProvider.
when('/home', {
templateUrl: 'home.html',
controller: 'HomeController'
}).
when('/blog', {
templateUrl: 'blog.html',
controller: 'BlogController'
}).
otherwise({
redirectTo: '/home'
});
});
<html>

<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="robots" content="noindex, nofollow">
<meta name="googlebot" content="noindex, nofollow">

<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.1.1/angular.min.js"></script>
<link rel="stylesheet" type="text/css" href="/css/normalize.css">
<link rel="stylesheet" type="text/css" href="/css/result-light.css">

<title>AngularJS Routing</title>

<script type="text/javascript" src="script.js"></script>
</head>

<body ng-app="Example.Routing" class="ng-scope">
<script type="text/ng-template" id="home.html">
<h1>Home</h1>
</script>
<script type="text/ng-template" id="blog.html">
<h1>Blog</h1>
</script>

<div>
AngularJS Routing

<div>
<a href="#/home">Home</a>
<a href="#/blog">Blog</a>
</div>

<div ng-view></div>
</div>
</body>

</html>

路由器在 URL 中使用 #,这意味着当您在 phantomJS 中运行 page.open 时,它不会强制重新加载(类似于标准浏览器行为)。因此 phantomJS 没有异步任务要做,也不会调用任何回调。一种方法是在设置新 URL 时使用第二个页面对象或强制重新加载。但是我想你不想那样做。这是我所做的(那是我的 phantomJS 脚本):

var page = require('webpage').create(),
t, url;

phantom.addCookie({
'name': 'token',
'value': '<authentication-token-goes-here>',
'domain': 'localhost'
});

t = Date.now();
url = 'http://localhost:8080/#/home';

page.onConsoleMessage = function(msg, lineNum, sourceId) {
console.log('CONSOLE: ' + msg + ' (from line #' + lineNum + ' in "' + sourceId + '")');
};

page.viewportSize = {
width: 1366,
height: 768
};

page.clipRect = {
top: 0,
left: 0,
width: 1366,
height: 768
};

page.open(url, function(status) {

setTimeout(function() {

console.log('page 1 status: ', status);
page.render('page1.png');
console.log('page1.png rendered');

console.log('moving to the second page ' + url);
page.onUrlChanged = function(targetUrl) {
console.log('URL changed, New URL: ' + targetUrl);
console.log(page.url);
if (targetUrl !== 'http://localhost:8080/#/home') { // the default page
setTimeout(function() {
page.render('page2.png');
phantom.exit();
}, 1000);
}
};

console.log('onUrlChanged callback handler set up');

var url = 'http://localhost:8080/#/blog';
console.log('opening the ' + url);
page.open(url, function(status) {});

}, 1000);
});

截图:

page1.png

page2.png

关于javascript - 按顺序打开 Angular 应用程序页面 - 第二个 page.open 回调不会被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43111235/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com