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?
It works for me:
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)
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.
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:
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
A few links:
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With