¿Cómo hago para que Greasemonkey haga clic en un botón que solo aparece después de un retraso?

He visto muchas preguntas similares y he intentado todo lo que puedo pensar para que esto funcione por mi cuenta.

Primero, el código relevante (¿de la página de destino?):

document.getElementById('btn_submit').innerHTML = ' '; 

Básicamente, hay un temporizador en la página y el “¡haz clic en mí ahora!” El botón aparece después de 3 segundos, esa es la parte en la que quiero hacer clic.

Este es mi código No funciona:

 // ==UserScript== // @name abc // @namespace something // @description abc Scripty // @include * // @version 1 // ==/UserScript== (function ClicktheButton(obj) { var evt = document.createEvent("MouseEvents"); evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); var canceled = !obj.dispatchEvent(evt); /* if(canceled) { // A handler called preventDefault alert("canceled"); } else { // None of the handlers called preventDefault alert("not canceled"); } */ } var StupidButton = document.querySelector.innerHTML('input[type="submit"][value=" Click Me Now! "]'); ClicktheButton(StupidButton); 

Ese código tiene errores. Use la consola de error de Firefox ( Ctrl Shift J ) para verlos. Usar jslint para verificar tu código también puede ser útil.

De todos modos, este es un problema común de Greasemonkey. Use la herramienta waitForKeyElements () para manejar la apariencia retrasada de ese botón. Use jQuery para simplificar el código (y hacerlo más robusto y portátil).

Entonces tu script se convertiría en:

 // ==UserScript== // @name _YOUR_NAME // @include http://YOUR_SERVER.COM/YOUR_PATH/* // @require http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js // @require https://gist.github.com/raw/2625891/waitForKeyElements.js // @grant GM_addStyle // ==/UserScript== /*- The @grant directive is needed to work around a design change introduced in GM 1.0. It restres the sandbox. */ function clickSubmitBtnWhenItAppears (jNode) { var clickEvent = document.createEvent ('MouseEvents'); clickEvent.initEvent ('click', true, true); jNode[0].dispatchEvent (clickEvent); } //-- Value match is case-sensitive waitForKeyElements ( //"#btn_submit input[type='submit'][value*='Click Me Now']", "input[type='submit'][value*='Click Me Now']", clickSubmitBtnWhenItAppears );