решаемые см ответ ниже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?), но он не работает.
Любая идея очень приветствуется. Благодаря!
Мне просто интересно, если вы используете селен, почему бы просто не взаимодействовать со страницей, как обычный пользователь, вместо того, чтобы вручную запускать событие. Например, почему бы не моделировать поведение пользователя, которое вызывает события на основе взаимодействия с элементами dom? –
Привет Крис! Я попробовал self.selenium.find_elements_by_class_name («MyInput») [0] .click(). Проблема в том, что я не знаю, как писать текст на входе. – Raphael