80 votes

PhantomJS; cliquez sur un élément

Comment cliquer sur un élément dans PhantomJS?

 page.evaluate(function() {
    document.getElementById('idButtonSpan').click();  
});
 

Cela me donne une erreur "indéfini n'est pas une fonction ..."

Si je plutôt

  return document.getElementById('idButtonSpan');
 

puis imprimez-le,

ensuite, il imprime [objet objet], de sorte que l'élément existe.

L'élément agit comme un bouton, mais il ne s'agit en fait que d'un élément span et non d'une entrée de soumission.

J'ai pu obtenir ce clic sur ce bouton pour travailler avec Casper, mais Casper avait d'autres limitations, je suis donc revenu à PhantomJS.

66voto

torazaburo Points 6335

.click() n'est pas standard. Vous devez créer un événement et l'envoyer:

 function click(el){
    var ev = document.createEvent("MouseEvent");
    ev.initMouseEvent(
        "click",
        true /* bubble */, true /* cancelable */,
        window, null,
        0, 0, 0, 0, /* coordinates */
        false, false, false, false, /* modifier keys */
        0 /*left*/, null
    );
    el.dispatchEvent(ev);
}
 

34voto

TheCloudlessSky Points 7706

Alternativement à la réponse de @ torazaburo, vous pouvez utiliser HTMLElement.prototype.click lors de l'exécution dans PhantomJS. Par exemple, nous utilisons PhantomJS + QUnit pour exécuter nos tests et dans notre qunit-config.js nous avons quelque chose comme ceci:

 if (window._phantom) {
  // Patch since PhantomJS does not implement click() on HTMLElement. In some 
  // cases we need to execute the native click on an element. However, jQuery's 
  // $.fn.click() does not dispatch to the native function on <a> elements, so we
  // can't use it in our implementations: $el[0].click() to correctly dispatch.
  if (!HTMLElement.prototype.click) {
    HTMLElement.prototype.click = function() {
      var ev = document.createEvent('MouseEvent');
      ev.initMouseEvent(
          'click',
          /*bubble*/true, /*cancelable*/true,
          window, null,
          0, 0, 0, 0, /*coordinates*/
          false, false, false, false, /*modifier keys*/
          0/*button=left*/, null
      );
      this.dispatchEvent(ev);
    };
  }
}
 

15voto

stovroz Points 1486

Ce n'est pas joli, mais je l'utilise pour me permettre d'utiliser jQuery pour la sélection:

 var rect = page.evaluate(function() {
    return $('a.whatever')[0].getBoundingClientRect();
});
page.sendEvent('click', rect.left + rect.width / 2, rect.top + rect.height / 2);
 

mais vous pouvez toujours remplacer $(s)[0] par document.querySelector(s) si vous n'utilisez pas jQuery.

(Cela dépend de l’élément étant dans l’esprit de la vue, c’est-à-dire que votre viewportSize.height est suffisamment grand).

10voto

Jobins John Points 11

J'espère que la méthode suivante sera utile. Cela a fonctionné pour moi dans la version 1.9

 page.evaluate(function(){
    var a = document.getElementById("spr-sign-in-btn-standard");
    var e = document.createEvent('MouseEvents');
    e.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
    a.dispatchEvent(e);
    waitforload = true;
});
 

Cela a fonctionné pour moi. J'espère que cela sera utile pour d'autres aussi

6voto

sshaw Points 547

Avec 1.9.2 cela a fonctionné pour moi, les gestionnaires de clics se sont déclenchés:

 var a = page.evaluate(function() {
    return document.querySelector('a.open');
});

page.sendEvent('click', a.offsetLeft, a.offsetTop);
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X