Note: If you are new to java and selenium then start with selenium java training videos.
We often come across situation when there are multiple elements on a page and we probably like to exercise only a few of them using selenium webdriver. May be just first and last element. For example on a search result page we may like to click on only first and last link and not all. This is when Iterables API comes handy. (By the way I am assuming that you have already completed watching selenium training videos :)). Once we have collection of web element then we can use Iterables to get only first or last element as following -
Consider that we fetch collection of element as -
Consider that we fetch collection of element as -
List<WebElement> webElements = getDriver().findElements(By.id("htmlID"));
Now we can get the first web element from this collection as -
WebElement firstElement = Iterables.getFirst(webElements,
getDriver().findElement(By.id("defaultElement")));
Herein second argument -
(getDriver().findElement(By.id("defaultElement")))
in the method getFirst is the default element which would be used
when collection is empty. Once we have control of "firstElement"
WebElement then we can click on it or use various other WebDriver
methods
And we can get the last element from collection as -
WebElement lastElement = Iterables.getLast(webElements,
getDriver().findElement(By.id("defaultElement")));
Here again, second argument of method getLast is default element
So next time you want to exercise only first and last element from
a collection of web element then you can use these handy APIs and not
any weird loop. Stay tuned for more test automation tips :)
Good tip. Although couldn't you just do this as well?
ReplyDeleteWebElement firstElement = webElements.get(0);
WebElement lastElement = webElements.get(webElements.size()-1);
And another option, if ok to use XPath, is to use XPath to specifically define the n-th element in the collection that you are matching against for value that returns multiple matches. That way, it won't needlessly return the whole set when you won't be using the rest. This is also helpful when you are already using XPath. Example
WebElement firstElement = driver.findElement(By.xpath("(//someXPathThatMatchesMultipleElements)[1]"); //returns 1st element
WebElement lastElement = driver.findElement(By.xpath("(//someXPathThatMatchesMultipleElements)[n]"); //returns nth element, if you knew what last element n value would be
could use the 0 and works too thought solution does not seem so comprehensible at first, is not it? :-)
Deleteon xPath, I give preference to other element locators over xPath because of its slowness. Also it is not always straight forward to use [n] locator with xPath.