2017-03-14 3 views
2

J'écris un script d'utilisateur et je n'arrive pas à remplir un formulaire fait par reactjs. Mon code:Remplir le formulaire reacjs par programmation

document.querySelector("#id-username").value = "[email protected]"; 
// Attempt to notify framework using input event 
document.querySelector("#id-username").dispatchEvent(new Event("input", {data:"[email protected]"})); 
// Attempt to notify framework using change event 
document.querySelector("#id-username").dispatchEvent(new Event("change")); 
// This doesn't help either 
document.querySelector("#id-username").dispatchEvent(new Event("blur")); 
// Submit the form using button (it's AJAX form) 
document.querySelector("fieldset div.wrap button").click(); 

je suis entré dans ce code dans la console d'outils de Developper après le chargement de la page. Cependant, la forme ne tient pas compte de mon entrée programatical:

image description

Le formulaire est disponible here. Le but de mon travail est d'automatiser la connexion au site Web donné. J'ai fourni l'URL spécifique, mais j'attends une solution générique à ce problème (par exemple en utilisant une API de reactjs) qui peut être appliquée à n'importe quelle forme de réaction. D'autres utilisateurs peuvent avoir besoin de cette solution pour écrire des tests automatisés pour leurs sites.

+1

Il ne devrait pas être quelque chose de spécial à ce sujet étant une forme React. Vous pouvez juste attendre que document.load ait été déclenché avant d'essayer d'automatiser. Par exemple, j'ai exécuté votre première ligne à partir de la console et il a rempli la boîte de nom d'utilisateur très bien. –

+0

Utilisez simplement waitForKeyElements ou MutationObserver. –

+0

@KeithRousseau J'ai testé cela dans la console de Firefox (longtemps après le chargement). Les résultats que vous voyez ne sont pas d'usercript, je n'ai même pas commencé à l'écrire. Je viens de tester ces commandes après le chargement de la page et il a déjà échoué. –

Répondre

5

L'événement doit être émis vers ReactJS pour qu'il enregistre la valeur. En particulier, l'événement input. Il est vraiment important de s'assurer que l'événement bubbles - React JS a un seul écouteur au niveau document, plutôt que sur le champ de saisie. J'ai conçu la méthode suivante pour définir la valeur de l'élément de champ de saisie:

function reactJSSetValue(elm, value) { 
    elm.value = value; 
    elm.defaultValue = value; 
    elm.dispatchEvent(new Event("input", {bubbles: true, target: elm, data: value})); 
} 
+0

C'était exactement ce que je cherchais. Une correction: votre paramètre cible dans l'événement doit être changé en elm au lieu du nom d'utilisateur. – funkju