我有一个链接列表,我必须模拟使用CasperJS点击.他们都共享同一个班级.
但是this.click('.click-me')只使用第一个链接上的点击.
点击所有链接的正确方法是什么?我想也许我应该尝试获取链接的数量evaluate()然后使用for循环.但是,如果我使用evaluate()链接的数量,我必须使用消息进行通信,这似乎很复杂.
有没有更好的办法?
我试图让CasperJS打开链接中的每个array链接.我有它,以便在我打开链接后,它将显示该页面的标题.然而,当我运行它时,没有显示任何内容.
我可以用a for loop来显示链接,它完美无缺.
这是我刚才解释的代码:
var x;
casper.start(URL, function() {
x = links.split(" "); // now x is an array of links
for (var i = 0; j < x.length; i++) // for every link...
{
casper.thenOpen(partialURL + x[i], function() { // open that link
console.log(this.getTitle() + '\n'); // display the title of page
});
}
this.exit();
});
casper.run();
Run Code Online (Sandbox Code Playgroud)
这是我尝试的另一种方法:
var x;
casper.start(URL, function() {
x = links.split(" "); // now x is an array of links …Run Code Online (Sandbox Code Playgroud) 昨天我用CasperJS编写了我的第一个测试,我发现它很棒.问题是我找不到退出脚本执行的方法(即:casperjs不存在,所以我可以返回访问我的控制台).我通过添加最终测试找到了一种解决方法
casper.test.begin('Exit', function suite(test) {
casper.exit();
});
Run Code Online (Sandbox Code Playgroud)
关于这种技术,我有2个问题
我是CasperJS的新手,我在登录这个网站时遇到了问题http://weibo.com/login.php
这是我尝试过的
this.fill('form#contact-form', {
'username': 'test@test.com',
'password': 'anypassword',
}, true);
Run Code Online (Sandbox Code Playgroud)
我不能用它,因为它没有形式.
所以我尝试使用sendKeys的另一种方法.
this.sendKeys('.W_input ', 'tinkerbell@gmail.com');
Run Code Online (Sandbox Code Playgroud)
现在我的问题是输入文本中没有ID,只有CLASS,用户名和密码都有相同的CLASS.如何只使用该类输入该文本框?或者是否可以使用XPath使用sendKeys?
我试图用我的脚本隐藏CasperJS的利用率.目前我正在尝试更改分辨率,用户代理和语言:
casper.userAgent("My UA");
casper.viewport(1600, 900);
casper.page.customHeaders = {'Accept-Language': 'fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3'};
Run Code Online (Sandbox Code Playgroud)
casper.viewport()和casper.page.customHeaders似乎不适用于Google Analytics ...在尝试某些网站时,它似乎没问题,但Google Analytics会看到我是一个网络刮刀:
My lang is "c"
Compatibility with JAVA : no
Screen resolution : 1024x768
Flash version : not set
Run Code Online (Sandbox Code Playgroud)
我有什么可以做的吗?
(一块)解决方案
感谢kasper pedersen,这是解决方案的一部分:
我们可以在初始化部分覆盖一些变量:
casper.on('page.initialized', function (page) {
page.evaluate(function () {
(function() {
window.screen = {
width: 1600,
height: 900
};
window.navigator.__defineGetter__('javaEnabled', function () {
return function() { return true; };
});
})
});
});
Run Code Online (Sandbox Code Playgroud)
这会破坏Windows解析和Java插件.为了伪造闪存插件,我们可以做类似的事情:
casper.on('page.initialized', function (page) {
page.evaluate(function () {
(function() {
window.screen = { …Run Code Online (Sandbox Code Playgroud) 我做了这个小测试:
casper.test.begin('Test', function() {
casper.start();
casper.then(function() {
casper = this;
setTimeout(function(casper) {
casper.echo('wait 5s');
}, 5000);
});
casper.then(function() {
this.echo('should appear after 5s');
});
casper.run(function() {
this.test.done();
});
});
Run Code Online (Sandbox Code Playgroud)
当我执行这个测试时,我的控制台只显示这行"应该出现在5s之后"而不是第一个句子,实际上第二个'then'不会等待5秒.
这是一个很大的问题,因为它是我的casperjs测试套件中许多随机失败的可能原因.
也许我必须使用async(with series)来执行另一个步骤.
你有这个问题吗 ?在casperjs测试中一个接一个地执行一些javascript函数的最佳实践是什么?
我正在尝试获取特定网页的原始来源.
该页面执行一些脚本,一旦加载就修改DOM.我希望在任何脚本或用户更改文档中的任何对象之前获取源代码.
使用Chrome或Firefox(可能是大多数浏览器),我可以查看DOM(调试实用程序F12)或查看原始源(右键单击,查看源代码).后者是我想要完成的.
用phantomjs/casperjs可以做到这一点吗?
在进入页面之前,我必须登录.这与casperjs一起工作正常.如果我浏览页面并呈现结果,我知道我在正确的页面上.
casper.thenOpen('http://'+customUrl, function(response) {
this.page.render('example.png'); // *** Renders correct page (current DOM) ***
console.log(this.page.content); // *** Gets current DOM ***
casper.download('view-source:'+customUrl, 'b.html', 'GET'); // *** Blank page ***
console.log(this.getHTML()); // *** Gets current DOM ***
this.debugPage(); // *** Gets current DOM ***
utils.dump(response); // *** No BODY ***
casper.download('http://'+customUrl, 'a.html', 'GET'); // *** Not logged in ?! ***
});
Run Code Online (Sandbox Code Playgroud)
我已经尝试this.download(url, 'a.html')但它似乎没有共享相同的上下文,因为它返回HTML就好像我没有登录,即使我运行cookie casperjs test.casper.js --cookies-file=cookies.txt.
我相信我应该继续分析这个选项.
我也尝试过casper.open('view-source:url'),casper.open('http://url')但似乎它不能识别网址,因为我只是得到一个空白页面.
我已经查看了我从服务器获得的原始HTTP响应,我有一个实用程序,这个消息的主体(这是HTML)是我需要的,但是当页面在浏览器中加载时,DOM已经被修改. …
我在C:\ xampp\htdocs\phantom中安装了PhantomJS,并且我在这个文件夹C:\ xampp\htdocs\casper中安装了CasperJS
当我尝试使用phantomjs test.js命令在casper站点上运行这些示例代码时:
var casper=require('casper').create();
casper.start('http://google.fr/');
casper.thenEvaluate(function(term) {
document.querySelector('input[name="q"]').setAttribute('value', term);
document.querySelector('form[name="f"]').submit();
}, 'CasperJS');
casper.then(function() {
// Click on 1st result link
this.click('h3.r a');
});
casper.then(function() {
console.log('clicked ok, new location is ' + this.getCurrentUrl());
});
casper.run();
Run Code Online (Sandbox Code Playgroud)
它告诉我一个错误:
错误:找不到模块'casper'
我做错了什么?
我试图运行CasperJS有PhantomJS#2.0.0一对MAC(优胜美地).当尝试运行CasperJS时,我收到以下消息:
"CasperJS needs PhantomJS v1.x
/usr/local/Cellar/casperjs/1.1-beta3/libexec/bin/bootstrap.js:91 in __die"
Run Code Online (Sandbox Code Playgroud)
我该如何让它运行?有没有人让它工作?