2014-11-12 3 views
0

Я работаю на веб-странице, где загружается jquery, и на веб-странице есть поле ввода, которое поддерживает автоматическое завершение, поэтому после ввода нескольких символов появляется окно выбора предложений. С помощью консоли средства разработки, я могу быть в состоянии силой, что список предложений, которые будут созданы и быть появились по требованию, выполняя следующие функции Jquery (в браузере консоли):Фокус на входе с помощью jQuery

$('input#PrincipalPolicyHolder_EmploymentOccupationDescription').val("soft"); 

setTimeout(function() { $('input#PrincipalPolicyHolder_EmploymentOccupationDescription').focus(); }, 5000); 

setTimeout(function() { $('input#PrincipalPolicyHolder_EmploymentOccupationDescription').keyup(); }, 6000); 

Задержка необходима для меня для смены фокуса на окно с консоли. Эти команды jQuery достаточно, чтобы получить $('#PrincipalPolicyHolder_EmploymentOccupationDescription').is('focus') true, что необходимо для создания списка предложений, если я не нажимаю на другое место.

Однако эти же действия не работают в среде casperjs. Вот как я выполняю;

casper.then(function() { 
    this.evaluate(function() { 
     $('input#PrincipalPolicyHolder_EmploymentOccupationDescription').val("soft"); 
     $('input#PrincipalPolicyHolder_EmploymentOccupationDescription').focus(); 
     $('input#PrincipalPolicyHolder_EmploymentOccupationDescription').keyup(); 
    }); 
}); 

Я также попытался использовать SendKeys с keepFocus: true, но никогда не получал is(':focus') чек положительный. Есть ли способ сделать это?

Edit: я сузили проблему работать на очень простой веб-страницы, Вот фрагмент кода, который фиксирует вопрос:

var casper = require('casper').create({ 
    verbose: true, 
    loglevel: "debug" 
}); 

casper.start('http://jsfiddle.net/vhermL99/embedded/result/'); 

casper.on('remote.message', function(msg) { 
    this.echo('remote message caught: ' + msg); 
}); 

casper.withFrame(0, function() { 
    casper.thenEvaluate(function() { 
    var input = $('#input1'); 
    input.val("value set by jquery"); 
    input.focus(); 
    console.log("is input focussed: " + input.is(':focus')); 
    }); 
    casper.then(function() { 
    this.capture('before-sendkey.png'); 
    }); 
    casper.then(function() { 
    casper.sendKeys('#input1', 'value set by sendKeys', {'reset': true, 'keepFocus': true}); 
    }); 
    casper.thenEvaluate(function() { 
    console.log("is input focussed: " + $('#input1').is(':focus')); 
    }); 
    casper.then(function() { 
    this.capture('before-sendkey.png'); 
    }); 

}); 

casper.run(); 

ожидание оказывает .is(':focus') истинное в одном из двух способов.

ответ

1

Вы можете сделать то же самое в CasperJS, что и в консоли браузера. Вам нужно только знать, что вы выходите из потока управления CasperJS при запуске асинхронных процессов в контексте страницы. Таким образом, вам нужно ждать результатов в контексте casper, потому что теперь у вас есть два потока управления.

casper.thenEvaluate(function() { 
    $('input#PrincipalPolicyHolder_EmploymentOccupationDescription').val("soft"); 

    setTimeout(function() { 
     $('input#PrincipalPolicyHolder_EmploymentOccupationDescription').focus(); 
    }, 5000); 

    setTimeout(function() { 
     $('input#PrincipalPolicyHolder_EmploymentOccupationDescription').keyup(); 
    }, 6000); 
}); 
casper.wait(10000, function(){ 
    // waited 10 seconds, so do something with the autocomplete result 
}); 

Вы также можете попробовать его с родной PhantomJS sendEvent функции:

casper.then(function() { 
    this.evaluate(function(){ 
     var el = document.querySelector('input#PrincipalPolicyHolder_EmploymentOccupationDescription'); 
     el.focus(); 
    }); 
    this.page.sendEvent('keypress', 'soft'); 
}); 
casper.wait(10000, function(){ 
    // waited 10 seconds, so do something with the autocomplete result 
}); 
+0

Я добавил casperjs.wait, но не работал. Проблема в том, что даже вы удаляете функции setTimeout() (откровенно говоря, я не мог понять, почему вы поместили их в контексте CasperJS) и сразу же выполните jquery focus(), а '' 'is (': focus')' '' check, вы увидите, что проверка фокуса никогда не верна. – sardok

+0

Независимо от того, сфокусирован ли вход или нет, открылись ли предложения автозаполнения? Также как вы можете проверить, что что-то произошло на странице? Вы делаете скриншот или полагаетесь только на этот тест 'is (': focus')' test? –

+0

Автозаполнение не работает, потому что функция автозаполнения проверяет на '' 'is (': focus')' '' на элемент. Автозаполнение заполняет список, и функция CasperJS ожидает этого списка. Кроме того, я делаю скриншот, и кажется, что элемент сфокусирован (кроме факта, что я не вижу курсора, хотя я не уверен, что я должен видеть). Интересно, что точно такие же инструкции jquery работают на консоли, но по какой-то причине не работают при запуске CasperJS. – sardok

0

это не является хорошей идеей всех, чтобы установить время ожидания.

Учитывая, что вы используете новейшую версию CasperJS, лучше использовать метод waitFor utility: http://casperjs.readthedocs.org/en/latest/modules/casper.html?highlight=waitfor#waitfor.

Кроме того, вы можете эмулировать поведение для ввода типа ввода текста с помощью метода sendKeys: http://casperjs.readthedocs.org/en/latest/modules/casper.html?highlight=waitfor#sendkeys.

С уважением,

+0

Я упомянул, что sendKeys никогда не работал для меня в этом случае. – sardok

+0

Должен работать: https://github.com/n1k0/casperjs/blob/master/modules/casper.js#L1598. Вы пытались разделить свой процесс на многие утверждения '' then''? Возможно, jQuery вызывается перед вызовом sendKeys casperJS. –

+0

См. Последнюю часть моего первого сообщения. – sardok

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