Итак, у меня есть этот код ...CasperJS странных оценки поведения
var config = require('./config.js');
var casper = require('casper').create(config.casper);
casper.on("page.error", function(msg, trace) {
this.echo("Page Error: " + msg, "ERROR");
});
casper.on('remote.message', function(msg) {
this.echo('remote message caught: ' + msg);
});
function run() {
casper.start();
casper.thenOpen('https://twitter.com', function() {
if (this.exists('form[action="https://twitter.com/sessions"].signin')) {
this.echo('logging in...');
this.evaluate(function (username, password) {
document.querySelector('#signin-email').value = username;
document.querySelector('#signin-password').value = password;
document.querySelector('.flex-table-btn').click();
}, config.users.user.twitter.username, config.users.user.twitter.password);
} else {
this.echo('Alreaddy logged in, proceed...');
}
});
casper.waitForSelector('#tweet-box-mini-home-profile', function() {
if (this.exists('#tweet-box-mini-home-profile')) {
this.evaluate(function (text) {
document.querySelector('div#tweet-box-mini-home-profile.tweet-box.rich-editor.notie').innerText = text;
document.querySelector('button.btn.primary-btn.tweet-action.js-tweet-btn').click();
}, 'Test using automation');
this.wait(10000, function() {
this.echo ('Finished waiting, closing app now');
}); //wait for 10 seconds before closing
} else {
this.echo('Failed to logging in');
}
});
casper.run();
}
run();
Каротаж в части работает просто отлично, я мог войти в на приборную панель.
Но второй шаг, шаг чирикают выдаст ошибку
Page Error: TypeError: 'null' is not an object (evaluating 'document.querySelector('div#tweet-box-mini-home-profile.tweet-box.rich-editor.notie').innerText = text')
и чириканье не был размещен. Я пробовал его вручную в браузере, и он работает нормально.
var config = require('./config.js');
var casper = require('casper').create(config.casper);
casper.on('remote.message', function(msg) {
this.echo('remote message caught: ' + msg);
});
casper.on("page.error", function(msg, trace) {
this.echo("Page Error: " + msg, "ERROR");
});
function run() {
casper.start();
casper.thenOpen('https://twitter.com', function() {
if (this.exists('form[action="https://twitter.com/sessions"].signin')) {
this.echo('logging in...');
this.evaluate(function (username, password) {
document.querySelector('#signin-email').value = username;
document.querySelector('#signin-password').value = password;
document.querySelector('.flex-table-btn').click();
}, config.users.dida.twitter.username, config.users.dida.twitter.password);
} else {
this.echo('Alreaddy logged in, proceed...');
}
});
casper.waitForSelector('#tweet-box-mini-home-profile', function() {
if (this.exists('#tweet-box-mini-home-profile')) {
this.evaluate(function (text) {
console.log('=========== Putting text ============');
document.querySelector('#tweet-box-mini-home-profile > div').innerHTML = text;
}, 'Test using automation');
} else {
this.echo('Failed to logging in');
}
});
casper.then(function() {
if (this.exists('.js-tweet-btn')) {
//recheck the tweet
this.echo(this.getHTML('#tweet-box-mini-home-profile'));
this.echo('============= Clicking Submit Button ==============');
this.click('.js-tweet-btn');
this.wait(10000, function() {
this.echo ('Finished waiting, closing app now');
}); //wait for 10 seconds before closing
} else {
this.echo('Submit button not found');
}
})
casper.run();
}
run();
это работает, но это только чирикать: «Написать новый твит» как если текст не изменится.
Итак, мой вопрос: я сделал что-то неправильно или это какая-то ошибка? Если да, то это обходной путь? Заранее спасибо.
'fillSelectors' и его друзья хорошо работают только на формах, которые не имеют пользовательского поведения JavaScript. Многие формы имеют дополнительные функциональные возможности, которые требуют отправки «изменений», «keyup», «click», «events» на его элементах. – rusln