【问题标题】:Chromedriver only supports characters in the BMP error while sending Emoji with ChromeDriver Chrome using Selenium Python to Tkinter's label() textboxChromedriver 仅支持 BMP 错误中的字符,同时使用 Selenium Python 将带有 ChromeDriver Chrome 的 Emoji 发送到 Tkinter\'s label() 文本框
【发布时间】:2022-06-02 16:31:20
【问题描述】:

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

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

  • 你试过哪个表情符号?

标签: python selenium google-chrome selenium-chromedriver emoji


【解决方案1】:

这个对我有用:

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)

【讨论】:

  • 我尝试了这种方法,在我的情况下 elembrowser.find_elements_by_css_selector("div[role='presentation'] div[role='textbox']") 但是当我运行 browser.execute_script(JS_ADD_TEXT_TO_INPUT, elem, text) 时没有任何反应......你能帮忙吗?谢谢。 (我所在的网站是 facebook,特别是我正在尝试在帖子编辑器中输入表情符号)
  • 声波,您是否尝试仅发送文本?用文字可以吗?你使用什么版本的 webdriver?
  • 这不再起作用了,什么是 new Event('change') ?有没有可能已经改变了?
【解决方案2】:

此错误消息...

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

...意味着铬驱动程序无法发送表情符号通过send_keys() 方法发出信号。

ChromeDriver only supports characters in the BMP 是一个已知问题团队作为铬驱动程序仍然不支持FFFF 之后的 Unicode 字符。因此,不可能通过 ChromeDriver 发送超出FFFF 的任何字符。因此,任何尝试发送脱模剂字符(例如CJK,表情符号,符号等)引发错误。


选择

一个潜在的替代方案是使用壁虎司机 / 火狐.

  • 代码块:

      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找到相关讨论


奥特罗

几个链接:

【讨论】:

  • 这解决了我的问题,非常感谢!只需从 chromedriver -> geckodriver 和 google chrome -> firefox 更改,我就可以发送表情符号。干杯!
  • 好的,所以使用不同的驱动程序和浏览器是解决仅在基本多语言平面中支持字符的 chrome 驱动程序问题的答案?
【解决方案3】:

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

【讨论】:

  • 你知道在python中是否也可以使用这种方法吗?我正在尝试调整您的代码,但有一些问题
  • 我不知道,但我看不出为什么不这样做的原因,因为这段代码主要是javascript和python“executeScript”中的一个命令
  • 你能在某个平台上分享代码并将链接粘贴到这里吗?
  • 删除 asyncawait 部分 - 这些是 js 语法
  • 哈哈。是的 const 也不是 python 语言的一部分 - `(标签)符号可能应该在字符串的开头和结尾替换为 """
【解决方案4】:

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 版本以使其正常工作。

欢迎大家向我提问,我设法使它与我在whatsapp上使用selenium chrome驱动程序添加的版本一起工作。

编辑: chrome 版本 98 stable 将在 30 天内发布,因此您可以尝试安装 beta 版本而不是 chromium 版本,看看它是否正常工作。

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

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

它将设置铬版本的路径。

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

      这是我在 Excel SeleniumBasic 中使用 VBA 和 ChromeDriver 解决此问题的方法:

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

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

      【讨论】:

        猜你喜欢
        • 2020-03-27
        • 2022-08-18
        • 2022-01-03
        • 2018-10-30
        • 2023-03-20
        • 1970-01-01
        • 2020-09-24
        • 2019-08-07
        相关资源
        最近更新 更多