casper.start(URL, function() {
casper.page.injectJs('C:/Users/Mike/Documents/n1k0-casperjs-bc0da16/jquery-1.10.2.min.js');
var names = $('span.author-name');
this.echo(names);
this.exit();
}
Run Code Online (Sandbox Code Playgroud)
ReferenceError:找不到变量:$
我该怎么办?我在创建casper实例时也尝试过这个:
var casper = require('casper').create({
// I've tried both commented lines below
// clientScripts: ['C:/Users/Mike/Documents/n1k0-casperjs-bc0da16/jquery-1.10.2.min.js']
// clientScripts: ['includes/jquery-1.10.2.min.js']
});
Run Code Online (Sandbox Code Playgroud) 通过casperjs文档我无法找到从客户端javascript中看到console.log的位置.这可能吗?
我看到CasperJS有一个"下载"功能和一个"on resource received"回调,但我没有在回调中看到资源的内容,我不想将资源下载到文件系统.
我想获取资源的内容,以便我可以在我的脚本中使用它.这可能与CasperJS或PhantomJS有关吗?
我正在评估phantom.js和zombie.js.我期望权衡是幻影有更广泛的文档支持(因为它使用真实的渲染器),而僵尸更快(因为没有使用渲染引擎).然而僵尸似乎在我做的测试中慢得多.这有意义吗?
我想也许zombie在visit()返回之前等待整页加载(包括运行所有脚本和加载css),而phantom在start()之后立即返回(我使用了casperjs),允许我继续而不等待整页.
Phantom.js
casper.userAgent("Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.98 Safari/534.13");
casper.test.begin('bing search', 2, function(test) {
casper.start('http://www.bing.com/', function() {
this.waitUntilVisible('#sb_form_q', function() {
this.sendKeys('#sb_form_q', "book", true);
this.click('#sb_form_go');
this.waitUntilVisible('#count', function() {
var val = this.evaluate(function() {
return document.getElementById('count').innerText
});
console.log(val)
});
});
}).run(function() {
test.done();
});
});
Run Code Online (Sandbox Code Playgroud)
Zombie.js
var Browser = require("zombie");
var browser = new Browser()
browser.userAgent = "Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.98 Safari/534.13"
browser.visit("http://www.bing.com/", function() { …Run Code Online (Sandbox Code Playgroud) 我的https页面有问题.页面完全正常,它存在,但phantomjs告诉我别的东西:'加载资源失败,状态失败'.我读了一段时间,现在我知道它是phantomjs的bug,这个问题的解决方案是:
--ignore-ssl-errors=true
Run Code Online (Sandbox Code Playgroud)
所以我知道解决方案,但不知道如何使用它.我如何将这个传递给casper的phantomjs?我该怎么办?
编辑:
整个代码:
var casper = require('casper').create({
verbose: true,
logLevel: 'warning',
pageSettings: { javascriptEnabled: true },
viewportSize: {width: 1024, height: 768}
});
var url = 'http://us3.php.net/manual/en/function.explode.php',
xp = require('casper').selectXPath;
// ### AKCJE PODSTAWOWE ###
casper.start(url);
casper.userAgent('Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0');
casper.then(function(){this.captureSelector('logi/img1.png', 'body');});
casper.then(function(){ this.sendKeys(xp('/html/body/nav/div/div/div/form/span/input[2]'),'test18');});
casper.then(function(){this.captureSelector('logi/img2.png', 'body');})
casper.thenClick(xp('/html/body/div[3]/div/section/div/div[2]/a[1]'));
casper.wait(2000);
casper.then(function(){this.captureSelector('logi/img3.png', 'body');})
casper.run(function(){ this.exit(); });
Run Code Online (Sandbox Code Playgroud) 我正在努力确定什么是异步,什么不是在运行CasperJS时,什么必须包含在then()语句中,以及什么时候将被评估.
我将遇到一个问题,与一个直通破坏语句,变量范围或evaluate()语句有关,我将开始在then()语句中包装我的所有代码......结果证明不成问题.
我注意到,当我单步执行时,我的代码运行在两个级别上,一个解析代码的评估级别,然后是then()语句.此外,我的打印语句有时会出现无法解释的顺序.
我的问题:这些then()语句如何实际排队?我已经阅读了文档,我有点理解.我想了解规则,并有一些切割和干燥的方法来确定什么是同步和什么是异步.
我甚至阅读过关于异步编码的书的部分内容,但似乎没有什么能真正解决CasperJS结构问题.有资源吗?
另外,在什么地方放置then()语句的最佳做法是什么?它们是应该在整个过程中自由地加上,还是应该在控制主要的casper.begin()函数中调用其他函数?
谢谢大家,我已经习惯了PHP.
我想假冒CasperJS(/ PhantomJS)的Navigator平台属性.我找到了在页面加载时覆盖Navigator对象的简单解决方案,这在Web上的许多其他地方都是建议的:
casper.on('page.initialized', function(){
this.evaluate(function(){
(function(oldNav){
var newNav = {};
[].forEach.call(Object.getOwnPropertyNames(navigator), function(prop){
if (prop === 'platform') {
Object.defineProperty(newNav, prop, {
value: 'Win64'
}); }else {
Object.defineProperty(newNav, prop, {
get: function(){
return oldNav[prop];
}
});
}
});
window.navigator = newNav;
})(window.navigator);
});
});
Run Code Online (Sandbox Code Playgroud)
但问题是,如果我们从Iframe获取Navigator属性,则值仍然是原始值,因为page.initialized仅将其设置为主页面.所以我选择在源代码中更改它并再次构建它.我从git repo下载了Phantomjs,我搜索了一个硬编码的平台值(对于我的情况,Linux x86_64).我找到了硬编码的字符串./phantomjs/src/qt/qtwebkit/Source/WebCore/platform/qt/UserAgentQt.cpp
我把它改成了我想要作为navigator.platform返回的字符串,但它没有影响navigator.platform.我应该在哪里改变它?它(平台)是一个带编码的字符串还是动态创建的?
我在一个js文件中使用PhantomJs,CasperJs和Js来运行cmd.
想象一下,我们有两个文件(test1.js和test2.js).这两个文件都有一个url/site变量,用于将测试定向到特定地址.每当环境发生变化或目标位置发生变化时,我们都需要更新此变量.
为了避免更新文件,我想通过命令行传递值,以测试它的位置.
有没有办法在运行文件时通过cmd声明字符串变量?
例如:
casperjs test.js "var site='http://google.com';"
Run Code Online (Sandbox Code Playgroud) 我想单击一个提交按钮,等待下一页加载,然后在第二页上获取html ..我开始,然后运行,但后面的步骤仍在第一页上运行.有任何想法吗?
var casper = require('casper').create();
var site = 'http://www.example.com';
var data = {};
casper.start(site, function() {
this.evaluate(function() {
$('input[type="submit"]:first').click();
});
});
casper.then(function() {
data.body = this.evaluate(function() {
var rows = $('#content table:first tbody tr');
var listings = rows.eq(3).text();
var count = rows.eq(4).text();
return {
listings: listings,
count: count
};
});
});
casper.run(function() {
this.echo(data.body.listings);
this.exit();
});
Run Code Online (Sandbox Code Playgroud) 我是CasperJS的新手,我已经开始创建一个测试套件了.一些步骤(如登录到应用程序)将被重复使用,因此我们希望在库文件(包含在测试文件中)中管理它们.
此外,我们有多个环境运行(开发,集成,生产等),因此我们需要为此参数化测试步骤,因此应该可以将参数传递给模块.
我搜索了文档和stackoverflow(我知道有类似的问题),但我的Javascript技能显然太有限,我无法启动并运行.
这是我的示例测试文件:
// googletesting.js
casper.test.begin('Google search retrieves 10 or more results', 5, function suite(test) {
casper.start("http://www.google.fr/", function() {
test.assertTitle("Google", "google homepage title is the one expected");
test.assertExists('form[action="/search"]', "main form is found");
this.fill('form[action="/search"]', {
q: "casperjs"
}, true);
});
casper.then(function() {
test.assertTitle("casperjs - Recherche Google", "google title is ok");
test.assertUrlMatch(/q=casperjs/, "search term has been submitted");
test.assertEval(function() {
return __utils__.findAll("h3.r").length >= 10;
}, "google search for \"casperjs\" retrieves 10 or more results");
});
casper.run(function() {
test.done();
});
});
Run Code Online (Sandbox Code Playgroud)
这就是它应该是(或类似的):
// …Run Code Online (Sandbox Code Playgroud) casperjs ×10
javascript ×7
phantomjs ×6
jquery ×2
asynchronous ×1
cmd ×1
console ×1
navigator ×1
overwrite ×1
performance ×1
ssl ×1
zombie.js ×1