Reputation: 323
I'm new to Selenium
and need to check if element is clickable in Selenium
Java
, since element.click()
passes both on link
and label
.
I tried using the following code, but it is not working:
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)
Upvotes: 31
Views: 268126
Reputation: 19
From the source code you will be able to view that, ExpectedConditions.elementToBeClickable()
, it will judge the element visible and enabled, so you can use isEnabled()
together with isDisplayed()
. Following is the source code.
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;
}
};
}
Upvotes: 1
Reputation: 193108
There are certain things you have to take care:
NotFoundException
that are encountered by default in the until
condition.To invoke click()
as soon as the element is returned, you can use:
new WebDriverWait(driver, 10).until(ExpectedConditions.elementToBeClickable(By.xpath("(//div[@id='brandSlider']/div[1]/div/div/div/img)[50]"))).click();
To simply validate if the element is located and clickable, wrap up the WebDriverWait in a try-catch{}
block as follows:
try {
new WebDriverWait(driver, 10).until(ExpectedConditions.elementToBeClickable(By.xpath("(//div[@id='brandSlider']/div[1]/div/div/div/img)[50]")));
System.out.println("Element is clickable");
}
catch(TimeoutException e) {
System.out.println("Element isn't clickable");
}
If WebDriverWait returns the located and clickable element but the element is still not clickable, you need to invoke executeScript()
method as follows:
WebElement element = new WebDriverWait(driver, 10).until(ExpectedConditions.elementToBeClickable(By.xpath("(//div[@id='brandSlider']/div[1]/div/div/div/img)[50]")));
((JavascriptExecutor)driver).executeScript("arguments[0].click();", element);
Upvotes: 3
Reputation: 19
the class attribute contains disabled
when the element is not clickable.
WebElement webElement = driver.findElement(By.id("elementId"));
if(!webElement.getAttribute("class").contains("disabled")){
webElement.click();
}
Upvotes: 1
Reputation: 9
List<WebElement> wb=driver.findElements(By.xpath(newXpath));
for(WebElement we: wb){
if(we.isDisplayed() && we.isEnabled())
{
we.click();
break;
}
}
}
Upvotes: 0
Reputation: 291
There are instances when element.isDisplayed() && element.isEnabled()
will return true
but still element will not be clickable, because it is hidden/overlapped by some other element.
In such case, Exception
caught is:
org.openqa.selenium.WebDriverException: unknown error: Element is not clickable at point (781, 704). Other element would receive the click:
<div class="footer">...</div>
Use this code instead:
WebElement element=driver.findElement(By.xpath"");
JavascriptExecutor ex=(JavascriptExecutor)driver;
ex.executeScript("arguments[0].click()", element);
It will work.
Upvotes: 29
Reputation: 23805
elementToBeClickable
is used for checking an element is visible and enabled such that you can click it.
ExpectedConditions.elementToBeClickable
returns WebElement
if expected condition is true otherwise it will throw TimeoutException
, It never returns null
.
So if your using ExpectedConditions.elementToBeClickable
to find an element which will always gives you the clickable element, so no need to check for null
condition, you should try as below :-
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();
As you are saying element.click()
passes both on link
and label
that's doesn't mean element is not clickable, it means returned element clicked
but may be there is no event performs on element by click action.
Note:- I'm suggesting you always try first to find elements by id
, name
, className
and other locator. if you faced some difficulty to find then use cssSelector
and always give last priority to xpath
locator because it is slower than other locator to locate an element.
Hope it helps you..:)
Upvotes: 36
Reputation: 50819
wait.until(ExpectedConditions)
won't return null, it will either meet the condition or throw TimeoutException
.
You can check if the element is displayed and enabled
WebElement element = driver.findElement(By.xpath);
if (element.isDisplayed() && element.isEnabled()) {
element.click();
}
Upvotes: 10