Javascript PhantomJS执行搜索并获取URL

Javascript PhantomJS执行搜索并获取URL,javascript,phantomjs,Javascript,Phantomjs,我的PhantomJS脚本的目的是加载一个特定的网站,找到搜索输入元素,在该输入中写入文本并执行搜索。从包含搜索结果的页面中,我只想获取整个URL—它将包含搜索参数 在与输入交互之后,我使用onUrlChanged()检测搜索结果URL何时返回。这永远不会被调用。我不知道这是因为搜索未完成,还是因为onUrlChanged()位置错误 var page = require('webpage').create(), response = {}; page.onUrlChanged = f

我的PhantomJS脚本的目的是加载一个特定的网站,找到搜索输入元素,在该输入中写入文本并执行搜索。从包含搜索结果的页面中,我只想获取整个URL—它将包含搜索参数

在与输入交互之后,我使用
onUrlChanged()
检测搜索结果URL何时返回。这永远不会被调用。我不知道这是因为搜索未完成,还是因为
onUrlChanged()
位置错误

var page  = require('webpage').create(),
    response = {};
page.onUrlChanged = function(targetUrl) { // Page loaded
    page.evaluate(function() {
        var inputs = document.getElementsByTagName('input');
        for (var i = 0; i < inputs.length; i++) {
            if (inputs[i].type.toLowerCase().indexOf('search') > -1) {
                inputs[i].value = 'cat dog';
                inputs[i].focus();
                page.sendEvent('keypress', 'Enter');
                break;
            }
        }
    });

    // This does not get called
    page.onUrlChanged = function(targetUrl) { // Search result loaded
        response.content = targetUrl;
        console.log(JSON.stringify(response));
        phantom.exit(1);
    };
};

