2016-02-25 3 views
0

решаемые см ответ нижеReact - Селен тесты

я испытываю Реагировать приложение с селеном.

Мне нужно изменить значение поля ввода, которое связано с состоянием объекта. В коротких (соответствующие части кода), изменение этого входа позволяет это значение быть занесена только если оно не пусто:

# react object 

render: function(){ 

    <input ... onChange={this.handleTextChange} className="myInput" /> 

    <button onClick={this.handleSubmit}>Submit</button> 
}, 

handleTextChange: function(e) { 
    this.setState({text: e.target.value}); 
}, 

handleSubmit: function() { 
    if(this.state.text.length > 0) { 
    // relevant code that is never executed 
    // because although we change the value of the input, the state does not update 
    } 
}, 

код работает, но я не могу найти способ, чтобы проверить это, потому что я не могу найти любую js-манипуляцию, которая будет обновлять входной сигнал AND и отражать его в состоянии объекта. Я попытался следующие решения

# value update 
self.selenium.execute_script("var input = document.querySelectorAll('input.myInput')[0]; form.value = 'New message!'"); 

Слово "Новое сообщение! фактически появляется на входе, но не обновляет состояние объекта. Затем я попытался сосредоточиться на входе и вызывая KeyUp событие, без успеха

# try focus and keyUp 
# source https://stackoverflow.com/questions/596481/simulate-javascript-key-events 
self.selenium.execute_script(""" 
var form = document.querySelectorAll("input.messageFormInput")[0]; 
form.focus(); 
var keyboardEvent = document.createEvent("KeyboardEvent"); 
var initMethod = typeof keyboardEvent.initKeyboardEvent !== 'undefined' ? "initKeyboardEvent" : "initKeyEvent"; 
keyboardEvent[initMethod](
       "keydown", // event type : keydown, keyup, keypress 
       true, // bubbles 
       true, // cancelable 
       window, // viewArg: should be window 
       false, // ctrlKeyArg 
       false, // altKeyArg 
       false, // shiftKeyArg 
       false, // metaKeyArg 
       40, // keyCodeArg : unsigned long the virtual key code, else 0 
       0 // charCodeArgs : unsigned long the Unicode character associated with the depressed key, else 0 
); 
document.dispatchEvent(keyboardEvent); 
""") 

Я попробовал то же самое решение с JQuery, как описано здесь (Is it possible to simulate key press events programmatically?), но он не работает.

Любая идея очень приветствуется. Благодаря!

+0

Мне просто интересно, если вы используете селен, почему бы просто не взаимодействовать со страницей, как обычный пользователь, вместо того, чтобы вручную запускать событие. Например, почему бы не моделировать поведение пользователя, которое вызывает события на основе взаимодействия с элементами dom? –

+1

Привет Крис! Я попробовал self.selenium.find_elements_by_class_name («MyInput») [0] .click(). Проблема в том, что я не знаю, как писать текст на входе. – Raphael

ответ

1

Мой плохо, я не был осведомлен о

self.selenium.find_elements_by_class_name('myClass')[0].send_keys("hello") 

Который на самом деле решает эту проблему. Спасибо Крису Хоуксу за то, что он послал меня в правильном направлении.

+1

Это решение спасло мой день. Спасибо за публикацию !! –

+0

Рад, что это помогает! – Raphael

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