标签: casperjs

使用PhantomJs和CasperJs注入JavaScript

我正在尝试使用CasperJS来抓取一个拥有动态内容并且到目前为止失败的网站.该网站使用几个js库(例如Prototype)来使用自动完成来创建内容.因此,我试图插入一些值并触发事件以引发内容创建.插入和触发事件可以正常工作,但不会创建任何内容.

我是CasperJS的新手,发现它与库的相对路径有问题.我怀疑我的问题来自于在我的页面环境中没有正确加载的库.因此我试着injectJs像这样注射它们

// ...创建casper并做一些其他的事情

casper.then(function(){

this.echo(this.page.injectJs('http://www.my-website.com/path/to/js1'));
this.echo(this.page.injectJs('http://www.my-website.com/path/to/js2'));

 });
Run Code Online (Sandbox Code Playgroud)

不幸的是,这两个函数都返回false.脚本的路径是正确的,在哪里可能是这个问题的根源?

非常感谢您的帮助.

javascript web-scraping phantomjs casperjs

9
推荐指数
1
解决办法
5427
查看次数

PhantomJS渲染页面字体

我正在使用PhantomJS截取网页截图.

我见过有关@ font-face问题的其他帖子,但我网页上的字体正确呈现.我遇到的唯一问题是,每次拍摄屏幕截图时,字体显示与上一屏幕截图略有不同.因此,虽然它们正确呈现,但它们在屏幕截图上的外观不一致.

我已经尝试了一些修复程序,大多数都基于这样的假设,即它与在页面准备好之前拍摄的屏幕截图有关,但这似乎不是问题.例如,我已经延迟了截取的截图,以便字体有时间加载和渲染,但这并不能解决问题.

我已尝试绑定到各种页面事件,但再次,没有运气.

我附上了截图以显示差异.问题是,我需要渲染的截图在我使用它的上下文中是准确的.

截图1 截图2

作为一个注释,我也尝试过CasperJS(知道它是基于PhantomJS所以不要期望它有任何不同).

font-face phantomjs casperjs

9
推荐指数
1
解决办法
3126
查看次数

CasperJS将数据传回PHP

PHP使用exec()命令调用CasperJS .在CasperJS完成其工作(例如检索网页的某些部分)之后,如何将检索到的数据返回给PHP?

php screen-scraping web-scraping phantomjs casperjs

9
推荐指数
2
解决办法
1万
查看次数

由于导航请求太多,CasperJS太慢了

我们知道我们可以在CasperJS中中止资源请求,如下所示:

casper.on('page.resource.requested', function(requestData, request) {
  if(/plusone|google\.com|about:blank/.test(requestData.url)){
    this.echo("----I can ignore this------");
    request.abort();
  }
});
Run Code Online (Sandbox Code Playgroud)

但是我发现它太慢了(打开一个页面可能需要几个小时),因为导航请求太多了,其中大多数是类型Reload,我想要这样的东西:

casper.on('navigation.requested', function(url, navigationType, navigationLocked, isMainFrame) {
  utils.dump(arguments);
  if(/plusone|google\.com|about:blank/.test(url)){
    this.echo("!!!-----------------------------Can I abort the request?---------------------!!!");
    // request.abort();
  }
});
Run Code Online (Sandbox Code Playgroud)

我在谷歌搜索了一整天,什么也没得到.这让我崩溃了.

javascript request headless-browser phantomjs casperjs

9
推荐指数
0
解决办法
2309
查看次数

Casperjs使用casper.each迭代链接列表

我正在尝试使用Casperjs从页面获取链接列表,然后打开每个链接,并从这些页面向数组对象添加特定类型的数据.

我遇到的问题是在每个列表项上执行的循环.

首先,我listOfLinks从原始页面获得了一个.这部分工作和使用长度我可以检查这个列表是否已填充.

但是,使用如下的循环语句this.each,没有任何控制台语句出现,并且casperjs似乎跳过此块.

this.each用标准for循环替换,执行只在第一个链接的一部分,因为语句"在对象中为x.html创建新数组"出现一次,然后代码停止执行.使用IIFE不会改变这种情况.

编辑:在详细调试模式下,会发生以下情况:

Creating new array object for https://example.com 
[debug] [phantom] Navigation requested: url=about:blank, type=Other, willNavigate=true, isMainFrame=true
Run Code Online (Sandbox Code Playgroud)

因此,由于某种原因,传递给thenOpen函数的URL变为空白...

