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