web-dev-qa-db-fra.com

L'événement selenium click () ne semble pas toujours être déclenché => résultats en timeout?

Voici ce que je fais:

Selenium.click("link=mylink");
Selenium.waitForPageToLoad(60000);

// do something, then navigate to a different page 
// (window focus is never changed in-between)

Selenium.click("link=mylink");
Selenium.waitForPageToLoad(60000);

Le lien "mylink" existe, la première invocation de click () fonctionne toujours. Mais le deuxième clic () semble parfois fonctionner, parfois pas.

Il semble que l'événement click () ne soit pas déclenché du tout, car la page ne commence même pas à se charger. Malheureusement, ce comportement est sous-critique.

Voici ce que j'ai déjà essayé:

  1. Définir un délai d'attente plus long
    => n'a pas aidé

  2. Attendre la présence d'un élément après avoir chargé une page
    => ne fonctionne pas non plus puisque la page ne commence même pas à se charger

Pour l'instant j'ai fini par invoquer click () deux fois, donc:

Selenium.click("link=mylink");
Selenium.waitForPageToLoad(60000);

// do something, then navigate to a different page 
// (window focus is never changed in-between)

Selenium.click("link=mylink");
Selenium.click("link=mylink");
Selenium.waitForPageToLoad(60000);

Cela fonctionnera, mais ce n’est pas une solution vraiment agréable. J'ai également vu dans un autre forum où quelqu'un a suggéré d'écrire quelque chose comme un "clickAndWaitWithRetry":

  try {
      super.click("link=mylink");
      super.waitForPageToLoad(60000);
  }
  catch (SeleniumException e) {
      super.click("link=mylink");
      super.waitForPageToLoad(60000);
  }

Mais je pense que ce n'est pas non plus une solution appropriée .... Des idées/explications pour lesquelles l'événement click () n'est parfois pas déclenché?

26
blackicecube

Parfois, apparemment au hasard, Selenium n'aime pas cliquer sur certaines balises d'ancrage. Je ne suis pas sûr de ce qui le cause, mais ça arrive. Je trouve dans ces cas w/un lien gênant au lieu de faire 

Selenium.click(...)

faire

Selenium.fireEvent( locator, 'click' );

Comme d’autres l’ont dit plus haut, j’ai eu des problèmes particuliers avec les balises d’ancrage qui apparaissent comme suit:

<a href="javascript:...." >
10
Andrew Martinez

Je fais Selenium depuis un certain temps et j'ai vraiment développé une aversion pour waitForPageToLoad (). Vous pouvez envisager de toujours attendre que l'élément en question existe. 

Je trouve que cette méthode semble résoudre les problèmes les plus étranges que je rencontre de cette manière. L'autre possibilité est que vous ayez du javascript empêchant le lien de faire quoi que ce soit lorsque vous cliquez dessus pour la première fois. Cela semble peu probable, mais mérite une double vérification.

4
Eric Wendelin

Je viens d'essayer WebDriver (Selenium 2.0) et j'ai constaté que WebElement # sendKeys (Keys.ENTER) fonctionnait.

3
Firefight

L'événement selenium click () ne semble pas toujours être déclenché => résultats en timeout?

Essayez Selenium.pause avant la commande Selenium.click. J'ai tout essayé ci-dessus mais aucun d'entre eux ne semble résoudre notre problème. Donc finalement nous avons eu un Magic Selenium.pause qui a résolu le problème pour moi ..

J'espère que cela résoudra aussi votre problème

3
Sandeep Kumar

J'ai eu le même problème - avec Selenium 1.0.12 et Firefox 5.0; J'ai réussi à faire fonctionner les tests automatisés de cette façon: 

  • J'ai enlevé toutes les commandes "AndWait" (parfois ils accrochent le test/navigateur)
  • J'ai ajouté une pause avant le clic 
  • J'ai ajouté un waitForVisible après le clic (d'habitude j'attends le prochain contrôle html avec lequel je veux interagir à la page suivante). 

Ça va comme ça:

  • waitForVisible OK
  • pause 1000
  • cliquez sur OK
  • waitForVisible link = Go
  • pause 1000
  • cliquez sur Go

etc...

