我需要在每次迭代之间进行3次和2次循环.我试过这3个选项:
选项1
var casper = require('casper').create({
verbose: false,
logLevel: 'debug'
});
casper.start("http://google.com");
casper.on('remote.message', function(msg) {
this.echo('remote message caught: ' + msg);
})
casper.thenEvaluate(function() {
var x = 0;
var intervalID = setInterval(function () {
console.log("Using setInternal " + x);
if (++x === 3) {
window.clearInterval(intervalID);
}
}, 2000);
});
casper.run();
Run Code Online (Sandbox Code Playgroud)
观察:没有出现因为剧本在第一次setInterval被调用之前立即结束.
选项2
替换thenEvaluate()为then()下面
for (i=0; i<3; i++) {
this.wait(2000);
this.echo('Using this.wait ' + i);
}
Run Code Online (Sandbox Code Playgroud)
观察:它立即输出3次,然后等待很长时间,因为this.wait()是异步.这不是我想要的,因为我想在两者之间延迟. …
是否可以检查/记录每次运行PhantomJs/CasperJS时传输的数据量?
Phantom/Casper的每个实例都有一个instance_id分配给它(通过旋转实例的PHP函数).运行完成后,传输的数据量instance_id必须通过生成实例的PHP函数插入MySQL数据库.这样就可以记录各个phantomjs运行的带宽利用率.
可以运行许多幻像/ casper实例,每个实例持续一两分钟.
我在页面上有一个ExtJs文本字段.我在casper.js中填充了一些值,工作正常.
然后我想要关注这个字段并按下Enter键,因为<form>它周围没有提交.
我试过的是:
casper.then(function() {
// the text field is filled with the string
this.sendKeys('#searchfield', 'some text');
this.evaluate(function() {
// this does not put the field in focus
document.querySelector('#searchfield').focus();
// so 'pressing' enter has no effect at all
var evt = document.createEvent('KeyboardEvent');
evt.initKeyboardEvent('keypress', true, true, window, 0, 0, 0, 0, 0, 13);
document.dispatchEvent(evt);
});
});
Run Code Online (Sandbox Code Playgroud)
你知道怎么做到这一点吗?
我正在使用CasperJS中的waitForSelector()和captureSelector()方法等待并使用CSS选择器选择一个元素,然后保存它的截图.
但是,我发现因为css background已设置为transparent,屏幕截图结果非常难看,所以我想设置background为white.我确信,我使用document.querySelector在评估()调用,但似乎并没有工作.
这是我的脚本(您之前可以忽略所有内容casper.start(...,我只是包含了下一个代码片段的上下文的开头部分):
var casper = require("casper").create({
verbose: true,
clientScripts: ["libs/jquery-1.10.2.js"]
});
var utils = require("utils");
var requiredOptions = [ 'url', 'selector', 'filename' ];
var missingOptions = new Array();
for (var i = 0 ; i < requiredOptions.length ; i++) {
var opt = requiredOptions[i];
if (!casper.cli.has(opt)) {
missingOptions.push(opt);
}
}
if (missingOptions.length > 0) {
casper.die("\nMissing the following CLI …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用CasperJS来自动化大量繁琐的数据输入.具体来说,要在佳能网站上注册一大批相机设备.
我有处理表单填充的代码,使用CasperJS浏览网页时没有问题,但我无法让CasperJS导航到登录页面.
这是我到目前为止所拥有的:
var casper = require('casper').create({
verbose: true,
userAgent: 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36',
logLevel: "debug"
});
phantom.cookiesEnabled = true;
casper.start();
casper.thenOpen('https://b2cweb.usa.canon.com/b2cweb/view/myAccountHome.jsf?LOGINACTION=Y', function(response) {
require('utils').dump(response);
});
casper.run();
Run Code Online (Sandbox Code Playgroud)
注意:上面的代码一旦到达页面就转储标题内容.我还尝试了不同的用户代理字符串,以防Adobe主动阻止抓取工具.
该链接在Google Chrome中完美运行,但CasperJS只记录以下内容.
加载资源失败,状态=失败
从Google Dev Tools看来链接302重定向到
https://b2cweb.usa.canon.com/b2cweb/view/myAccountHome.jsf?LOGINACTION=Y
然后301重定向到:
我假设重定向是CasperJS无法获取登录页面的原因.
是否有可能使CasperJS遵循这些类型的重定向?可以使用CasperJS通过HTTPS浏览和/或登录吗?
更新:
我不太确定它是否是导致问题的重定向.
作为一种解决方法,我尝试预先将会话cookie(从chrome复制)预加载到casperjs中,然后直接导航到帐户页面.
我还尝试在命令中添加--ignore-ssl-errors = true标志但没有成功.
无论我做什么,它都会返回一个about:blank url.
我正在使用CasperJS下载15 MB的文件.在浏览器中,下载大约需要3分钟才能完成.使用Casper,.download相同url 的函数在30秒后返回,并且写入磁盘的文件为0字节.我已经尝试设置更长的超时时间:
var casper = require("casper").create({
pageSettings: {
webSecurityEnabled: false
},
waitTimeout: 500000,
stepTimeout: 500000
});
Run Code Online (Sandbox Code Playgroud)
但它们没有效果.这是我的下载功能:
casper.on('resource.received', function (resource) {
var url, file;
if ((resource.url.indexOf("myDownloadUniqueString=") !== -1) ) {
this.echo(resource.url); // the echo'ed url can be downloaded in a web browser
url = resource.url;
file = "downloaded_file.wav"; // this will be 0 bytes
try {
var fs = require("fs"); // phantom js file system (not node)
casper.download(resource.url, file);
} catch (e) {
this.echo(e); // no error …Run Code Online (Sandbox Code Playgroud) 有没有办法使用casperjs或phantomjs保存当前的网页?我试图获取html并将其保存到文件中.但是生成的文件与当时的截图(with casper.capture)有很大不同.有没有办法保存当前的网页?
我在casperjs中创建了一个应用程序,它可以从网站上删除运动数据.
我想在heroku上按照cronjob运行此应用程序,以将运动结果保存在csv,数据库或外部google文档中(尚未确定).
但是,在我开始为heroku实现它之前,我有一个问题:
heroku,其声称,它可以运行casperjsscirpts.但是,我是否需要nodejs运行预定的脚本?或者我可以在heroku上创建一个cronjob吗?我非常感谢你的回复!
有一个waitForUrl()在功能Casper.js,但有可能waitForUrlChange()在Casper.js?
我的意思是检测this.getCurrentUrl()价值的变化.我无法预测新的网址值.它可以是任何东西.
我正在使用CasperJS来阅读某个网页.我想要做的是在CasperJS中加载一个网页.然后,等待某个HTML元素具有特定文本.
所以我喜欢这样做:
var casper = require('casper').create();
casper.start('http://www.example.com/somepage', function() {
this.echo('Home page opened');
});
// wait for text based on a CSS selector
casper.waitForText('.someCssClass', 'dolor sit', function() {
this.echo('found title!');
});
// when text is eventually found, then continue with this
casper.then(function() { ... } );
casper.run();
Run Code Online (Sandbox Code Playgroud)
所以我想使用waitForText,但使用CSS选择器.这样它就可以监视certaim HTML元素中的一段文本.这对我来说并不是很明显是否以及如何做到这一点.
这可以在CasperJS中完成吗?如果是这样,我该怎么做?