我正在自动化 Whatsapp 消息,并想通过 tkinter 窗口发送它们。在这个 tkinter 窗口中,我在 .label() 的帮助下创建了一个消息框,并且我能够通过 selenium 连接到 Whatsapp Web。
目前,我已经可以发送消息,但不能发送表情符号。当我包含表情符号时,出现此错误“Chromedriver 仅支持 BMP 中的字符”。如何添加表情符号?
这有效(于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)
这个错误信息...
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 字符(例如 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("💩")
浏览器快照:
一些链接:
复制并粘贴! 通过将文本复制到剪贴板,然后将其粘贴到元素中,可以很容易地解决这个问题。
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()
对于那些想要在 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}
是可选的(由于复杂的包装输入,在我的情况下需要)
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 版本的路径。
你可以使用
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)
以下是我在 Excel SeleniumBasic 中使用 VBA 和 ChromeDriver 修复此问题的方法:
objIE.ExecuteScript "arguments[0].value = arguments[1]", Array(objIE.FindElementById("sqlvalue1"), Sheets("SheetName").Range("A1").Value)
这可以避免使用
SendKeys
,这就是运行时出现此错误消息的错误。