在过去的几个小时里,我一直在尝试查询DOM元素并将它们存储在CasperJS的数组中,然后我可以循环遍历它们并触发click事件.
比方说,我的标记是这样的:
<ul>
<li>One</li>
<li>Two</li>
<li>Three</li>
</ul>
Run Code Online (Sandbox Code Playgroud)
现在,我想存储<li>一个数组,然后循环,触发Click事件,然后进行捕获.
这是我尝试过的事情之一:
var listItems = [];
casper.start();
casper.open(urlHere, function () {
listItems.push(this.evaluate(function () {
return document.querySelectorAll('ul > li');
}));
this.echo(listItems);
});
Run Code Online (Sandbox Code Playgroud)
它返回[ , , , ]基本上意味着它们都是null.
有人可以指导我朝正确的方向发展吗?
谢谢!
我看到了这个帖子,看起来没有办法将复杂的对象传递给evaluate()
https://groups.google.com/forum/#!topic/casperjs/x7I8LDFwFJ0
因此,如果我写一个对象并希望分享不同的对象,evaluate()我该怎么做?
让我说一些愚蠢的对象,我想一次又一次地使用getData函数:
var testObj = (function() {
var a = 1;
function test1(b) {
return (a+b);
}
return {
getData : function(arg) {
return (test1(3) + arg);
}
}
})();
Run Code Online (Sandbox Code Playgroud)
有可能的解决方法吗?
更新1:
我的意思是传递带有函数的对象.如下所示但它不起作用(返回null):
var casper = require('casper').create();
casper.start('about:blank', function() {
var TestObj = function() {
var a = 1;
function test1(b) {
return (a+b);
}
return {
getData : function(arg) {
return (test1(3) + arg);
}
}
}
var testObj = new TestObj(); …Run Code Online (Sandbox Code Playgroud) 我无法弄清楚如何做到以下几点:
在运行我的测试之前,我想将(multipart)文件发布到服务器.我们的后端为这些上传创建内容配置文件,然后可以通过UI访问.这是我需要运行测试的内容配置文件.
我知道.fill()功能,但这不适用,因为我不想通过UI进行文件上传.有什么方法可以通过CasperJS或javascript实现,或者任何人都可以指向我可能帮助我的文档?
我正在使用Windows.我正在尝试使用CasperJS测试框架.
我正在使用phantomjs版本1.9.0.我正在使用casperjs版本1.0.2.
我跑的时候
casperjs test cow-test.js
Run Code Online (Sandbox Code Playgroud)
返回以下内容.
Test file: cow-test.js
FAIL TypeError: 'undefined' is not a function (evaluating 'casper.test.begin')
# type: uncaughtError
# error: "TypeError: 'undefined' is not a function (evaluating 'casper.test.begin')"
TypeError: 'undefined' is not a function (evaluating 'casper.test.begin')
C:/cow-test.js:16
FAIL 1 tests executed in 0.116s, 0 passed, 1 failed.
Details for the 1 failed test:
In cow-test.js:0
uncaughtError: TypeError: 'undefined' is not a function
(evaluating 'casper.test.begin')
var cow = {};
test.assert(cow);
test.done();
})')
Run Code Online (Sandbox Code Playgroud)
如果我只做
console.log(casper.test);
Run Code Online (Sandbox Code Playgroud)
返回以下内容
[object Object] …Run Code Online (Sandbox Code Playgroud) 我试图使用casperjs来检查DOM中是否存在以下元素:
<b>Bar</b>
Run Code Online (Sandbox Code Playgroud)
有没有一种简单的方法可以使用选择器和casper.exists?casperjs文档使其非常不清楚.
我想在运行一些CasperJs浏览器测试之前运行一些设置例程.
有一次我无法填写表格数据,因为有一些错位的HTML(表格标签放在表格中):
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Test</title>
</head>
<body>
<table>
<form id="test1">
<input type="text" name="selector_1" />
</form>
</table>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
这是一个简单的测试用例:
casper.test.begin('Test', 0, function suite(test) {
casper.start('http://localhost:8000', function() {
this.fill('form#test1', {
"selector_1": 'Yo!'
}, true);
});
casper.run(function() {
test.done();
});
});
Run Code Online (Sandbox Code Playgroud)
测试结果是: error: Errors encountered while filling form: no field matching names selector "selector_1" in form
当我在这个例子中删除表标记时,它可以工作.
不幸的是,我不能在"现实世界"中改变这一点,因为破坏的HTML来自我没有源代码访问的应用程序.
这可以直接用CasperJs解决吗?
我想我也可以尝试通过替换损坏的部分来"修复"HTML.这可能是让这个工作的唯一方法吗?
我有一个CasperJS的测试步骤,它执行以下操作:
this.fillSelectors("#registration-form", {
"#first-name": "Bob",
"#last-name": "Smith",
"#email-address": RANDOM_EMAIL,
"#password": PASSWORD,
"#password-confirm": PASSWORD
}, true);
Run Code Online (Sandbox Code Playgroud)
我希望能够发送HTTP标头.如果没有"手动"发布表单,我似乎无法找到这样做的方法,这不是我想要的那种测试.
有没有办法获得IDE对CasperJS功能的支持?我目前正在使用PhpStorm,但也试过netbeans,它不知道定义了哪些函数.我得到Unresolved variable / undefined function所有功能的IDE警告是非常恼人的.
我目前正在与PhantomJS和CasperJS合作,以搜索网站中的链接.该网站使用javascript动态加载结果.但是下面的代码片段并没有让我获得该页面包含的所有结果.我需要的是向下滚动到页面底部,查看微调器是否显示(意味着还有更多内容),等待新内容加载后再继续滚动直到不再显示新内容.然后将带有类名的链接存储.title在一个数组中.链接到网页进行抓取.
var casper = require('casper').create();
var urls = [];
function tryAndScroll(casper) {
casper.waitFor(function() {
this.page.scrollPosition = { top: this.page.scrollPosition["top"] + 4000, left: 0 };
return true;
}, function() {
var info = this.getElementInfo('.badge-post-grid-load-more');
if (info["visible"] == true) {
this.waitWhileVisible('.badge-post-grid-load-more', function () {
this.emit('results.loaded');
}, function () {
this.echo('next results not loaded');
}, 5000);
}
}, function() {
this.echo("Scrolling failed. Sorry.").exit();
}, 500);
}
casper.on('results.loaded', function () {
tryAndScroll(this);
});
casper.start('http://example.com/', function() {
this.waitUntilVisible('.title', function() {
tryAndScroll(this); …Run Code Online (Sandbox Code Playgroud) 我正在编写一个站点刮板来从ajax站点获取一些特定内容而没有实际链接,只有可点击的文本.我现在只使用javascript大约一个星期,并且正在使用CasperJS,因为它会减少很多工作.
我发现的问题是我正在编写多个函数,它们都做同样的事情,只是根据它所在的页面搜索不同的链接.所以我有:
function getLinks() {
var links = document.querySelectorAll('div.AjaxLink h3');
return Array.prototype.map.call(links, function(link) {
return link.innerText;
});
}
Run Code Online (Sandbox Code Playgroud)
它的运行方式是:
casper.then(function() {
var myLinks = this.evaulate(getLinks);
/* ... link manipulation code code ... */
});
Run Code Online (Sandbox Code Playgroud)
这很好用.我显然不希望有六个函数只有一个不同的查询字符串.所以我想做的是:
function getLinks(findText) {
var links = document.querySelectorAll(findText);
return Array.prototype.map.call(links, function(link) {
return link.innerText;
});
}
Run Code Online (Sandbox Code Playgroud)
然后我试图通过以下方式运行它:
casper.then(function() {
var myLinks = getLinks('div.AjaxLink h3');
/* ... link manipulation code code ... */
});
Run Code Online (Sandbox Code Playgroud)
findText变量正确传入但看起来查询选择器总是返回一个空的NodeList.
我究竟做错了什么?是记录该函数内部创建了一个空文件?
casperjs ×10
javascript ×7
phantomjs ×7
dom ×1
evaluate ×1
form-submit ×1
http-headers ×1
ide ×1
multipart ×1
node.js ×1
phpstorm ×1
testing ×1
undefined ×1
upload ×1
web-scraping ×1