Please post your Web Driver questions in official Web Driver forum

Saturday, April 30, 2016

How to handle duplicate element locators?

Have you come across use cases when you have create multiple element locators for almost similar element locators?
Consider following text box, which gets date filled when user clicks on - expired, today, end of week etc links -

Screenshot from 2016-04-30 21:49:18.png

This is how page html looks -

Screenshot from 2016-04-30 21:56:44.png

And the element locators for expired, today etc link could be -


There are other possible element locators but each link requires its own element locator.
Now considering earlier example, the only difference in element locator is index number 1, 2 etc

So what if we could get rid of creating different element locators and pass index number depending on the link we want to interact with?

Let’s create base element locator -

private static LinkElement getExpiryLinkElement(int index) {
  return new LinkElement("Expired Link",
          By.cssSelector(String.format("#coupon_expiryAt~a:nth-of-type(%s)", index)));

Let’s set up an enum for expired, today etc links -

public enum ExpiryDate {

And a method which returns element locator corresponding to expired, today etc links

private LinkElement getExpiryLink(ExpiryDate expiryDate) throws Exception {

  switch (expiryDate) {

  case EXPIRED:
      return getExpiryLinkElement(1);

  case TODAY:
      return getExpiryLinkElement(2);

  case END_OF_WEEK:
      return getExpiryLinkElement(3);

  case MONTH:
      return getExpiryLinkElement(4);

  case NEXT_MONTH:
      return getExpiryLinkElement(5);

  case YEAR:
      return getExpiryLinkElement(6);

  case ONE_MONTH:
      return getExpiryLinkElement(7);

      return getExpiryLinkElement(8);

  case SIX_MONTH:
      return getExpiryLinkElement(9);

  throw new Exception("Invalid expired Link");


Method to select expiry date would be -

public PageObject selectExpiryDate(ExpiryDate expiryDate) throws Exception {
  return this;

Now test method could set any of the expiry date as -



and so on...

What do you think of this approach which gets us rid of creating 9 element locators? How would you have approached it?
Fork me on GitHub