【发布时间】:2018-02-04 09:50:33
【问题描述】:
继我在thread 提出的问题之后,现在我遇到了一个关于如何模拟输入 contenteditable div 的问题。
div标签如下:
<div tabindex="-1" class="input-emoji">
<div class="input-placeholder" style="visibility: visible;">Type a message</div>
<div class="input" contenteditable="true" data-tab="1" dir="auto" spellcheck="true"></div>
</div>
为了模拟打字,我的js代码如下:
setTimeout(() => {
try {
let inputContainerEl = chatPanelEl[0].getElementsByClassName('input-container');
let input = inputContainerEl[0].getElementsByClassName('input');
let message = 'Something to type';
console.log('MESSAGE: ' + message);
let chars = message.split('');
for (let n = 0; n < chars.length; n++) {
let charCode = chars[n].charCodeAt(0);
console.log('CHAR: ' + chars[n] + ' => CODE: ' + charCode);
let keypressEvent = document.createEvent('KeyboardEvent');
keypressEvent.initKeyboardEvent('keypress', true, true, window, false, false, false, false, charCode, charCode);
input[0].dispatchEvent(keypressEvent);
let keydownEvent = document.createEvent('KeyboardEvent');
keydownEvent.initKeyboardEvent('keydown', true, true, window, false, false, false, false, charCode, charCode);
input[0].dispatchEvent(keydownEvent);
let keyupEvent = document.createEvent('KeyboardEvent');
keyupEvent.initKeyboardEvent('keyup', true, true, window, false, false, false, false, charCode, charCode);
input[0].dispatchEvent(keyupEvent);
}
} catch(err) {
console.log('ERROR: ' + err);
}
}, 1000);
我已经在这里检查了一些线程,关于从 vanilla javascript 执行 keydown、keypress 和 keyup 事件。但似乎没有任何效果。
我尝试使用基于 selenium 的解决方案,效果非常好(阅读下面的代码)
public void run() {
try {
WebElement container = driver.findElement(By.className("input-container"));
if (container != null) {
WebElement input = container.findElement(By.className("input"));
if (input != null) {
input.sendKeys("ECHO: " + this.echo);
Thread.sleep(2000);
WebElement submitBtn = driver.findElement(By.className("compose-btn-send"));
if (submitBtn != null) {
submitBtn.click();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
但由于我不能使用 selenium(由于项目的要求),我不得不改用 Cefsharp。
所以如果有人知道如何在原版 javascript 中执行 selenium "sendKeys" 方法,请帮助我。
谢谢。
【问题讨论】:
-
您是否只想获取/设置
contenteditablediv的内容?像document.getElementById("input").innerHTML或document.getElementById("input").textContent这样的东西会做到这一点。这两个示例都是您也可以分配的属性。还是必须是关键事件? -
是的......但我需要触发按键,以便提交按钮可以出现......顺便说一句,它是一个whatsapp网络,我不能只使用innerText或附加文本...... . 你需要模拟打字...
标签: javascript selenium-webdriver web-scraping selenium-chromedriver cefsharp