Chromedriver only supports characters in the BMP error while sending Emoji with ChromeDriver Chrome using Selenium Python to Tkinter's label() textbox
Asked Answered
S

8

22

I am automating whatsapp messages and would like to send them out through a tkinter window. In this tkinter window I have created a message box with the help of .label() and I am able to connect to whatsapp web through selenium.

Currently, I am able to send out messages already, but without emojis. When I include emojis, I get this error "Chromedriver only supports characters in the BMP". How can I include emojis?

Sapir answered 2/12, 2019 at 12:20 Comment(1)
Which emoji did you try? – Purgatorial
O
19

This works (tested at 2023-12-25)

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("xpath", "//textarea[@name='q']")

text = "🌎 🌊 " + u'\u2764'

browser.execute_script(JS_ADD_TEXT_TO_INPUT, elem, text)

enter image description here

Obala answered 5/4, 2020 at 13:35 Comment(3)
I tried this method, in my case elem is browser.find_elements_by_css_selector("div[role='presentation'] div[role='textbox']") but when I run browser.execute_script(JS_ADD_TEXT_TO_INPUT, elem, text) nothing happens... could you help? Thanks. (the site I'm on is facebook, in particular I'm trying to enter emoji in the post editor) – Pigweed
sound wave, are you try send just text? With text it works ok? And what version of webdriver you use? – Obala
This is not working anymore, What is new Event('change') ? Is there a possibility that it has been changed ? – Donate
B
12

This error message...

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

...implies that the ChromeDriver was unable to send the emoji signal through send_keys() method.

ChromeDriver only supports characters in the BMP is a known issue with Chromium team as ChromeDriver still doesn't support characters with a Unicode after FFFF. Hence it is impossible to send any character beyond FFFF via ChromeDriver. As a result any attempt to send SMP characters (e.g. CJK, Emojis, Symbols, etc) raises the error.


Alternative

A potential alternative would be to use GeckoDriver / Firefox.

  • Code Block:

    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("πŸ’©")
    
  • Browser Snapshot:

Emoji

You can find a relevant discussion in OpenQA.Selenium.WebDriverException: 'unknown error: ChromeDriver only supports characters in the BMP while sending an emoji through C# Selenium


Outro

A few links:

Birchfield answered 2/12, 2019 at 13:15 Comment(2)
This solved my problem, thank you so much! Simply changing from chromedriver -> geckodriver and google chrome -> firefox allowed me to send emojis through. Cheers! – Sapir
ok so using a different driver and browser is an answer to chrome driver problem of supporting chars only in basic multilingual plane? – Brambling
A
10

Copy & Paste it !!! It was so easy to round on this issue by copying the text to the clipboard and then pasting it into the element. pasting a text that contains emojis

import pyperclip
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get("https://google.com")
title = driver.title
assert title == "Google"

driver.implicitly_wait(0.5)

search_box = driver.find_element(by=By.NAME, value="q")

pyperclip.copy("Hi πŸ˜€ This is a test message ! πŸ‘ŒπŸ»")
act = ActionChains(driver)
act.key_down(Keys.CONTROL).send_keys("v").key_up(Keys.CONTROL).perform()
Albertalberta answered 2/6, 2022 at 8:31 Comment(0)
E
5

For those who wants to send emojis on Chrome

Solution

    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);
    }

Call it like so

const element = await this.driver.findElement(selector);
await sendKeysWithEmojis(element, 'πŸš€πŸ˜€ This one shall pass πŸš€πŸ˜€');

What is happening here? We are emulating native key presses using events

Notice that the {bubbles: true} is optional (Was needed in my case due to a complex wrapped input)

Enschede answered 1/3, 2020 at 19:4 Comment(9)
do you know if it is possible to use this method in python too? I'm trying to adapt your code but have some problems – Pigweed
I have no idea but I don't see a reason why not as this code is mostly javascript and one command in python "executeScript" – Enschede
thanks for fast reply, for example if I run the first code my console prompt this error SyntaxError: invalid syntax and it says the error is at sendKeysWithEmojis – Pigweed
Can you share the code on some platform and paste the link here? – Enschede
The code I run is the one you wrote here in the answer: async sendKeysWithEmojis(element, text) {...}, when I run it in python it gives me that error – Pigweed
remove the async and await part - those are js syntax – Enschede
Haha. yeah const is also not part of python language - also the ` (Tag) sign should probably be replaced with """ at the beginning and at the end of the string – Enschede
thanks, now it says error at script ahaha i think there is no way don't worry its ok I don't want to bother you – Pigweed
I suggest you refer to some python course to better know the language. Then you can see an example here of running javascript inside python (Which is what needed to run the above code) - #5585843 – Enschede
I
3

there was an open bug on chrome driver website, the bug as been fixed this month (14.11.21)

https://bugs.chromium.org/p/chromedriver/issues/detail?id=2269

this is the bug report.

how to use new chrome driver:

first go to: https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html?prefix=Win/942085/

download the chrome driver from there.(the first mark as showen in image).

then you will need to install the new chrome v98 using the mini_installer.exe

(pay attantion its all expermintal),

without this you could not use the new driver due to version compitity.

next i needed to delete the current chrome version to make this work good. enter image description here

your are all welcome to ask me question about it, i mange to make it work with the versions i add here on whatsapp using selenium chrome driver.

EDIT: enter image description here chrome versions 98 stable will come out in 30 days, so you could try to install the beta version and not the chromium version and see if it's working.

you don't have to delete the old chrome version, I know this thread is about python but in java (i guess python support it too) you could do this:

options.setBinary(System.getProperty("user.home") + "\\AppData\\Local\\Chromium\\Application\\chrome.exe");

and it will set the path to the chromium version.

Irizarry answered 18/11, 2021 at 8:40 Comment(1)
I'm now using Chrome+Chromedriver v.111 and still getting this error. Does that match your experience? – Catchpenny
L
1

You can use

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

your_text = 'this my text πŸ€―πŸ˜‘πŸ—£πŸ‘£'
element = driver.find_element_by_xpath('//*[@data-testid="input"]')
driver.execute_script(js_code, element, your_text)
Lidialidice answered 18/8, 2022 at 13:6 Comment(0)
C
0

Here is how I fixed this using VBA and ChromeDriver in Excel SeleniumBasic:

objIE.ExecuteScript "arguments[0].value = arguments[1]", Array(objIE.FindElementById("sqlvalue1"), Sheets("SheetName").Range("A1").Value)

This avoids using SendKeys which is what errors when it is run with this error message.

Crompton answered 15/11, 2021 at 13:24 Comment(0)
D
0

If emojis and other non-ASCII characters are not mandatory, you can remove all of them using this script

import re

text = "hello 🀯 world"
text = re.sub(r'[^\x00-\x7F]+',' ', text)
print(text) # hello  world
Derogative answered 7/4 at 20:20 Comment(0)

© 2022 - 2024 β€” McMap. All rights reserved.