2015-01-19 2 views
2

Я недавно начал изучать CasperJS, и я пытаюсь войти на YouTube. Вот мой текущий код:Невозможно получить доступ к переменным из функции thenEvaluate() в CasperJS

// XPathSignInButton is predefined 
var Username = 'user123'; 
var Password = 'pass123'; 

casper.waitForSelector(xPathSignInButton, function() { 
    this.thenEvaluate(function() { 
     $('#Email').val(Username); 
     $('#Passwd').val(Password); 
    }); 
}); 

Код выше не манипулирует полей ввода (не писать в них), однако, если я заменю thenEvaluate() с this.fillSelectors() переменные доступны, как правило, и все выполняет отлично:

// XPathSignInButton is predefined 
// signInFormSelector is predefined 
casper.waitForSelector(xPathSignInButton, function() { 
    this.fillSelectors(signInFormSelector, { 
     'input[name="Email"]': Username, 
     'input[name="Passwd"]': Password 
    }); 
}); 

Сначала я подумал, что возникла проблема с тем, как я назвал jQuery, но когда я заменил переменные фактическими строками типа: $('#Email').val('user123'); и $('#Email').val('pass123'); - он работал как шарм.

Мой вопрос: как получить доступ к переменным из функции thenEvaluate(). Возможно ли это?

+1

В стороне: вы можете использовать 'evaluation()' здесь вместо 'thenEvaluate()'. Кроме того, предпочитайте 'fill()' функции над 'оценкой()' (это избавляет вас от необходимости выполнять дополнительную работу, показанную в ответе Artjom, для начала). –

ответ

5

Внутри evaluate - это контекст с песочницей. Вы не можете использовать переменные извне (и наоборот), вы должны явно передать их:

casper.thenEvaluate(function(username, password) { 
    $('#Email').val(username); 
    $('#Passwd').val(password); 
}, Username, Password); 

Важно также отметить, что (от here):

Примечание: аргументы и возвращаемое значение функции оценки должны быть простым примитивным объектом. Эмпирическое правило: если оно может быть сериализовано через JSON, тогда это нормально.

Закрытие, функции, узлы DOM и т. Д. Не сработают!