簡體   English   中英

Chromedriver 僅支持 BMP 錯誤中的字符,同時使用 ChromeDriver Chrome 使用 Selenium Python 將 Emoji 發送到 Tkinter 的 label() 文本框

[英]Chromedriver only supports characters in the BMP error while sending Emoji with ChromeDriver Chrome using Selenium Python to Tkinter's label() textbox

我正在自動化 whatsapp 消息,並希望通過 tkinter window 將它們發送出去。 在這個 tkinter window 中,我在.label() 的幫助下創建了一個消息框,並且我能夠連接到 whatsapp web 到 Z516FF0058ZDF478.

目前,我已經可以發送消息,但沒有表情符號。 當我包含表情符號時,我收到此錯誤“Chromedriver 僅支持 BMP 中的字符”。 如何包含表情符號?

["

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)

此錯誤消息...

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

...意味着ChromeDriver無法通過send_keys()方法發送表情符號信號。

ChromeDriver 僅支持 BMP 中的字符Chromium團隊的一個已知問題,因為ChromeDriverFFFF之后仍然不支持帶有 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 support characters in the BMP while sent an emoji through C# Selenium


奧特羅

幾個鏈接:

對於那些想在 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 版本以使其正常工作。 在此處輸入圖像描述

歡迎大家向我提問,我設法使它與我在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");

它將設置鉻版本的路徑。

這是我在 Excel SeleniumBasic 中使用 VBA 和 ChromeDriver 解決此問題的方法:

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

這樣可以避免使用SendKeys ,這是在使用此錯誤消息運行時出現的錯誤。

復制粘貼!!! 通過將文本復制到剪貼板然后將其粘貼到元素中來解決這個問題非常容易。 粘貼包含表情符號的文本

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

您可以使用

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM