2013-12-15 2 views
1

Итак, у меня есть этот код ...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(); 

это работает, но это только чирикать: «Написать новый твит» как если текст не изменится.

Итак, мой вопрос: я сделал что-то неправильно или это какая-то ошибка? Если да, то это обходной путь? Заранее спасибо.

ответ

0

Прежде всего, используйте методы fillSelectors() или fillXPath() для заполнения форм.

И убедитесь, что селектор «div # tweet-box-mini-home-profile.tweet-box.rich-editor.notie» является правильным.

+0

'fillSelectors' и его друзья хорошо работают только на формах, которые не имеют пользовательского поведения JavaScript. Многие формы имеют дополнительные функциональные возможности, которые требуют отправки «изменений», «keyup», «click», «events» на его элементах. – rusln

Смежные вопросы