解决,请参阅下面阵营 - Selenium测试
答案,我测试应用程序做出反应硒。
我需要更改输入字段的值,该字段链接到对象的状态。总之(代码的相关部分),在此输入的改变使得它的价值将只有submited如果它不是空的:
# 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
}
},
代码工作,但我不能找到一种方法来测试它,因为我不能找到任何更新输入AND并反映在对象状态中的js操作。 我试过以下解决方案
# value update
self.selenium.execute_script("var input = document.querySelectorAll('input.myInput')[0]; form.value = 'New message!'");
单词'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