Chrome驱动程序仅支持 BMP 错误中的字符,同时使用 Selenium Python 将带有 Chrome驱动程序 Chrome 的表情符号发送到 Tkinter 的标签()文本框
Chromedriver only supports characters in the BMP error while sending Emoji with ChromeDriver Chrome using Selenium Python to Tkinter's label() textbox
我正在自动处理 whatsapp 消息并希望通过 tkinter window 将它们发送出去。在这个 tkinter window 中,我在 .label() 的帮助下创建了一个消息框,并且我能够通过 selenium 连接到 whatsapp web。
目前,我已经可以发送消息,但没有表情符号。当我包含表情符号时,出现此错误 "Chromedriver only supports characters in the BMP"。如何添加表情符号?
这个错误信息...
selenium.common.exceptions.WebDriverException: Message: unknown error: ChromeDriver only supports characters in the BMP
...表示 ChromeDriver 无法通过 send_keys()
方法发送 emoji 信号。
ChromeDriver only supports characters in the BMP 是 Chromium 团队的一个已知问题,因为 ChromeDriver 仍然不支持在 FFFF
。因此,不可能通过 ChromeDriver 发送超过 FFFF
的任何字符。因此,任何尝试发送 SMP 字符(例如 CJK、Emojis、 Symbols, etc) 引发错误。
备选
一个潜在的替代方案是使用 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("")
浏览器快照:
您可以在 OpenQA.Selenium.WebDriverException: 'unknown error: ChromeDriver only supports characters in the BMP while sending an emoji through C# Selenium
中找到相关讨论
结尾
几个链接:
对于那些想在 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}
是可选的(在我的案例中由于复杂的包装输入而需要)
对我有用:
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)
以下是我在 Excel SeleniumBasic 中使用 VBA 和 ChromeDriver 修复此问题的方法:
objIE.ExecuteScript "arguments[0].value = arguments[1]", Array(objIE.FindElementById("sqlvalue1"), Sheets("SheetName").Range("A1").Value)
这避免了使用 SendKeys
时的错误消息 运行。
chrome 驱动程序网站上存在一个未解决的错误,该错误已于本月 (14.11.21) 修复
https://bugs.chromium.org/p/chromedriver/issues/detail?id=2269
这是错误报告。
如何使用新的chrome驱动程序:
首先去:
https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html?prefix=Win/942085/
从那里下载 chrome 驱动程序。(第一个标记如图所示)。
然后您需要使用 mini_installer.exe
安装新的 chrome v98
(注意所有实验),
如果没有这个,由于版本兼容性问题,您将无法使用新的驱动程序。
接下来我需要删除当前的 chrome 版本才能使这项工作正常进行。
欢迎大家向我提问,我设法使用 selenium chrome 驱动程序使其与我在 whatsapp 上添加的版本一起使用。
编辑:
chrome 98 稳定版将在 30 天内发布,因此您可以尝试安装 beta 版而不是 chromium 版,看看它是否正常工作。
你不必删除旧的 chrome 版本,我知道这个线程是关于 python 但在 java 中(我想 python 也支持它) 你可以这样做:
options.setBinary(System.getProperty("user.home") + "\AppData\Local\Chromium\Application\chrome.exe");
它会设置 chromium 版本的路径。
复制粘贴!!!
通过将文本复制到剪贴板然后将其粘贴到元素中,很容易解决这个问题。
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()
我正在自动处理 whatsapp 消息并希望通过 tkinter window 将它们发送出去。在这个 tkinter window 中,我在 .label() 的帮助下创建了一个消息框,并且我能够通过 selenium 连接到 whatsapp web。
目前,我已经可以发送消息,但没有表情符号。当我包含表情符号时,出现此错误 "Chromedriver only supports characters in the BMP"。如何添加表情符号?
这个错误信息...
selenium.common.exceptions.WebDriverException: Message: unknown error: ChromeDriver only supports characters in the BMP
...表示 ChromeDriver 无法通过 send_keys()
方法发送 emoji 信号。
ChromeDriver only supports characters in the BMP 是 Chromium 团队的一个已知问题,因为 ChromeDriver 仍然不支持在 FFFF
。因此,不可能通过 ChromeDriver 发送超过 FFFF
的任何字符。因此,任何尝试发送 SMP 字符(例如 CJK、Emojis、 Symbols, etc) 引发错误。
备选
一个潜在的替代方案是使用 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("")
浏览器快照:
您可以在 OpenQA.Selenium.WebDriverException: 'unknown error: ChromeDriver only supports characters in the BMP while sending an emoji through C# Selenium
中找到相关讨论结尾
几个链接:
对于那些想在 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}
是可选的(在我的案例中由于复杂的包装输入而需要)
对我有用:
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)
以下是我在 Excel SeleniumBasic 中使用 VBA 和 ChromeDriver 修复此问题的方法:
objIE.ExecuteScript "arguments[0].value = arguments[1]", Array(objIE.FindElementById("sqlvalue1"), Sheets("SheetName").Range("A1").Value)
这避免了使用 SendKeys
时的错误消息 运行。
chrome 驱动程序网站上存在一个未解决的错误,该错误已于本月 (14.11.21) 修复
https://bugs.chromium.org/p/chromedriver/issues/detail?id=2269
这是错误报告。
如何使用新的chrome驱动程序:
首先去: https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html?prefix=Win/942085/
从那里下载 chrome 驱动程序。(第一个标记如图所示)。
然后您需要使用 mini_installer.exe
安装新的 chrome v98(注意所有实验),
如果没有这个,由于版本兼容性问题,您将无法使用新的驱动程序。
接下来我需要删除当前的 chrome 版本才能使这项工作正常进行。
欢迎大家向我提问,我设法使用 selenium chrome 驱动程序使其与我在 whatsapp 上添加的版本一起使用。
编辑:
你不必删除旧的 chrome 版本,我知道这个线程是关于 python 但在 java 中(我想 python 也支持它) 你可以这样做:
options.setBinary(System.getProperty("user.home") + "\AppData\Local\Chromium\Application\chrome.exe");
它会设置 chromium 版本的路径。
复制粘贴!!!
通过将文本复制到剪贴板然后将其粘贴到元素中,很容易解决这个问题。
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()