2

我第一次尝试 PhantomJs。我的目标是简单简单的页面自动化。

我只需要 - 加载一个网页,比如说 www.google.com - 填写查询词 - 只是(真的,只有这个)搜索结果页面的 console.log

我遇到了一些问题,因为我发现的所有教程都是从过于复杂的任务开始的。

以下是我个人的分步教程,但这个“结束”有一个问题:“如何在提交后记录页面内容?”

我做的第一步是:

var page = require('webpage').create();
page.open('https://www.google.it', function () {
    console.log (page.content);
    phantom.exit()
});

这有效。

然后我注入jquery

var page = require('webpage').create();
page.open('https://www.google.it', function () {

    page.includeJs("http://code.jquery.com/jquery-1.10.1.min.js", function() {

        console.log (page.content);
        phantom.exit()
    });

});

一个有效的。

现在我正在尝试填写搜索框。我必须填写这个字段

<input autocomplete="off" class="lst" value="" title="Cerca con Google" maxlength="2048" name="q" size="57" style="...[omitted]...">

我正在这样做:

var page = require('webpage').create();
page.open('https://www.google.it', function () {

    page.includeJs("http://code.jquery.com/jquery-1.10.1.min.js", function() {

        console.log (page.content);
        var value = page.evaluate(function() {
            $('input[name="q"]').val("Daduu");
            return $('input[name="q"]').val();
        });
        console.log ("search term: " + value);
        phantom.exit()
    });

});

它正在工作。现在我需要“点击”提交按钮

<input class="lsb" value="Cerca con Google" name="btnG" type="submit">

这样做:

var page = require('webpage').create();
page.open('https://www.google.it', function () {

    page.includeJs("http://code.jquery.com/jquery-1.10.1.min.js", function() {


        var value = page.evaluate(function() {
            $('input[name="q"]').val("Daduu");
            $('input[name="btnG"]').trigger("click");
            return $('input[name="q"]').val();
        });
        // console.log (page.content);
        page.render("google.png");
        phantom.exit()
    });

});

当我看到图像时(只是为了以人性化的方式查看渲染结果),我看到了 google.it 页面,其中填充了“q”字段。

问题是:

**真的是页面加载[是谷歌搜索]?**

“如何检测到 console.log 或 page.render 内容的页面更改?”

编辑:我看到了:Phantomjs - 如何填充表单、提交并获取结果?

但这不是我需要的。我想检测页面加载何时完成,而不是“设置超时”来呈现页面。

编辑 2:我看到了:PhantomJS:提交表单

但这太复杂了,我不明白这是如何工作的。

可能需要围绕 setTimeout 进行包装,但是,由于使用 js 对象,我正在寻找一种方法来工作事件驱动

onInitialPageLoaded (
  fillForm
  click
)

onSearchResultLoaded (
  render or log content of page
)

但我无法理解 PhantomJs 是否有可能,以及如何实现它!

4

1 回答 1

1

PhantomJS itself is not a test framework. There are projects which are built on top of PhantomJS to provide convenient high-level functionality for testing purposes such as CasperJs.

Let's search "phantomjs" with casperJs.

var links = [];
var casper = require('casper').create();

function getLinks() {
    var links = document.querySelectorAll('h3.r a');
    return Array.prototype.map.call(links, function(e) {
        return e.getAttribute('href')
    });
}

casper.start(function() {
    // now search for 'phantomjs' by filling the form again
    this.fill('form[action="/search"]', { q: 'phantomjs' }, true);
});

casper.then(function() {
    // aggregate results for the 'phantomjs' search
    links = links.concat(this.evaluate(getLinks));
});

casper.run(function() {
    // echo results in some pretty fashion
    this.echo(links.length + ' links found:');
    this.echo(' - ' + links.join('\n - ')).exit();
});

From Ariya Hidayat, creator of PhantomJS

In case you haven’t seen CasperJS yet, go and take a look, it’s an extremely useful companion to PhantomJS.

于 2013-06-07T11:30:57.633 回答