【问题标题】: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 的 label() 文本框
【发布时间】:2020-03-27 01:26:55
【问题描述】:

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

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

【问题讨论】:

  • 你试过哪个表情符号?

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


【解决方案1】:

chrome驱动网站有一个开放的bug,这个bug已经在本月(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");

它会设置铬版本的路径。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      此错误消息...

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


      结尾

      几个链接:

      【讨论】:

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

      它对我有用:

      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') ?有没有可能改了?
      【解决方案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} 是可选的(在我的情况下由于复杂的包装输入而需要)

      【讨论】:

      • 你知道在python中是否也可以使用这种方法吗?我正在尝试调整您的代码,但有一些问题
      • 我不知道,但我看不出为什么不这样做的原因,因为这段代码主要是 javascript 和 python "executeScript" 中的一个命令
      • 你能在某些平台上分享代码并将链接粘贴到这里吗?
      • 删除 asyncawait 部分 - 这些是 js 语法
      • 哈哈。是的const 也不是 python 语言的一部分 - `(标签)符号可能应该在字符串的开头和结尾替换为 """
      猜你喜欢
      • 2022-06-02
      • 2022-08-18
      • 2018-10-30
      • 2022-01-03
      • 1970-01-01
      • 2023-03-20
      • 2020-09-24
      • 2019-08-07
      相关资源
      最近更新 更多