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

sdnqo3pr  于 2023-06-03  发布在  Go
关注(0)|答案(7)|浏览(739)

我正在自动化WhatsApp消息,并希望通过tkinter窗口发送它们。在这个tkinter窗口中,我在.label()的帮助下创建了一个消息框,我可以通过selenium连接到whatsapp web。
目前,我已经可以发送消息了,但没有表情符号。当我包含表情符号时,我得到这个错误“Chromedriver只支持BMP中的字符”。如何添加emoji?

kjthegm6

kjthegm61#

它对我有效:

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)

7bsow1i6

7bsow1i62#

此错误消息...

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

...表示ChromeDriver无法通过send_keys()方法发送emoji信号。
ChromeDriver only supports characters in the BMPChromium 团队的已知问题,因为 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 supports characters in the BMP while sending an emoji through C# Selenium中找到相关讨论

外推

几个链接:

0wi1tuuw

0wi1tuuw3#

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

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

ct3nt3jp4#

对于那些想在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}是可选的(在我的例子中由于复杂的 Package 输入而需要)

eulz3vhy

eulz3vhy5#

在chrome驱动程序网站上有一个公开的错误,这个错误在本月(14.11.21)被修复
https://bugs.chromium.org/p/chromedriver/issues/detail?id=2269
这是bug报告。

如何使用新的chrome驱动程序:

首先转到:https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html?prefix=Win/942085/
从那里下载chrome驱动程序。(第一个标记为显示在图像中)。
然后你将需要安装新的chrome v98使用mini_installer.exe

(pay attantion its all expermintal)

没有这个你不能使用新的驱动程序由于版本compitity.
接下来,我需要删除当前的Chrome版本,使这一工作良好。

你都欢迎问我关于它的问题,我mange使它与我在这里使用 selenium chrome 驱动程序在whatsapp上添加的版本一起工作.

编辑:

chrome版本98稳定版将在30天内推出,所以你可以尝试安装测试版而不是chrome版本,看看它是否工作。

你不必删除旧的chrome版本,我知道这个线程是关于python的,但在java中(我猜python也支持它)你可以这样做:

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

并且它将设置到 chrome 版本的路径。

5sxhfpxr

5sxhfpxr6#

以下是我如何在Excel SeleniumBasic中使用VBA和ChromeDriver修复此问题:

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

这避免了使用SendKeys,这是当它运行时出现此错误消息的错误。

bvn4nwqk

bvn4nwqk7#

你可以用

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)

相关问题