es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

send_keys no funciona correctamente (Automatización de envío de mensajes en Twitter con Selenium)

Gracias chicos por ayudarme.

Actualmente estoy realizando un envío automatizado de mensajes para Twitter utilizando Selenium.
Esta es la ESTRUCTURA HTML del DOM:
Esta es la imagen

Así que extraigo la entrada del cuadro de texto de la siguiente manera:

def try_input(driver: WebDriver, msg: str, element: WebElement = None):
textbox_xpath = “//div[@data-testid=’dmComposerTextInput’ and @role=’textbox’]”
selector = element if element else driver.find_element_by_xpath(textbox_xpath)
try:
selector.send_keys(msg.encode(“utf-8”))
return True
except Exception as e:
try:
selector.send_keys(msg.decode(“utf-8″))
return True
except Exception as e:
try:
for m in msg.split(‘\n’):
selector.send_keys(” “)
time.sleep(uniform(0.2, 0.6))
selector.send_keys(m)
action = ActionChains(driver)
action.key_down(Keys.SHIFT).key_down(Keys.ENTER).key_up(Keys.ENTER).key_up(Keys.SHIFT).perform()
return True
except Exception as e:
pass
return False

Por ejemplo, ingreso un texto con saltos de línea (\n):

Hola, este es un texto de ejemplo
Esta es la primera vez que uso Selenium
Espero que me ayuden.

Texto del mensaje en Twitter en realidad

Como puedes ver aquí, faltan algunos caracteres en “ayuden.” y no hay saltos de línea en el cuadro de texto.
Así es como se ve en el cuadro de texto, pero cuando hago clic en enviar, el contenido se muestra completamente y exactamente (sin caracteres faltantes y con saltos de línea).
Imagen del mensaje exacto

Este comportamiento es muy extraño porque tengo una función para verificar el contenido antes de enviarlo realmente (hacer clic en enviar) => Verifico el contenido del mensaje en el cuadro de texto y lo comparo con lo que uso para enviar.

=> No es lo mismo (porque faltan algunos caracteres)

=> Entonces mi pregunta es: ¿cómo puedo manejar y enviar el mensaje exactamente con

?
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución para enviar mensajes con contenido preciso

    Cuando se utiliza Selenium para enviar mensajes en Twitter, puede haber discrepancias entre el contenido introducido en el cuadro de texto y el contenido que se envía realmente. Esto puede resultar en caracteres faltantes o saltos de línea incorrectos. Para solucionar este problema, se pueden seguir los siguientes pasos:

    1. En lugar de utilizar el método send_keys() para introducir el mensaje, utilizar el método execute_script() para establecer el valor del div con atributo contenteditable directamente con el texto del mensaje. Por ejemplo,
      def set_textbox_value(driver: WebDriver, message: str):
          script = "document.querySelector('div[data-testid=\"dmComposerTextInput\"]').innerHTML ='" + message + "'"
          driver.execute_script(script)
      
    2. Después de establecer el valor, disparar un evento de cambio en el div con atributo contenteditable para actualizar la interfaz de usuario. Por ejemplo,
      def trigger_change_event(driver: WebDriver):
          textbox_xpath = "//div[@data-testid='dmComposerTextInput']"
          element = driver.find_element_by_xpath(textbox_xpath)
          driver.execute_script("var evt = document.createEvent('HTMLEvents'); evt.initEvent('change', true, true); arguments[0].dispatchEvent(evt);", element)
      
    3. Si hay saltos de línea en el mensaje, dividir el mensaje por cada salto de línea y añadir etiquetas <br> entre las líneas antes de establecer el valor. Por ejemplo,
      def format_message(message: str):
          lines = message.split("\n")
          return "<br>".join(lines)
      

    Juntando todo esto, una función de ejemplo para enviar un mensaje con contenido preciso se vería de la siguiente manera:

    def send_message(driver: WebDriver, message: str):
        textbox_xpath = "//div[@data-testid='dmComposerTextInput']"
        send_button_xpath = "//div[@data-testid='dmComposerSendButton']"
    
        set_textbox_value(driver, format_message(message))
        trigger_change_event(driver)
        driver.find_element_by_xpath(send_button_xpath).click()
    

    Con estos pasos, el mensaje enviado debería tener el contenido exacto que se introdujo, incluyendo todos los caracteres y saltos de línea.

Comments are closed.