web-dev-qa-db-fra.com

Le sélénium clique sur un élément «avec succès», mais il n'est pas réellement cliqué

J'ai une méthode qui clique sur un bouton, cependant, quand il est exécuté, Selenium renvoie le résultat comme cliqué avec succès, alors qu'en réalité, le bouton n'est pas réellement cliqué. Si j'exécute le test plusieurs fois, parfois, il sera cliqué comme prévu. J'ai mon cadre de test défini comme une attente implicite pendant environ 15 secondes, j'ai défini une attente explicite pour cet élément et je vois toujours le même problème. Quand je fais <element>.isDisplayed(), l'élément est toujours trouvé. J'ai placé le .click dans une boucle while pour le cliquer plusieurs fois, ce qui fonctionne la plupart du temps, cependant, le test échoue parfois. Est-il possible d'avoir une instruction if pour vérifier si un élément est réellement affiché avant de cliquer sur le bouton?

J'ai essayé:

if(!element.isDisplayed){
    element.click
}

Voici le bouton avec lequel j'ai des problèmes:

<button class="notkoButton listNew">
<div class="l6e iconAdd">New List</div>
</button>

Voici ma méthode:

public marketing_lists_page navigateToNewListPage() throws Throwable {
    try {
        int x = 0;
        while(x < 5) {
            newListBtn.click();
            x++;
        }
       //newListPageHeader.isDisplayed();
    } catch (NoSuchElementException e){
        logs.errorDetails("Could not navigate to New List Page");
        Assert.fail();
    }
    return this;
}
10
Saleh Qadan

Il semble que l'élément ne soit pas activé ou cliquable au départ. Et pour répondre à votre question, oui il y a une attente explicite que vous pouvez utiliser et attendez que l'élément soit cliquable:

WebDriverWait wait = new WebDriverWait(driver, timeOut);
wait.until(ExpectedConditions.elementToBeClickable(locator));
4
AGill

Essayez ceci, cliquez sur en utilisant javascript et n'hésitez pas à modifier la localisation de l'élément selon votre convenance: -

WebElement element= driver.findElement(By.xpath("YOUR XPATH"));

JavascriptExecutor executor = (JavascriptExecutor) driver;
executor.executeScript("arguments[0].click();", element);

J'espère que cela vous aidera :)

2
Shubham Jain

Essayez de faire défiler jusqu'à l'élément avant de cliquer dessus. Cela se produit principalement lorsque vous testez sur Chrome. Vous pouvez utiliser JavaScriptExecutor pour faire défiler.

Quelque chose comme ça:

JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("window.scrollTo(0," + element.getLocation().Y + ")"); 
2
Prat0567

J'étais confronté exactement au même problème, mais seulement après avoir mis à jour mes bibliothèques Selenium de 2.45 à 2.48.2. L'appel de la méthode "Click" n'échoue jamais, ce qui signifie que l'élément est toujours trouvé par le pilote, ce que je pense qu'il ne parvient pas à faire est de cliquer au bon endroit. Mon test fonctionnerait bien sur un écran de résolution plus élevé et passerait parfois (mais échouera principalement en raison de problèmes de clic) sur un écran de résolution inférieur. J'ai essayé beaucoup de choses mais au final, ce qui a fonctionné pour moi, c'est ZOOM.

Avant d'exécuter le test, j'appelle la méthode suivante et la méthode "click" fonctionne comme prévu sur cet écran basse résolution maintenant.

public void zoomOut () {
        WebElement html = driver.findElement(By.tagName("html"));
        html.sendKeys(Keys.chord(Keys.CONTROL, Keys.SUBTRACT));
}
0
Shahzaib Salim

Vous dites que vous avez essayé une attente explicite, mais il semble que ce que vous demandez peut être mieux accompli par un fluentWait (qui est un type d'attente explicite):

public WebElement fluentWait(final By locator) {
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
        .withTimeout(30, TimeUnit.SECONDS)
        .pollingEvery(5, TimeUnit.SECONDS)
        .ignoring(NoSuchElementException.class);

WebElement foo = wait.until(new Function<WebDriver, WebElement>() {
    public WebElement apply(WebDriver driver) {
        return driver.findElement(locator);
    }
});

return  foo; };;

Ici, WebElement serait le bouton sur lequel vous essayez de cliquer. Ce qui est cool avec FluentWait, c'est que l'élément lui-même est retourné s'il est trouvé. De la documentation:

ne implémentation de l'interface d'attente dont le délai d'expiration et l'intervalle d'interrogation peuvent être configurés à la volée. Chaque instance de FluentWait définit la durée maximale d'attente d'une condition, ainsi que la fréquence à laquelle la vérifier. De plus, l'utilisateur peut configurer l'attente pour ignorer des types spécifiques d'exceptions pendant l'attente, comme NoSuchElementExceptions lors de la recherche d'un élément sur la page.

Pour l'utiliser, faites simplement:

WebElement newListBtn = fluentWait(By.id("button"));

Essayez aussi:

Driver.SwitchTo().DefaultContent();

avant de cliquer juste au cas où ce serait un problème de trame.

0
marchocolate

Le sélénium souffre d'un manque de "dynamisme" de l'interface graphique. Par cela je vous conseille d'envoyer un rafraîchissement à la page après votre clic.

Dites-moi ce qui se passe.

0
e1che

J'ai également remarqué que les clics n'étaient pas cohérents avec Selenium, cela semble être un problème connu dans une certaine mesure:

https://github.com/SeleniumHQ/Selenium/issues/4075

Dans mon cas, il n'y a pratiquement aucun moyen pour que l'élément ne soit pas prêt. J'ai eu une attente, mais plus important encore, mon scénario de test remplissait un très grand formulaire, le bouton sur lequel cliquer pour lancer une liste déroulante est très simple et je peux le voir se charger près d'une demi-minute avant mon test interagit avec elle, mais de temps en temps, elle échouait toujours. Au point où j'ai écrit une boucle idiote en cliquant toutes les 100 millisecondes jusqu'à ce que la liste déroulante attendue apparaisse.

Tout cela devine, mais d'après l'observance personnelle et certains commentaires d'autres personnes dans ce fil - comme un utilisateur mentionnant qu'il remarque plus de problèmes comme celui-ci lors de l'exécution de tests parallèles, semble indiquer qu'il est possible que ce qui semble être un événement manqué, et peut-être cela est dû au retard introduit par son architecture. Plus précisément, je compare cela à la façon dont Cypress fonctionne avec les commandes natives transmises directement au navigateur sans le serveur intermédiaire.

0
JacksonWong

J'ai eu ce qui ressemblait à un problème similaire à la surface lors de l'utilisation de JavaScript WebDriver - la promesse click () a été résolue avec succès, et pourtant rien ne s'est produit.

Dans mon cas, il s'est avéré être lié à un attribut src d'image non valide sur la page (sans rapport avec le bouton sur lequel je cliquais). Pour une raison quelconque, la correction du lien d'image a résolu le problème!

Je sais que l'OP utilisait Java plutôt que JS, mais mes propres recherches m'ont amené ici, donc d'autres utilisant JavaScript viendront probablement de la même manière.

0
John Rix