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();
}
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:
button.click
se produirait sur un élément désactivé. Et rien ne se passerait.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
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);
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 ();"
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();
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 ...
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.
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();
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 ...