1 votos

¿Cómo rellenar automáticamente los formularios personalizados?

Tengo una aplicación web que utilizo con frecuencia, que tiene este tipo de formularios:

<form method=POST action=...>
  <input type=text name=urname placeholder=urname>
  <input type=text name=secretid placeholder=secretid>
  <input type=text name=otherfield placeholder=otherfield>
  <input type=submit>
</form>

Lo que quiero hacer es poder autocompletar esos campos con los valores especificados (por ejemplo: urname=kristian, secretid=abcdefghijkl, otherfield=000111222333444555666777888999).

Actualmente lo hago abriendo la aplicación "nota" y luego copiando y pegando su contenido cada vez, lo que puede resultar tedioso ya que es bastante largo y tengo que ir y venir 3 veces. Además, el contenido de la entrada de autocompletar no es precisamente un secreto.

¿Hay alguna manera de hacerlo?

He encontrado una pregunta con un problema similar en Super User: Rellenar automáticamente los formularios web (pero en lugar de Chrome en PC quiero hacerlo en Chrome en Android). Los comentarios parecen recomendar una extensión de Cchrome que puede inyectar JavaScript en la página. Eso no me importa, puedo escribir JS, pero creo que las extensiones de Chrome no están disponibles en Android.

EDIT: Encontré aquí que puedo ejecutar JS marcado a través de cromo sin extensiones aquí: ¿Cómo se puede AÑADIR un bookmarklet en Chrome móvil sin copiar y pegar?

Así que hice un marcador con dicho contenido:

javascript:(function(){ document.querySelector(`#urname`).value=`kristian`; document.querySelector(`#secretid`).value=`abcdefghijkl` ; document.querySelector(`#otherfield`).value=`000111222333444555666777888999` ; })()

Lo cual si se embellece/formatea se verá así:

javascript:(function(){
  document.querySelector(`#urname`).value=`kristian`;
  document.querySelector(`#secretid`).value=`abcdefghijkl` ;
  document.querySelector(`#otherfield`).value=`000111222333444555666777888999` ; 
})()

Pero todavía tengo un problema: la página parece utilizar algún tipo de enlace de datos (por ejemplo: react two-way binding). Así que cuando el valor se cambió a través de JS, cuando hago clic en el elemento vuelve a su antiguo valor (vacío). ¿Cómo puedo evitarlo?

0voto

Kristian Puntos 111

Después de investigar un poco y escarbar en los temas de github, aquí está mi propia solución:

En general tengo que hacer:

  1. inyectar JS personalizado/autoescrito a chrome Android
  2. averiguar por qué no ha funcionado y el valor del elemento vuelve a su valor antiguo / vacío
  3. llamar a la función correcta para que el marco 'react' pueda cambiar el elemento de entrada Y sus datos internos/vinculados de dos maneras

Primer paso: inyectar JS personalizado/autoescrito a chrome Android

De esta pregunta: ¿Cómo se puede AÑADIR un bookmarklet en Chrome móvil sin copiar y pegar? He aprendido que puedo añadir JavaScript personalizado a los marcadores en chrome

Primer paso despejado

Segundo paso: averiguar por qué no ha funcionado y el valor del elemento vuelve a su valor antiguo / vacío

En primer lugar, me pregunto por qué el valor no se cambió incluso después de inyectar el código como:

document.querySelector(`#otherfield`).value=`000111222333444555666777888999` ; 

Así que sospeché si utilizaba algún tipo de marco de JavaScript para hacer la vinculación de datos de 2 vías (vincular un valor variable con un elemento de entrada).

Para detectar qué marco utilizaron, instalé esta extensión: Library Detector https://chrome.google.com/webstore/detail/library-detector/cgaocdmhkmfnkdkbnckgmpopcbpaaejo (descargo de responsabilidad: no estoy asociado con el autor de dicha extensión)

El resultado: utilizaron react.js

Por lo tanto, la razón por la que no funcionó y el valor del elemento cambia de nuevo a su valor antiguo / vacío es porque utilizó el enlace de datos de 2 vías

El segundo paso se ha despejado

Tercer paso: llamar a la función correcta para que el framework 'react' pueda cambiar el elemento de entrada Y sus datos internos/vinculados de dos maneras

Después de buscar en Google, encuentro este problema en Github: https://github.com/facebook/react/issues/11488 que enlaza con el comentario de este tema: https://github.com/facebook/react/issues/10135#issuecomment-314441175

Básicamente la solución es llamar a dicha función:

function setNativeValue(element, value) {
  const valueSetter = Object.getOwnPropertyDescriptor(element, 'value').set;
  const prototype = Object.getPrototypeOf(element);
  const prototypeValueSetter = Object.getOwnPropertyDescriptor(prototype, 'value').set;
  if (valueSetter && valueSetter !== prototypeValueSetter) {
    prototypeValueSetter.call(element, value);
  } else {
    valueSetter.call(element, value);
  }
}

setNativeValue(textarea, 'some text');
textarea.dispatchEvent(new Event('input', { bubbles: true }));

Después de cambiar mi JS a

function setNativeValue(element, value) {
  const valueSetter = Object.getOwnPropertyDescriptor(element, 'value').set;
  const prototype = Object.getPrototypeOf(element);
  const prototypeValueSetter = Object.getOwnPropertyDescriptor(prototype, 'value').set;

  if (valueSetter && valueSetter !== prototypeValueSetter) {
    prototypeValueSetter.call(element, value);
  } else {
    valueSetter.call(element, value);
  }
}

var element1 = document.querySelector(`#urname`);
setNativeValue(element1, `kristian`);
element1.dispatchEvent(new Event('input', { bubbles: true }));

var element2 = document.querySelector(`#secretid`);
setNativeValue(element2, `abcdefghijkl`);
element2.dispatchEvent(new Event('input', { bubbles: true }));

var element3 = document.querySelector(`#otherfield`);
setNativeValue(element3, `000111222333444555666777888999`);
element3.dispatchEvent(new Event('input', { bubbles: true }));

Y luego encerrarlos en

javascript:(function(){  ...  })()

Ahora funciona perfectamente

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X