Usage of Java Stream API in Selenium – Retrieving Unique Text From a List Of WebElements
In previous post, we learnt to Retrieve text from a list of web elements using Java Stream APIs.
You may require just to retrieve unique text only. We used a List in previous post which allows duplicates. We can just use a Set to avoid duplicates.
Java Code:-
package RealtimeValdationAutomationTesting; import java.util.HashSet; import java.util.Set; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.testng.annotations.Test; import io.github.bonigarcia.wdm.WebDriverManager; public class RetrieveUniqueTextFromListOfElementUsingStreamAPICollect { @Test public void RetrieveTextFromListOfElementWithStremAPI() { // Auto setup of chrome executable file WebDriverManager.chromedriver().setup(); // Launching browser WebDriver driver = new ChromeDriver(); // Load the URL driver.get("http://automationpractice.com/index.php"); // Creating a Set to store only unique names Set uniqueProductName = new HashSet(); // Locating all product names at home page driver.findElements(By.xpath("//ul[contains(@class,'active')]//a[@class='product-name']")) .stream() .forEach(product -> uniqueProductName.add(product.getText())); // Print count of product found System.out.println("Total unique product found : "+uniqueProductName.size()); // Printing product names System.out.println("All product names are : "); uniqueProductName.forEach(name -> System.out.println(name)); // closing the browser driver.quit(); } }
Output:-
Total unique product found : 5 All product names are : Printed Dress Blouse Printed Chiffon Dress Faded Short Sleeve T-shirts Printed Summer Dress
You must be thinking why a separate post just to say use Set for unique elements. Anyone can think the same. Yes you are correct but here I am going to show you usage of some other aggregate functions of stream APIs.
There is another method in Stream api named “map()”. It returns a stream consisting of the results of applying the given function to the elements of this stream. For example:- Suppose I have an array of int and I want to get square of each element of array. e.g. [1,2,3,4] => [1,4,9,16]. We can achieve the same without iterating explicitly using map.
It returns a stream consisting of the distinct elements of this stream. You can remove duplicates from a source using this method.
It is a terminal operation. We can retrieve the final stream in to a list or a set.
I will show usage of each method in below Selenium script:-
package RealtimeValdationAutomationTesting; import java.util.Set; import java.util.stream.Collectors; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.testng.annotations.Test; import io.github.bonigarcia.wdm.WebDriverManager; public class RetrieveUniqueTextFromListOfElementUsingStreamAPICollect { @Test public void RetrieveTextFromListOfElementWithStremAPI() { // Auto setup of chrome executable file WebDriverManager.chromedriver().setup(); // Launching browser WebDriver driver = new ChromeDriver(); // Load the URL driver.get("http://automationpractice.com/index.php"); // Locating all product names at home page /* * map() is used to replace stream with text. If stream consists of {webelement1, webelement2}, * after map operation it will be their inner text {textOfWebelement1, textOfWebElement2}. * Using collect() method to store resultant stream to a set directly to remove duplicates. */ Set uniqueProductNames = driver.findElements(By.xpath("//ul[contains(@class,'active')]//a[@class='product-name']")) .stream() .map(productWebElement -> productWebElement.getText()) .collect(Collectors.toSet()); // Print count of product found System.out.println("Total unique product found : "+uniqueProductNames.size()); // Printing product names System.out.println("All product names are : "); uniqueProductNames.forEach(name -> System.out.println(name)); // closing the browser driver.quit(); } }
Using distinct():-
package RealtimeValdationAutomationTesting; import java.util.List; import java.util.Set; import java.util.stream.Collectors; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.testng.annotations.Test; import io.github.bonigarcia.wdm.WebDriverManager; public class RetrieveUniqueTextFromListOfElementUsingStreamAPICollect { @Test public void RetrieveTextFromListOfElementWithStremAPI() { // Auto setup of chrome executable file WebDriverManager.chromedriver().setup(); // Launching browser WebDriver driver = new ChromeDriver(); // Load the URL driver.get("http://automationpractice.com/index.php"); // Locating all product names at home page /* * map() is used to replace stream with text. If stream consists of {webelement1, webelement2}, * after map operation it will be their inner text {textOfWebelement1, textOfWebElement2}. * distinct() will remove all duplicates * Using collect() method to store resultant stream to a list. */ List uniqueProductNames = driver.findElements(By.xpath("//ul[contains(@class,'active')]//a[@class='product-name']")) .stream() .map(productWebElement -> productWebElement.getText()) .distinct() .collect(Collectors.toList()); // Print count of product found System.out.println("Total unique product found : "+uniqueProductNames.size()); // Printing product names System.out.println("All product names are : "); uniqueProductNames.forEach(name -> System.out.println(name)); // closing the browser driver.quit(); } }
Output:-
Total unique product found : 5 All product names are : Faded Short Sleeve T-shirts Blouse Printed Dress Printed Summer Dress Printed Chiffon Dress
If you have any doubt, feel free to comment below.If you like my posts, please like, comment, share and subscribe.#ThanksForReading
#HappyLearning