Je suis nouveau dans Selenium
et j'ai besoin de vérifier si l'élément est cliquable dans Selenium
Java
, 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.
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 .. :)
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.
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();
}
À 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;
}
};
}
List<WebElement> wb=driver.findElements(By.xpath(newXpath));
for(WebElement we: wb){
if(we.isDisplayed() && we.isEnabled())
{
we.click();
break;
}
}
}