web-dev-qa-db-fra.com

La méthode Click () ne fonctionnera pas toujours

J'ai un problème avec mes tests dans Selenium WebDriver. L'événement Click ne fonctionne pas toujours lorsqu'un programme essaie de cliquer sur le bouton. Dans un test, tout va bien, dans d'autres, ce n'est pas le cas. 

Chaque test commence à partir d'une page. Tout d'abord, l'utilisateur doit choisir une option dans un composant select, puis l'utilisateur clique sur un bouton. 

Je veux savoir pourquoi une fois, tout va bien et quand je lance des tests une seconde fois, ce n'est pas le cas.

Voici le code source pour trouver et cliquer sur le bouton:

public void clickContinueBtn() {    
    webElement = driver.findElement(By.xpath("//div[@class='btn Magenta_s']/a/span"));
    webElement.click(); 
}
22
user1494328

J'ai rencontré un problème similaire. La méthode de clic fonctionnait sur d'autres pages, puis ne fonctionnait pas du tout sur une page particulière. 

Une condition de concurrence a causé le problème:

  1. Le contenu HTML est rendu avec le bouton désactivé.
  2. Le script de pilote Web Selenium a été exécuté avant le déclenchement de l’événement javascript onload(ou l’exécution terminée). Donc, le button.click se produirait sur un élément désactivé. Et rien ne se passerait.
  3. Ensuite, l'événement javascript onload déclenchera (ou terminera l'exécution) et le javascript activera le bouton.
  4. J'ai regardé la page et je ne pouvais pas comprendre pourquoi mon code ne fonctionnait pas, car le bouton semblait être activé lors de l'inspection. Si je cliquais manuellement sur le bouton, cela fonctionnait.

Une fois que j'ai compris qu'il s'agissait d'un problème de synchronisation, j'ai trouvé la solution ici: Comment puis-je faire en sorte que Selenium Web Driver attend qu'un élément soit accessible, et pas seulement présent?

Pour paraphraser la solution dans Ruby:

//This will not return the button until it is enabled.
button = driver.find_element(:xpath,  "//button[@id='myButtonId' and not(@disabled)]")
button.click
20
Walker D

Vous pouvez également essayer d’utiliser la méthode alternative basée sur Javascript pour cliquer. Le code pour cela peut être comme suit:

WebElement element = driver.findElement(By.id("something"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", element);
17
Arek

Cela arrive souvent à cause de la compatibilité du navigateur (principalement sur Firefox). Essayez donc d'utiliser "WebElement.sendKeys (Keys.ENTER);" code au lieu de "webElement.click ();"

3
Rakesh Gajarmal

Vous êtes-vous assuré qu'il n'y a pas de problème de timing? Faites un point d'arrêt avant de trouver l'élément et vérifiez si votre code fonctionne correctement. S'il y a un problème de synchronisation, utilisez une attente explicite avant de cliquer sur votre bouton. Notez également que le bouton doit être cliquable (l'élément doit être visible ET activé) avant de cliquer dessus. 

une solution avec attente explicite pourrait ressembler à ceci:

By by = By.xpath("//div[@class='btn Magenta_s']/a/span");
WebDriverWait w = new WebDriverWait(driver, timeout);
WebElement element = w.waitUntil(ExpectedConditions.elementToBeClickable(by);
element.click();
2
loother

J'ai rencontré un problème similaire il y a quelques jours et j'ai trouvé la solution dans mon cas particulier. === En utilisant Selenium Webdriver, je voulais cliquer sur le lien "Premier lien" et charger le contenu sur la page.

Ci-dessous une partie du code de structure semblable à mon cas:

<li class="first-link">
    <a class="common-style" href="javascript:;" style="padding-left: 15px; padding-right: 15px;">First Link</a>
</li>

=== Le Webelement est supposé être trouvé et cliqué, mais rien ne s'est passé, aucune erreur n'a été renvoyée (élément non trouvé, élément non prêt au clic, élément désactivé, etc.).

Après avoir essayé plusieurs manières de trouver le lien via (xpath et css, je n'ai pas essayé par id car, dans mon cas, il n'y a pas d'identifiant unique), j'ai pu accéder à l'élément avec Selenium webdriver by css avec la valeur suivante : li.first-link a. Cependant, lorsque j'ai essayé d'accéder par xpath avec la valeur suivante, cela était 'trouvé' dans Firefox mais cliquez sur ne fonctionnait pas: .//li[a/text()='First Link'].

Le problème était un léger problème de syntaxe xpath, ce firebug de Firefox n'a pas signalé du tout, en fait, il a trouvé le lien.

J'ai changé l'ordre des accolades comme ceci: .//li/a[text()='First Link']Maintenant, cela fonctionne comme prévu, le premier lien est trouvé et cliqué et le code javascript qui charge la page est déclenché. 

Mes constatations sont les suivantes: * Ce n’est pas un problème de synchronisation; cela ne se produit donc pas car vous essayez de cliquer sur un élément qui n’est pas prêt. Sinon, nous avions résolu ce problème avec une attente explicite de Selenium ...

  • Le problème n'est pas que l'élément est trouvé et que le javascript n'est pas déclenché. Vous pouvez essayer d'exécuter directement du code javascript et de déclencher manuellement les événements et voir que cela ne fonctionne pas.
  • Ce problème se produit sur Firefox 22, fonctionne probablement pour les anciennes versions de ce navigateur. Je ne peux pas fournir d'informations si cela fonctionne sur IE ou Chrome. Le problème en lui-même est que même s'il existe un conflit de syntaxe sur xpath, firefox ne lance pas une exception, ce qui vous fait penser qu'il n'y a rien de mal avec votre code, mais il y en a.
  • Ceci est un comportement inattendu et non géré pour Firefox. J'ai trouvé un bogue signalé pour cela: http://code.google.com/p/Selenium/issues/detail?id=4757

SOLUTION SUGGÉRÉE: vérifiez votre structure html, votre xpath, essayez de trouver des problèmes de syntaxe, trouvez différentes manières d'accéder à l'élément.

0
Romita Dinda

Essayez ci-dessous le code parfois vous avez délibérément déplacé votre attention vers vos éléments 

WebElement element = driver.findElement("yourElement");
        Actions builder = new Actions(driver);
        builder.moveToElement(element).click(element);
        builder.perform();
0
Jitesh Lakhwani

En regardant votre xpath, vous n'avez pas identifié le bouton, mais vous pointez sur la balise span à l'intérieur de laquelle le bouton est présent. Sélénium clique sur l'étendue au lieu du bouton. C'est pourquoi click () ne fonctionne pas. Veuillez utiliser un identifiant ou un nom, le cas échéant, ou modifier le chemin xpath pour inclure également la balise du bouton. Si vous pouvez poster le code HTML, il sera facile de créer le xpath. click () fonctionne parfaitement pour moi et j'utilise cette méthode depuis plus d'un an dans un projet et chaque fois que cela fonctionne bien ...

0
Vinay