PhantomJs脚本中的Ajax请求

时间:2015-02-23 21:52:44

标签: jquery ajax phantomjs local

问题: phantomJs脚本中的Ajax请求到本地页面不起作用(无响应)

问题:如何让它发挥作用?任何想法或可能的解决方案?

描述:我正在运行一个phantomJs脚本,我需要访问另一个页面(本地)中由php函数提供的一些数据。为了做到这一点,我在phantomjs脚本中对该页面使用ajax请求。但是,请求不会执行任何操作。脚本是:

page.open(url, function (status) {
    page.includeJs('http://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js', function () {
        console.log("Solve Captcha");
        $.ajax({
            url: 'captcha.php',
            data: { filename: 'C:\\wamp\\www\\images\\0.png' },
            type: 'post',
            success: function (output) {
                console.log('Solved');
                phantom.exit();
            },
        });
    });
});

php页面位于本地WAMP服务器中,并且已经使用ajax(在phantomJs脚本之外)进行了测试,并且工作正常。脚本和php文件位于文件夹C:\wamp\www中,而图像0.png位于子文件夹C:\wamp\www\images中。

重要提示:页面captcha.php位于localhost中,而phantomJs正在请求不是本地的网页,即page.open打开非本地的url

我不明白为什么在phantomJs脚本中提出这个请求是行不通的。你能帮我吗?

1 个答案:

答案 0 :(得分:6)

page.includeJs()将jQuery注入页面,因此只能从页面上下文(page.evaluate()内部)访问它。页面上下文是沙箱的,因此您无法从页面上下文中调用phantom.exit(),因为没有此类对象window.phantom

你有两种可能性使它发挥作用。

阻止AJAX

jQuery.ajax()接受async: false属性来阻止AJAX调用,因此您可以简单地进行调用,然后以迭代方式继续执行。

page.open(url, function (status) {
    page.includeJs('http://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js', function () {
        console.log("Solve Captcha");
        page.evaluate(function(){
            $.ajax({
                async: false, // this
                url: 'http://localhost/captcha.php',
                data: { filename: 'C:\\wamp\\www\\images\\0.png' },
                type: 'post',
                success: function (output) {
                    console.log('Solved');
                },
            });
        });
        phantom.exit();
    });
});

等待完成

示例中的

waitFor可用于等待设置特定条件。这个条件应该在AJAX调用的success回调中设置:

page.open(url, function (status) {
    page.includeJs('http://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js', function () {
        console.log("Solve Captcha");
        page.evaluate(function(){
            window._finishedCall = false;
            $.ajax({
                url: 'http://localhost/captcha.php',
                data: { filename: 'C:\\wamp\\www\\images\\0.png' },
                type: 'post',
                success: function (output) {
                    console.log('Solved');
                    window._finishedCall = true;
                },
            });
        });
        waitFor(function check(){
            return page.evaluate(function(){
                return window._finishedCall;
            });
        }, function onReady(){
            phantom.exit();
        }, 10000); // 10 seconds maximum timeout
    });
});

第二个问题是您要发出跨域请求,因为captcha.php位于localhost上,而url与localhost不同。您需要使用--web-security=false选项运行PhantomJS并使用完全限定的网址:http://localhost/captcha.php