关于我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();
}
}
但由于我不能使用硒(由于项目的要求),我不得不使用 Cefsharp 。
因此,如果有人知道如何在vanilla javascript中执行 selenium&#34; sendKeys&#34; 方法,请帮助我。
感谢。
答案 0 :(得分:1)
此解决方案对我有用:
element.dispatchEvent(new InputEvent('textInput', {data: keyChar, bubbles: true}));
其中 element 是可编辑的div,而 keyChar 当然是关键字符;)
答案 1 :(得分:0)
我有一个java代码,可以使用JavascriptExecutor执行sendKeys: -
System.setProperty("webdriver.chrome.driver","E:\\Selenium\\Workplace\\Selenium\\src\\libs\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("https://www.google.co.in/");
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
WebElement dd= driver.findElement(By.xpath("//input[@id='lst-ib' and @name='q']"));
JavascriptExecutor rightexecutor = (JavascriptExecutor)driver;
rightexecutor.executeScript("arguments[0].setAttribute('value','yahoo')", dd);
替换上面JavascriptExecutor
代码中的定位器(即xpath)并将其转换为您的javascript。
OR
我找到了解决方案
private void OnIsBrowserInitializedChanged(object sender,
IsBrowserInitializedChangedEventArgs args)
{
if(args.IsBrowserInitialized)
{
browser.ExecuteScriptAsync("alert('test');");
}
}
来源: -
检查一下。它有很多方法: -
https://github.com/cefsharp/CefSharp/wiki/Frequently-asked-questions
希望它会对你有所帮助:)。
答案 2 :(得分:0)
我通过这样做能够获得良好的结果
input [0]. textContent = "my text";