在selenium中实现复杂的unicode表情符号

2024-10-17 08:21:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试在whatsapp web和我的消息中自动发送消息,使用一些很酷的表情符号,但正如您所知,chromedriver默认情况下不使用send_keys()键入表情符号

因此,对于测试,我的代码基于此answer here,它工作正常,但是如果我尝试发送多个unicode表情符号,则会显示以下错误:

selenium.common.exceptions.InvalidArgumentException: Message: invalid argument: missing command parameters

我当前代码的示例:

chatBox = self.driver.find_element_by_class_name('_3uMse')
time.sleep(2)
chatBox.click()     
        
JS_ADD_TEXT_TO_INPUT = """
var elm = arguments[0], txt = arguments[1];
elm.value += txt;
elm.dispatchEvent(new Event('change'));
"""
text = u'\uD83D\uDC6A'
#using this emoji, it works  
#text = u'\u263A'

self.driver.execute_script(JS_ADD_TEXT_TO_INPUT, chatBox, text)
chatBox.send_keys(text)

为什么会这样


编辑1-包含建议更改的完整代码,以帮助消除bug

self.driver.get('https://web.whatsapp.com/')
# time to scan qrcode
time.sleep(8)
contact = self.driver.find_element_by_xpath(f"//span[@title='<NAME_OF_SAVED_CONTACT>']")
contact.click()

chatBox = WebDriverWait(self.driver, 20).until(EC.element_to_be_clickable((By.CLASS_NAME, "_3uMse")))
chatBox.click()     

JS_ADD_TEXT_TO_INPUT = """
var elm = arguments[0], txt = arguments[1];
elm.value += txt;
elm.dispatchEvent(new Event('change'));
"""
text = u'\uD83D\uDC6A'
self.driver.execute_script(JS_ADD_TEXT_TO_INPUT, chatBox, text)
chatBox.send_keys(text)

Tags: totextselftxtsendaddinputdriver
1条回答
网友
1楼 · 发布于 2024-10-17 08:21:57

此错误消息

selenium.common.exceptions.InvalidArgumentException: Message: invalid argument: missing command parameters

…表示传递给命令的参数无效或格式不正确


无效参数错误主要链接到JavaScript中的TypeErrors,当输入值不是预期类型或在某种程度上格式不正确时,可能会发生这些错误。在这个用例中,问题可能是当您试图通过^{发送表情符号时,chatBox不可交互


解决方案

一个可能的解决方案是为element_to_be_clickable()诱导WebDriverWait,您可以使用以下任一Locator Strategies

  • 代码块:

    chatBox = WebDriverWait(self.driver, 20).until(EC.element_to_be_clickable((By.CLASS_NAME, "_3uMse")))
    chatBox.click()     
    
    JS_ADD_TEXT_TO_INPUT = """
    var elm = arguments[0], txt = arguments[1];
    elm.value += txt;
    elm.dispatchEvent(new Event('change'));
    """
    text = u'\uD83D\uDC6A'
    self.driver.execute_script(JS_ADD_TEXT_TO_INPUT, chatBox, text)
    chatBox.send_keys(text)
    
  • 注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

但是,这个代码块在我这方面非常适合发送带有多个Unicode的复杂表情符号,例如family👪 使用u\uD83D\uDC6A如下所示:

  • 代码块:

    driver = webdriver.Chrome(options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')
    driver.get('https://www.google.com/')
    element = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.NAME, "q")))
    JS_ADD_TEXT_TO_INPUT = """
      var elm = arguments[0], txt = arguments[1];
      elm.value += txt;
      elm.dispatchEvent(new Event('change'));
      """
    text = u'\uD83D\uDC6A'
    driver.execute_script(JS_ADD_TEXT_TO_INPUT, element, text)
    
  • 浏览器快照:

emoji_chrome


最后,值得一提的是https://web.whatsapp.com/元素是启用了ReactJS的元素。因此类像_3uMse是动态生成的,从来不是静态的。您可能需要基于静态属性构造定位器

You can find a relevant discussion in How to click on a username within web.whatsapp.com using Selenium and Python

此外,根据Element Send Keys to file input with 'multiple' attribute should append file list中的讨论,您需要确保您的ChromeDriver版本至少为ChromeDriver-75


参考资料

您可以在以下内容中找到一些相关讨论:


奥特罗

ChromeDriver论坛上的两个相关讨论:

相关问题 更多 >