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

Mal*_*eck 10 python selenium google-chrome emoji selenium-chromedriver

我正在自动化 whatsapp 消息,并希望通过 tkinter 窗口将它们发送出去。在这个 tkinter 窗口中,我在 .label() 的帮助下创建了一个消息框,我能够通过 selenium 连接到 whatsapp 网络。

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

Deb*_*anB 8

这个错误信息...

selenium.common.exceptions.WebDriverException: Message: unknown error: ChromeDriver only supports characters in the BMP
Run Code Online (Sandbox Code Playgroud)

...暗示ChromeDriver无法通过方法发送表情符号信号send_keys()

ChromeDriver 仅支持 BMP中的字符Chromium团队的一个已知问题,因为ChromeDriver仍然不支持FFFF. 因此不可能FFFF通过 ChromeDriver发送任何字符。因此,任何发送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("")
    
    Run Code Online (Sandbox Code Playgroud)
  • 浏览器快照:

表情符号

您可以在OpenQA.Selenium.WebDriverException: 'unknown error: ChromeDriver only supports characters in the BMP while sent an emoji through C# Selenium 中找到相关讨论


奥特罗

几个链接:

  • 好的,那么使用不同的驱动程序和浏览器是解决仅在基本多语言平面中支持字符的 Chrome 驱动程序问题的答案吗? (2认同)

Jac*_*ssn 7

这个对我有用:

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)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


小智 7

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

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()
Run Code Online (Sandbox Code Playgroud)


Gal*_*cha 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);
    }
Run Code Online (Sandbox Code Playgroud)

像这样称呼它

const element = await this.driver.findElement(selector);
await sendKeysWithEmojis(element, ' This one shall pass ');
Run Code Online (Sandbox Code Playgroud)

这里发生了什么? 我们正在使用事件模拟本机按键

请注意,它{bubbles: true}是可选的(由于复杂的包装输入,在我的情况下需要)