Chromedriver 仅支持 BMP 错误中的字符,同时使用 ChromeDriver Chrome 使用 Selenium Python 将 Emoji 发送到 Tkinter 的 label() 文本框

问题描述 投票:0回答:7

我正在自动化 Whatsapp 消息,并想通过 tkinter 窗口发送它们。在这个 tkinter 窗口中,我在 .label() 的帮助下创建了一个消息框,并且我能够通过 selenium 连接到 Whatsapp Web。

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

python selenium google-chrome selenium-chromedriver emoji
7个回答
18
投票

这有效(于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)


12
投票

这个错误信息...

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

...意味着 ChromeDriver 无法通过 send_keys() 方法发送

emoji
信号。

ChromeDriver 仅支持 BMP 中的字符,这是 Chromium 团队的一个已知问题,因为 ChromeDriver 仍然不支持

FFFF
之后的 Unicode 字符。因此,不可能通过 ChromeDriver 发送超出
FFFF
的任何字符。因此,任何发送 SMP 字符(例如 CJKEmojisSymbols 等)的尝试都会引发错误。


替代方案

一个潜在的替代方案是使用 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 支持 BMP 中的字符通过 C# Selenium 发送表情符号中找到相关讨论


尾声

一些链接:


6
投票

复制并粘贴! 通过将文本复制到剪贴板,然后将其粘贴到元素中,可以很容易地解决这个问题。

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()

5
投票

对于那些想要在 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}
是可选的(由于复杂的包装输入,在我的情况下需要)


3
投票

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 版本的路径。


1
投票

你可以使用

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)

0
投票

以下是我在 Excel SeleniumBasic 中使用 VBA 和 ChromeDriver 修复此问题的方法:

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

这可以避免使用

SendKeys
,这就是运行时出现此错误消息的错误。

© www.soinside.com 2019 - 2024. All rights reserved.