【问题标题】:Unable to send keys to div element Selenium - Java无法将密钥发送到 div 元素 Selenium - Java
【发布时间】:2018-09-30 08:03:05
【问题描述】:

您好,我正在尝试使用 xpath 将值填充到文本框(检查下图)。

Actions actions = new Actions(driver);
                                        actions.moveToElement(driver.findElement(By.xpath("//*[@class='CzI8E']")));
                                        actions.click();
                                        Thread.sleep(3000);
                                        actions.moveToElement(driver.findElement(By.xpath("//*[@class='_2S1VP copyable-text selectable-text']")));//_2S1VP copyable-text selectable-text
                                        actions.sendKeys(WhatsappConstants.TEXT_MESSAGE);
                                        actions.build().perform();

但是我遇到了这个异常

org.openqa.selenium.WebDriverException: unknown error: ChromeDriver only supports characters in the BMP

其他 stackoverflow 答案说使用 firefox 驱动程序,但在我的情况下,我需要你只使用 chrome。

【问题讨论】:

  • 我在 dom 层次结构中看不到任何文本框。也许您需要先单击您关注的 div,然后它会在那里注入一个文本框 - 只是一个猜测。
  • @SiddhantSwami 如果你看到我上面的代码,我已经点击了元素
  • 用相关的HTML更新问题
  • 可以分享一下网址吗?
  • WhatsappConstants.TEXT_MESSAGE 的值是多少?它是否包含任何非 unicode 符号(中文、俄文字母、表情符号等)?

标签: java selenium selenium-chromedriver


【解决方案1】:

这是 Chrome 驱动程序的一个已知限制,请参阅 http://crbug.com/chromedriver/2269 以获取官方错误跟踪器中的错误报告。

您可以做的只是将自己限制为支持的字符,基本上来自:http://www.columbia.edu/kermit/ucs2.html

或者,您可以模拟输入,而不是使用前端 JS sn-p 真正发送键,如下所示:

(function (element, text) {
    Array.prototype.forEach.call(text, function (char) {
        element.value += char;
        element.dispatchEvent(new KeyboardEvent("keydown"));
        element.dispatchEvent(new KeyboardEvent("keypress"));
        element.dispatchEvent(new KeyboardEvent("input"));
        element.dispatchEvent(new KeyboardEvent("keyup"));
    });
}).apply(null, arguments);

然后您使用JavascriptExecutor 拨打电话:

((JavascriptExecutor) driver).executeScript(JS_CODE, element, text);

sn-p 适用于具有可写.value 属性的元素,它可以扩展为支持contenteditable 元素。

请注意,事件的字段已设置为默认值,包括键码等,请参阅https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/KeyboardEvent 此外,您可能还需要添加要触发的其他事件以更好地模拟用户输入。

【讨论】:

  • "它可以扩展为支持 contenteditable 元素。" - 如何?
  • @Gal Bracha:TBH,我不记得了,我想更改innerHTML 就足够了,但人们可能会考虑换行(例如,除非white-space CSS 属性,否则执行<br>s设置为某些非标准值)并巧妙地包装元素(例如<p>)。如果您有一个特定的用例,这是一个问题,那么恕我直言,它可能值得提出自己的问题。
  • 我设法做到了 -> stackoverflow.com/a/60485967/395804
【解决方案2】:

我有一个类似的问题,我用这种方式解决了它。 首先,你应该用JavascriptExecutor 向这个div添加任何文本,然后清除这个文本并使用selenium的sendKeys方法

WebElement inputDiv = driver.findElement(By.xpath("your_path_to_div"));
JavascriptExecutor executor = (JavascriptExecutor) driver;
executor.executeScript("document.querySelector('your_selector_to_div').innerText='aaa'");

inputDiv.clear();
inputDiv.sendKeys(subject);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    • 2016-04-23
    • 2020-09-22
    • 2020-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多