2017-07-26 145 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

对不起,我的延迟响应。感谢您的帮助。我已经将你的代码和复制粘贴一起使用(一旦粘贴,我将剪贴板内容与变量进行比较),现在工作正常。将粘贴有问题的代码本身。 –