我正在使用casper.open
加载包含一些帖子数据的网址。
我需要解析html以从html获取用户ID并插入js代码,在html评估之前将window.name
设置为该ID。
我在url加载后无法执行此操作,因为如果未设置带有ID的window.name,则会将其重定向到anorher url(通过js)。
casper.open('http://example.com', {
method: 'post',
data:{
'somefield': 'somevalue',
},
});
更新:
我已经成功在js重定向之前获取了页面html,禁用js casper.options.pageSettings.javascriptEnabled = false;
将其放在casper.start()
之前,但是js在其他每一步都保持禁用状态。
我可以在步骤中启用/禁用js吗?
这是我的代码:
casper.start().then(function () {
// some work
}).then(function () {
// Disable js
this.options.pageSettings.javascriptEnabled = false;
}).then(function () {
// POST call
casper.open('http://example.com', {
method: 'post',
data: {
'field': 'value'
}
});
}).then(function () {
// Enable js
this.options.pageSettings.javascriptEnabled = true;
}).then(function () {
var content = this.page.content;
var changedContent = content.replace("some text", "with text");
this.page.setContent(changedContent, this.getCurrentUrl());
});
来自phantomjs文档:
这些设置仅适用于对page.open的初始调用 功能。设置对象的后续修改将不会 任何影响。
答案 0 :(得分:3)
您可以挂钩到表示initialization of the page的事件(PhantomJS event周围的包装器):
casper.on("page.initialized", function(){
this.evaluate(function(){
window.name = "whatever";
});
});
casper.start(url).run();
如果您确实需要访问该页面,则可以注册"page.resource.requested"
事件并使用casper.open
加载该页面。通过此事件,您可以中止重定向请求等请求。由于重定向发生在同一个URL,因此您必须找到区分第一个请求和第二个请求到该URL的不同方法。例如:
var firstUrlRequestDone = false;
var url = "some url";
casper.on("page.resource.requested", function(requestData, request) {
if (requestData.url.indexOf(url) === 0) {
if (!firstUrlRequestDone)
firstUrlRequestDone = true;
else
request.abort();
}
});
casper.start()
.thenOpen(url)
.thenEvaluate(function(){
// TODO: read DOM and change window.name
})
.thenOpen(url)
.run();
或者,我可以在上一步中禁用页面JavaScript并在下一步启用它吗?
不,您需要启用JavaScript才能访问和更改DOM。但是,您可以停用JavaScript,加载页面,更改页面(通过replace
),重新启用JavaScript和load the page from the changed string。
示例:
casper.options.pageSettings.javascriptEnabled = false;
var changedContent, actualURL;
casper.start(url)
.then(function(){
var content = this.page.content;
changedContent = content.replace("something", "with something");
actualURL = this.getCurrentUrl();
this.page.settings.javascriptEnabled = true;
})
.thenOpen("http://example.com") // this is a dummy page to force re-evaluation of `page.settings`
.then(function(){
this.page.setContent(changedContent, actualURL);
})
.then(function(){
// TODO: do whatever you need
})
.run();
答案 1 :(得分:0)
如果要从按钮中删除已禁用的属性,请尝试此
document.querySelector('#btnLogin').removeAttribute('disabled');