Il semble que "waitForVisible" soit déclenché trop tôt, c'est-à-dire avant que le gestionnaire d'événements ne soit branché sur le contrôle (le fait de cliquer sur le contrôle n'a aucun effet). Si vous attendez 1 seconde, il est suffisant de connecter/activer les gestionnaires de clics ...

2
Edot

Ici celui-ci fonctionnera: 

Selenium.waitForPageToLoad("60000");

Selenium.click("link= my link");
2
Vinesh

Je rencontre aussi ce problème maintenant. D'après mes usages, il semble que ce qui suit soit le plus cohérent:

@browser.click(selector, {:wait_for => :page})

Je ne sais pas trop pourquoi. Mais il semble que si vous le faites:

@browser.click(selector)
   [maybe some stuff here too]
@browser.wait_for(:wait_for => :page)

Ensuite, vous pouvez attendre une page qui a déjà été chargée (c’est-à-dire que vous attendez pour toujours).

J'ai fouillé dans le code source de Selenium et trouvé cette pépite:

  def click(locator, options={})
    remote_control_command "click", [locator,]
    wait_for options
  end

...

  # Waits for a new page to load.
  #
  # Selenium constantly keeps track of new pages loading, and sets a
  # "newPageLoaded" flag when it first notices a page load. Running
  # any other Selenium command after turns the flag to false. Hence,
  # if you want to wait for a page to load, you must wait immediately
  # after a Selenium command that caused a page-load.
  #
  # * 'timeout_in_seconds' is a timeout in seconds, after which this
  #   command will return with an error
  def wait_for_page(timeout_in_seconds=nil)
    remote_control_command "waitForPageToLoad",
        [actual_timeout_in_milliseconds(timeout_in_seconds),]
  end
  alias_method :wait_for_page_to_load, :wait_for_page

Fondamentalement, cela fait ce qui suit:

@browser.click(selector)
@browser.wait_for(:wait_for => :page)

Cependant, comme le dit le commentaire, la première chose à faire est d’utiliser la commande: wait_for immédiatement après.

Et bien sûr ... changer l'ordre vous met dans le même état d'attente pour toujours.

@browser.wait_for(:wait_for => :page)
@browser.click(selector)

Sans connaître tous les détails de Selenium, il semble que Selenium ait besoin d'enregistrer le déclencheur: wait_for lorsqu'il est passé en tant qu'option avec click . Sinon, vous pourriez vous retrouver à attendre pour toujours si vous demandez à Selenium d'attendre l'instant précédent: wait_for est appelé.

2
mdgreenfield

Assurez-vous d’augmenter le délai au bon endroit. Les lignes que vous avez postées sont:

Selenium.click("link=mylink");
Selenium.waitForPageToLoad(60000);

Cette attente est pour la page à charger qui revient après le clic. Mais le problème que vous décrivez est qu’il échoue lorsque vous essayez de faire le clic. Donc, assurez-vous d'augmenter l'attente avant celle-ci. 

Selenium.click("link=mylink");
Selenium.waitForPageToLoad(60000);

// do something, then navigate to a different page 
// (window focus is never changed in-between)
// after the last click in these steps:
Selenium.waitForPageToLoad(60000);
// anything else that happened after that

Selenium.click("link=mylink");
Selenium.waitForPageToLoad(60000);
1
eglasius

La page n'a pas été chargée correctement lorsque vous cliquez dessus. Recherchez différents éléments sur la page pour vous assurer que la page a été chargée.

Aussi, attendez que le lien apparaisse et soit visible avant de cliquer dessus.

1
Vijay Kotari

Si vous utilisez FireFox, assurez-vous que vous utilisez la version 3.6 ou ultérieure. WaitForPageToLoad utilise la variable javascript 'readyState', mais Firefox ne la prend en charge que dans la version 3.6. Les versions précédentes n'attendent pas

(voir org.openqa.Selenium.internal.seleniumemulation.WaitForPageToLoad)

1
racraman

J'ai le même problème :( avec Selenium IDE 1.0.10, phpunit 3.5, serveur Selenium RC 1.0.3 

 EDITED: 
 The culprit seems to be browser FF 3.6.13 , after upgrade to FF 3.6.14
  all my errors are  gone . My tests are working like charm :). 

 Selenium IDE 1.0.10
 PHPUnit: 3.5.6
 Selenium Server:Selenium-2.0b1 (Selenium-2.0b2 is buggy)
0
sakhunzai

J'ai eu le même problème et a constaté que je devais d'abord obtenir le texte du lien. Je sais que ce n'est pas la manière idéale de le faire, mais j'ai la chance que mes liens portent un nom unique.

Code C #:

var text = Selenium.GetText(myLocator);
Selenium.Click("link=" + text);
0
Jesse Sanders
Selenium.click("link=Continue to this website (not recommended).");
Thread.sleep(5000);
0
Mayank

Essaye ça:

Selenium.fireEvent(ID, "keypress");
0
Amine