2017-07-26 143 views
3

我想使用硒的send_keys發送emoji字符到下面的python代碼的文本框。Python的硒send_keys表情符號支持

browser = webdriver.Chrome(chrome_options=options) 
browser.get("https://www.google.co.in") 
time.sleep(5) 
working = browser.find_element_by_id('lst-ib') 
text = u'Python is ' 
working.send_keys(text) 

我收到以下錯誤。

Traceback (most recent call last): 
    File "smiley.py", line 30, in <module> 
    working.send_keys(text) 
    File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webelement.py", line 347, in send_keys 
    self._execute(Command.SEND_KEYS_TO_ELEMENT, {'value': keys_to_typing(value)}) 
    File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webelement.py", line 491, in _execute 
    return self._parent.execute(command, params) 
    File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 238, in execute 
    self.error_handler.check_response(response) 
    File "C:\Python27\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 164, in check_response 
    raise exception_class(value) 
selenium.common.exceptions.WebDriverException: Message: missing command parameters 

在搜索時,我發現selenium send_keys只支持單字節字符。但我想知道,如果有其他方法可以實現這一點。

我嘗試過使用CTRL + C和CTRL + V組合,它正在工作。但是有時剪貼板內容在粘貼前會發生變化(複製和粘貼幾乎立即發生)。

我無法使用execute_script設置字段的值,因爲它不是輸入元素,而是跨度。我可以設置inner_text,但在我的用例中無用。

UPDATE: 我已經使用一些解決方法,以解決剪貼板覆蓋問題。工作代碼在下面提供。

schedule = urllib2.urlopen(request,context=ctx) 
text = schedule.read().decode('utf-8') 
elem = browser.find_element_by_class_name(xpathObj['commentLink']) 
elem.click() 
time.sleep(2) 
ActionChains(browser).send_keys('a').perform() 
time.sleep(2) 
copy_attempt = 0 
while True: 
    span_element = browser.find_element_by_xpath(xpathObj['commentSpan']) 
    browser.execute_script("arguments[0].innerText = arguments[1]", span_element, text) 
    time.sleep(2) 
    ActionChains(browser).key_down(Keys.CONTROL).send_keys('a').key_up(Keys.CONTROL).perform() 
    time.sleep(1) 
    ActionChains(browser).key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).key_down(Keys.CONTROL).send_keys('V').key_up(Keys.CONTROL).perform() 
    time.sleep(1) 
    win32clipboard.OpenClipboard() 
    text1 = win32clipboard.GetClipboardData(win32clipboard.CF_UNICODETEXT) 
    emoji_pattern = re.compile(
     u"(\ud83d[\ude00-\ude4f])|" # emoticons 
     u"(\ud83c[\udf00-\uffff])|" # symbols & pictographs (1 of 2) 
     u"(\ud83d[\u0000-\uddff])|" # symbols & pictographs (2 of 2) 
     u"(\ud83d[\ude80-\udeff])|" # transport & map symbols 
     u"(\ud83c[\udde0-\uddff])" # flags (iOS) 
     "+", flags=re.UNICODE) 
    s = difflib.SequenceMatcher(None,emoji_pattern.sub(r'', text), emoji_pattern.sub(r'', text1)) 
    if (s.ratio() < 1.0): 
     if (copy_attempt < 5): 
      copy_attempt = copy_attempt + 1 
      continue 
     else: 
      break 
    else: 
     ActionChains(browser).send_keys(Keys.RETURN).perform() 
     time.sleep(3) 
     break 
time.sleep(3) 

謝謝大家。

+1

你的鍵盤發送的字節流。嘗試使用UTF-8或UTF-16對其進行編碼,看看它是否有效。 – Artyer

回答

2

對於當前版本的chrome驅動程序(2.32),方法send_keys僅支持來自Basic Multilingual Plane的字符。

如果您希望鍵入表情符號,則必須使用腳本注入通過value屬性在所需的輸入中編寫文本。您還可以派遣change的事件,通知聽衆:高輸入Unicode字符時

from selenium import webdriver 

driver = webdriver.Chrome() 
driver.get("https://www.google.co.in") 

time.sleep(5) 

JS_ADD_TEXT_TO_INPUT = """ 
    var elm = arguments[0], txt = arguments[1]; 
    elm.value += txt; 
    elm.dispatchEvent(new Event('change')); 
    """ 

elem = driver.find_element_by_id('lst-ib') 
text = u'\ud83d\udc4d' 

driver.execute_script(JS_ADD_TEXT_TO_INPUT, elem, text) 
+0

對不起,我的延遲響應。感謝您的幫助。我已經將你的代碼和複製粘貼一起使用(一旦粘貼,我將剪貼板內容與變量進行比較),現在工作正常。將粘貼有問題的代碼本身。 –