我觉得有一些关于Casperjs的异步性质的东西,我在这里并没有把握,并且很感激被指向一个有效的例子.

casper.then(function () {

  var date = Date.now();
  console.log(date);

  var object = {};
  object[date] = {}; // new object for date

  var listOfLinks = this.evaluate(function(){
    console.log("getting links");
    return document.getElementsByClassName('importantLink');
  });

  console.log(listOfLinks.length);

  this.each(listOfLinks, function(self, link) {

    var eachPageHref = link.href;

    console.log("Creating new array in object for " + eachPageHref);

    object[date][eachPageHref] = []; // array …
Run Code Online (Sandbox Code Playgroud)

javascript phantomjs casperjs

9
推荐指数
1
解决办法
2855
查看次数

CasperJS:你如何点击所有选定的按钮?

我正在尝试使用CasperJS作为网络抓取工具,并且有一个页面包含按钮,点击时会加载数据.所以,我想首先点击所有这些按钮,然后在实际进行查询之前等待以获取所有必要的数据.

问题是,使用Casper,casper.thenClick(selector)单击第一个元素.但是,如何基于选择器迭代并单击每个元素?

请注意,这些按钮没有ID.它们都有通用的类选择器.

防爆.

<h3>
    <span>Text 1</span>
    <span>
        <button class="load-btn">show</button>
    </span>
</h3>
<h3>
    <span>Text 2</span>
    <span>
        <button class="load-btn">show</button>
    </span>
</h3>
<h3>
    <span>Text 3</span>
    <span>
        <button class="load-btn">show</button>
    </span>
</h3>
Run Code Online (Sandbox Code Playgroud)

由于某种原因casper.thenClick("h3:contains('text 1') .load-btn")不起作用.

javascript click web-scraping casperjs

9
推荐指数
1
解决办法
724
查看次数

不能使用Slimerjs,casperjs,phantomjs打开https网站

这是我第一次使用无头浏览器打开网站:phantomjs,slimerjs或casperjs.我只想打开网站.我只是创建非常基本的脚本来打开网站并截取屏幕截图.但其中3个(三个)给我空白图片.

我尝试使用:

--debug=true 
--ssl-protocol=TLSv1.2 (i try each of available protocol) 
--ignore-ssl-errors=true
Run Code Online (Sandbox Code Playgroud)

我的脚本在这里:

Slimerjs

var page = require("webpage").create();
page.open("https://domain/")
    .then(function(status){
         if (status == "success") {
            page.viewportSize = { width:1024, height:768 };
            page.render('screenshot.png');
         }
         else {
             console.log("Sorry, the page is not loaded");
         }
         page.close();
         phantom.exit();
    });
Run Code Online (Sandbox Code Playgroud)

phantomjs

var page = require('webpage').create();
page.open('https://domain/', function() {
  page.render('screenshot.png');
  phantom.exit();
});
Run Code Online (Sandbox Code Playgroud)

casperjs

var casper = require('casper').create({
  viewportSize: {width: 950, height: 950}
});

casper.start('https://domain/', function() {
    this.capture('screenshot.png');
});

casper.run();
Run Code Online (Sandbox Code Playgroud)

我甚至尝试使用屏幕捕获服务来了解它们是否可以打开.但是他们所有人都没有给我任何东西.

我有什么想念吗?

automation phantomjs casperjs slimerjs

9
推荐指数
1
解决办法
410
查看次数

CasperJS - 如何打开链接数组中的所有链接

我试图让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)

html javascript phantomjs casperjs

8
推荐指数
3
解决办法
2万
查看次数

CasperJS:如何退出脚本执行?

昨天我用CasperJS编写了我的第一个测试,我发现它很棒.问题是我找不到退出脚本执行的方法(即:casperjs不存在,所以我可以返回访问我的控制台).我通过添加最终测试找到了一种解决方法

casper.test.begin('Exit', function suite(test) {
    casper.exit();
});
Run Code Online (Sandbox Code Playgroud)

关于这种技术,我有2个问题

  1. 有没有更好的办法?
  2. 这会如何影响xunit文件的结果输出?

phantomjs casperjs

8
推荐指数
1
解决办法
1万
查看次数

在Mac(优胜美地)上使用phantomjs#2.0.0运行casperjs的问题

我试图运行CasperJSPhantomJS#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)

我该如何让它运行?有没有人让它工作?

phantomjs casperjs

8
推荐指数
2
解决办法
5548
查看次数