标签: casperjs

使用CasperJS将多个DOM元素存储在数组中

在过去的几个小时里,我一直在尝试查询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.

有人可以指导我朝正确的方向发展吗?

谢谢!

javascript evaluate casperjs

4
推荐指数
1
解决办法
4537
查看次数

有没有办法将对象传递给casper.js的evaluate()?

我看到了这个帖子,看起来没有办法将复杂的对象传递给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)

javascript node.js web-scraping phantomjs casperjs

4
推荐指数
1
解决办法
5652
查看次数

如何通过普通的Javascript而不是通过UI使用CasperJS进行文件POST

我无法弄清楚如何做到以下几点:

在运行我的测试之前,我想将(multipart)文件发布到服务器.我们的后端为这些上传创建内容配置文件,然后可以通过UI访问.这是我需要运行测试的内容配置文件.

我知道.fill()功能,但这不适用,因为我不想通过UI进行文件上传.有什么方法可以通过CasperJS或javascript实现,或者任何人都可以指向我可能帮助我的文档?

upload multipart phantomjs casperjs

4
推荐指数
1
解决办法
7135
查看次数

casperjs test cow-test.js undefined不是评估casper.test.begin的函数

我正在使用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)

testing undefined casperjs

4
推荐指数
1
解决办法
3927
查看次数

使用casperjs检查元素

我试图使用casperjs来检查DOM中是否存在以下元素:

<b>Bar</b>
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法可以使用选择器和casper.exists?casperjs文档使其非常不清楚.

javascript dom css-selectors phantomjs casperjs

4
推荐指数
1
解决办法
3848
查看次数

使用casperjs测试损坏的html

我想在运行一些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.这可能是让这个工作的唯一方法吗?

javascript casperjs

4
推荐指数
1
解决办法
310
查看次数

在表单提交CasperJS中发送http标头

我有一个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标头.如果没有"手动"发布表单,我似乎无法找到这样做的方法,这不是我想要的那种测试.

javascript form-submit http-headers phantomjs casperjs

4
推荐指数
1
解决办法
3395
查看次数

PhantomJS/CasperJS IDE助手

有没有办法获得IDE对CasperJS功能的支持?我目前正在使用PhpStorm,但也试过netbeans,它不知道定义了哪些函数.我得到Unresolved variable / undefined function所有功能的IDE警告是非常恼人的.

ide phpstorm phantomjs casperjs

4
推荐指数
1
解决办法
3187
查看次数

刮擦无限滚动页面会停止而不滚动

我目前正在与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)

javascript phantomjs casperjs

4
推荐指数
1
解决办法
1129
查看次数

函数中的CasperJS querySelectorAll(变量)不返回任何结果

我正在编写一个站点刮板来从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.

我究竟做错了什么?是记录该函数内部创建了一个空文件?

javascript selectors-api phantomjs casperjs

4
推荐指数
1
解决办法
1122
查看次数