如何在contenteditable div上模拟打字?

时间:2017-08-26 15:04:13

标签: javascript selenium-webdriver web-scraping selenium-chromedriver cefsharp

关于我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; 方法,请帮助我。

感谢。

3 个答案:

答案 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');");
    }
}

来源: -

cefsharp execute javascript

检查一下。它有很多方法: -

https://github.com/cefsharp/CefSharp/wiki/Frequently-asked-questions

希望它会对你有所帮助:)。

答案 2 :(得分:0)

我通过这样做能够获得良好的结果

input [0]. textContent = "my text";