![](/img/trans.png)
[英]How to input “Hot dog” emoji using Python Selenium send_keys
[英]Python selenium send_keys emoji support
我正在尝试使用selenium的send_keys将表情符号字符发送到带有以下python代码的文本框。
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
通过搜索,我发现硒send_keys仅支持单字节字符。 但是我想知道,是否有其他方法可以实现这一目标。
我试过使用CTRl + C和CTRL + V组合,它正在工作。 但是有时剪贴板中的内容会在粘贴之前更改(复制和粘贴几乎立即发生)。
我也无法使用execute_script设置字段的值,因为它不是输入元素,而是跨度。 我可以设置inner_text但在用例中没有用。
更新:我已经使用了一些解决方法来解决剪贴板覆盖的问题。 下面提供了工作代码。
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)
谢谢你们。
在chrome驱动程序的当前版本(2.32)中, send_keys
方法仅支持Basic Multilingual Plane中的字符。
如果您想输入表情符号,则必须使用脚本注入通过value
属性在所需输入中编写文本。 您还必须调度change
事件以通知侦听器:
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.