【问题标题】:Implement complex unicode emoji characters in selenium在 selenium 中实现复杂的 unicode emoji 字符
【发布时间】:2020-06-23 02:11:39
【问题描述】:

我正在尝试在 whatsapp 网络和我的消息中自动发送消息,使用一些很酷的表情符号,但如您所知,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 - 包含有助于调试的建议更改的完整代码

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)

【问题讨论】:

    标签: python selenium google-chrome selenium-webdriver selenium-chromedriver


    【解决方案1】:

    此错误消息...

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

    ...暗示传递给命令的参数无效或格式错误。


    无效参数错误主要与 JavaScript 中的 TypeErrors 相关联,当输入值不是预期类型或以某种方式出现错误时,可能会发生这些错误。在这个用例中,问题可能是当您尝试通过 execute_script() 发送 emoji 时,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家庭?使用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)
      
    • 浏览器快照:


    注意

    最后,值得一提的是https://web.whatsapp.com/ 元素是ReactJS 启用的元素。所以像_3uMse 这样的 是动态生成的,绝不是静态的。您可能需要基于静态属性构建定位器。

    您可以在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 论坛中的一些相关讨论:

    【讨论】:

    • 感谢@DebanjanB 的精彩回答,但不幸的是,错误仍然存​​在,我想这是 WhatsApp 网络试图自动化的原因,因为谷歌的示例运行良好!我刚刚编辑了我的问题并添加了完整的代码来帮助
    • @JoãoVitor 查看答案更新。可能引用的讨论How to click on a username within web.whatsapp.com using Selenium and Python 将解决您的问题。
    猜你喜欢
    • 2015-09-25
    • 1970-01-01
    • 2015-12-30
    • 2012-05-10
    • 2018-09-18
    • 2021-11-27
    • 1970-01-01
    • 2021-11-16
    • 2014-08-30
    相关资源
    最近更新 更多