ChromeDriver仅在BMP错误中支持字符,而将带有Selenium Python的ChromeDriver Chrome发送表情符号到Tkinter的label()文本框

时间:2019-12-02 12:20:41

标签: python selenium google-chrome selenium-chromedriver emoji

我正在自动化whatsapp消息,并希望通过tkinter窗口发送出去。在此tkinter窗口中,我借助.label()创建了一个消息框,并能够通过硒连接到whatsapp网站。

当前,我已经可以发送消息了,但是没有表情符号。包含表情符号时,出现此错误“ Chromedriver仅支持BMP中的字符”。如何添加表情符号?

3 个答案:

答案 0 :(得分:2)

此错误消息...

selenium.common.exceptions.WebDriverException: Message: unknown error: ChromeDriver only supports characters in the BMP

...表示 ChromeDriver 无法通过send_keys()方法发送表情符号信号。

ChromeDriver only supports characters in the BMP Chromium 团队的一个已知问题,因为{em> ChromeDriver 在FFFF之后仍然不支持Unicode字符。因此,无法通过ChromeDriver发送FFFF之后的任何字符。结果,任何尝试发送 SMP 字符(例如 CJK Emojis Symbols 等)的尝试都会引发错误


替代

可能的替代方法是使用 GeckoDriver / Firefox

  • 代码块:

    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
    driver = webdriver.Firefox(executable_path=r'C:\Utility\BrowserDrivers\geckodriver.exe')
    driver.get('https://www.google.com/')
    # Chineese Character
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.NAME, "q"))).send_keys("?")
    # Emoji Character
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.NAME, "q"))).send_keys("?")
    
  • 浏览器快照:

Emoji

您可以在OpenQA.Selenium.WebDriverException: 'unknown error: ChromeDriver only supports characters in the BMP while sending an emoji through C# Selenium

中找到相关的讨论

参考

Issue 2269: Impossible to add special characters with a unicode after FFFF


Outro

一些链接:

答案 1 :(得分:2)

对于那些想在Chrome上发送表情符号的人

解决方案

    async sendKeysWithEmojis(element, text) {
        const script = `var elm = arguments[0],
        txt = arguments[1];elm.value += txt;
        elm.dispatchEvent(new Event('keydown', {bubbles: true}));
        elm.dispatchEvent(new Event('keypress', {bubbles: true}));
        elm.dispatchEvent(new Event('input', {bubbles: true}));
        elm.dispatchEvent(new Event('keyup', {bubbles: true}));`;
        await this.driver.executeScript(script, element, text);
    }

这样称呼

const element = await this.driver.findElement(selector);
await sendKeysWithEmojis(element, '?? This one shall pass ??');

这是怎么回事? 我们正在使用事件模拟本地按键

请注意,{bubbles: true}是可选的(由于复杂的包装输入,我需要这样做)

答案 2 :(得分:2)

它对我有用:

from selenium import webdriver

JS_ADD_TEXT_TO_INPUT = """
  var elm = arguments[0], txt = arguments[1];
  elm.value += txt;
  elm.dispatchEvent(new Event('change'));
  """

browser = webdriver.Chrome('C:\\Python37\\chromedriver.exe')
browser.get("https://google.com/")
elem = browser.find_element_by_name('q')

text = "? ? " + u'\u2764'

browser.execute_script(JS_ADD_TEXT_TO_INPUT, elem, text)

enter image description here