page.open('http://www.mysearch.com/', function(status) {
    if (status !== 'success') {
        response.content = 'Unable to access network';
        console.log(JSON.stringify(response));
        phantom.exit(1);
    } else {
        phantom.exit(1);
    }
});
var page=require('webpage')。create(),
响应={};
page.onUrlChanged=函数(targetUrl){//已加载页面
page.evaluate(函数(){
var inputs=document.getElementsByTagName('input');
对于(变量i=0;i-1){
输入[i]。值=‘猫狗’;
输入[i].focus();
page.sendEvent('keypress','Enter');
打破
}
}
});
//这不需要打电话
page.onUrlChanged=函数(targetUrl){//已加载搜索结果
response.content=targetUrl;
log(JSON.stringify(response));
幻影。出口(1);
};
};
第页打开('http://www.mysearch.com/,功能(状态){
如果(状态!=“成功”){
response.content='无法访问网络';
log(JSON.stringify(response));
幻影。出口(1);
}否则{
幻影。出口(1);
}
});
注意:我知道CasperJS更适合这种用例,但是在我当前的环境中,我不得不使用PhantomJS

  • 根据,您需要使用
    page.event.key.Enter
    而不是字符串
    'Enter'

  • page.evaluate()
    是沙盒页面上下文。它无法访问外部定义的变量,这些变量包括
    page
    phantom
    。因此,必须将
    page.sendEvent()
    调用移到外部

  • 然后,您应该在执行操作之前注册回调,否则将调用错误的
    onUrlChanged
    回调。如果实际加载了新页面,则应使用
    onLoadFinished
    而不是
    onUrlChanged

  • 当有CSS选择器时,不要使用循环

  • onUrlChange
    在URL更改时触发,这并不意味着页面已加载。使用
    onLoadFinished
    等待页面加载(不包括动态JS)。另外,带有回调的
    page.open()
    与将回调注册到
    onLoadFinished
    并在没有回调的情况下调用
    page.open()
    相同

  • 最终完整代码:

    var page  = require('webpage').create(),
        response = {};
    page.open('http://www.mysearch.com/', function(status) {
        if (status !== 'success') {
            response.content = 'Unable to access network';
            console.log(JSON.stringify(response));
            phantom.exit(1);
        }
        var exists = page.evaluate(function() {
            var input = document.querySelector('input[type*="search"]');
            if (input) {
                input.value = 'cat dog';
                input.focus();
            }
            return !!input;
        });
        page.onLoadFinished = function(status) { // Search result loaded
            console.log("new page loaded with status: " + status);
            phantom.exit();
        };
        if (exists) {
            page.sendEvent('keypress', page.event.key.Enter);
        } else {
            console.log("field not found");
        }
    };
    
  • 根据,您需要使用
    page.event.key.Enter
    而不是字符串
    'Enter'

  • page.evaluate()
    是沙盒页面上下文。它无法访问外部定义的变量,这些变量包括
    page
    phantom
    。因此,必须将
    page.sendEvent()
    调用移到外部

  • 然后,您应该在执行操作之前注册回调,否则将调用错误的
    onUrlChanged
    回调。如果实际加载了新页面,则应使用
    onLoadFinished
    而不是
    onUrlChanged

  • 当有CSS选择器时,不要使用循环

  • onUrlChange
    在URL更改时触发,这并不意味着页面已加载。使用
    onLoadFinished
    等待页面加载(不包括动态JS)。另外,带有回调的
    page.open()
    与将回调注册到
    onLoadFinished
    并在没有回调的情况下调用
    page.open()
    相同

  • 最终完整代码:

    var page  = require('webpage').create(),
        response = {};
    page.open('http://www.mysearch.com/', function(status) {
        if (status !== 'success') {
            response.content = 'Unable to access network';
            console.log(JSON.stringify(response));
            phantom.exit(1);
        }
        var exists = page.evaluate(function() {
            var input = document.querySelector('input[type*="search"]');
            if (input) {
                input.value = 'cat dog';
                input.focus();
            }
            return !!input;
        });
        page.onLoadFinished = function(status) { // Search result loaded
            console.log("new page loaded with status: " + status);
            phantom.exit();
        };
        if (exists) {
            page.sendEvent('keypress', page.event.key.Enter);
        } else {
            console.log("field not found");
        }
    };
    
  • 根据,您需要使用
    page.event.key.Enter
    而不是字符串
    'Enter'

  • page.evaluate()
    是沙盒页面上下文。它无法访问外部定义的变量,这些变量包括
    page
    phantom
    。因此,必须将
    page.sendEvent()
    调用移到外部

  • 然后,您应该在执行操作之前注册回调,否则将调用错误的
    onUrlChanged
    回调。如果实际加载了新页面,则应使用
    onLoadFinished
    而不是
    onUrlChanged

  • 当有CSS选择器时,不要使用循环

  • onUrlChange
    在URL更改时触发,这并不意味着页面已加载。使用
    onLoadFinished
    等待页面加载(不包括动态JS)。另外,带有回调的
    page.open()
    与将回调注册到
    onLoadFinished
    并在没有回调的情况下调用
    page.open()
    相同

  • 最终完整代码:

    var page  = require('webpage').create(),
        response = {};
    page.open('http://www.mysearch.com/', function(status) {
        if (status !== 'success') {
            response.content = 'Unable to access network';
            console.log(JSON.stringify(response));
            phantom.exit(1);
        }
        var exists = page.evaluate(function() {
            var input = document.querySelector('input[type*="search"]');
            if (input) {
                input.value = 'cat dog';
                input.focus();
            }
            return !!input;
        });
        page.onLoadFinished = function(status) { // Search result loaded
            console.log("new page loaded with status: " + status);
            phantom.exit();
        };
        if (exists) {
            page.sendEvent('keypress', page.event.key.Enter);
        } else {
            console.log("field not found");
        }
    };
    
  • 根据,您需要使用
    page.event.key.Enter
    而不是字符串
    'Enter'

  • page.evaluate()
    是沙盒页面上下文。它无法访问外部定义的变量,这些变量包括
    page
    phantom
    。因此,必须将
    page.sendEvent()
    调用移到外部

  • 然后,您应该在执行操作之前注册回调,否则将调用错误的
    onUrlChanged
    回调。如果实际加载了新页面,则应使用
    onLoadFinished
    而不是
    onUrlChanged

  • 当有CSS选择器时,不要使用循环

  • onUrlChange
    在URL更改时触发,这并不意味着页面已加载。使用