web-dev-qa-db-fra.com

Vérifiez si l’élément est cliquable dans Selenium Java

Je suis nouveau dans Selenium et j'ai besoin de vérifier si l'élément est cliquable dans SeleniumJava, puisque element.click() passe les deux sur link et label.

J'ai essayé d'utiliser le code ci-dessous mais ne fonctionne pas:

WebDriverWait wait = new WebDriverWait(Scenario1Test.driver, 10);

if(wait.until(ExpectedConditions.elementToBeClickable(By.xpath("(//div[@id='brandSlider']/div[1]/div/div/div/img)[50]")))==null)

Besoin d'aide sur ceci.

10
Sandeep Krishnappa

elementToBeClickable est utilisé pour vérifier qu'un élément est visible et activé de sorte que vous puissiez cliquer dessus.

ExpectedConditions.elementToBeClickable Retourne WebElement si la condition attendue est vraie, sinon elle jettera TimeoutException , elle ne retournera jamais null.

Donc, si vous utilisez ExpectedConditions.elementToBeClickable Pour trouver un élément qui vous donnera toujours l'élément sur lequel vous pouvez cliquer , vous n'avez donc pas besoin de vérifier null condition, vous devriez essayer comme ci-dessous: -

WebDriverWait wait = new WebDriverWait(Scenario1Test.driver, 10); 
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("(//div[@id='brandSlider']/div[1]/div/div/div/img)[50]")));
element.click();

Lorsque vous dites que element.click() passe à la fois sur link et label, cela ne signifie pas que l’élément n’est pas cliquable, cela signifie que l’élément retourné clicked est peut-être il n'y a pas d'événement effectué sur élément par action de clic.

Note : - Je vous suggère de toujours essayer d'abord de rechercher les éléments par id, name, className et autre localisateur. si vous rencontrez des difficultés à trouver, utilisez cssSelector et donnez toujours la dernière priorité à xpath locator car il est plus lent que les autres localisateurs pour localiser un élément.

J'espère que ça vous aide .. :)

14
Saurabh Gaur

Il y a des cas où element.isDisplayed() && element.isEnabled() retournera true mais que l'élément sera pas être cliquable, car il est caché/recouvert par un autre élément.

Dans ce cas, Exception catch est:

org.openqa.Selenium.WebDriverException: erreur inconnue: l'élément n'est pas cliquable au point (781, 704). Un autre élément recevrait le clic: <div class="footer">...</div>

Utilisez ce code à la place:

WebElement  element=driver.findElement(By.xpath"");  
JavascriptExecutor ex=(JavascriptExecutor)driver;
ex.executeScript("arguments[0].click()", element);

Ça va marcher.

11
user8639449

wait.until(ExpectedConditions) ne retournera pas null, il remplira la condition ou jettera TimeoutException.

Vous pouvez vérifier si l'élément est affiché et activé

WebElement element = driver.findElement(By.xpath);
if (element.isDisplayed() && element.isEnabled()) {
    element.click();
}
4
Guy

À partir du code source, vous pourrez voir que, ExpectedConditions.elementToBeClickable(), l'élément sera visible et activé, vous pourrez donc utiliser isEnabled() avec isDisplayed(). Voici le code source.

public static ExpectedCondition<WebElement> elementToBeClickable(final WebElement element) {
                return new ExpectedCondition() {
                        public WebElement apply(WebDriver driver) {
                                WebElement visibleElement = (WebElement) ExpectedConditions.visibilityOf(element).apply(driver);

                                try {
                                        return visibleElement != null && visibleElement.isEnabled() ? visibleElement : null;
                                } catch (StaleElementReferenceException arg3) {
                                        return null;
                                }
                        }

                        public String toString() {
                                return "element to be clickable: " + element;
                        }
                };
        }
1
Leo Zhao
List<WebElement> wb=driver.findElements(By.xpath(newXpath));
        for(WebElement we: wb){
            if(we.isDisplayed() && we.isEnabled())
            {
                we.click();
                break;
            }
        }
    }
0