0

I am very beginner with Selenium and I'd like to get an advice how to optimize the code. I have 3 tooltips on the website and want to do the same actions for all of them.

I have written so far:

public void validateTooltipIsPresent() {

        Actions builder = new Actions(SeleniumDriver.getDriver());

        WebElement usernameTooltip = SeleniumDriver.getDriver().findElement(By.xpath("xpath1"));
        builder.moveToElement(usernameTooltip).perform();
        String tooltipMsg = usernameTooltip.getText();
        System.out.println(tooltipMsg);

        WebElement usernameTooltip2 = SeleniumDriver.getDriver().findElement(By.xpath("xpath2"));
        builder.moveToElement(usernameTooltip2).perform();
        String tooltipMsg2 = usernameTooltip2.getText();
        System.out.println(tooltipMsg2);

        WebElement usernameTooltip3 = SeleniumDriver.getDriver().findElement(By.xpath("xpath3"));
        builder.moveToElement(usernameTooltip3).perform();
        String tooltipMsg3 = usernameTooltip3.getText();
        System.out.println(tooltipMsg3);

My idea is to add Webelements to an ArrayList and then iterate though it. Is that good solution?

The method public void validateTooltipIsPresent() does not have any parameters, but if I add (Webelement element), then in step definitions, the arguments will be required.

This is the method in step definition:

    @Then("^In pricing section ensure tool tip display for List price, Net Price, and packaging conversion$")
    public void in_pricing_section_ensure_tool_tip_display_for_list_price_net_price_and_packaging_conversion() throws Throwable {

      pdpActions.validateTooltipIsPresent();
}

1 Answer 1

1

The problem with your code is that it's not reusable, let's consider a situation where you have a tooltip on a different page. Then you have to re-write the code again.

If you have a method like this then you can call the method multiple times instead of writing the same code again

public void validate(WebElement elem){

    WebElement usernameTooltip = elem
    builder.moveToElement(usernameTooltip).perform();
    String tooltipMsg = usernameTooltip.getText();
    System.out.println(tooltipMsg);
 }

Then:

public void validateTooltipIsPresent() {
  validator.validate(toolTipElem1);
  validator.validate(toolTipElem2);
  validator.validate(toolTipElem3);    
}

also you can parameterize cucumber

 @Then("^In pricing section ensure tool tip display for {String}$")
    public void in_pricing_section_ensure_tool_tip_display_for_list_price_net_price_and_packaging_conversion(String elemloc) throws Throwable {
      //create getter function to get the webelement using the string provided
      WebElment elem=pageobject.get(elemloc);
      pdpActions.validateTooltipIsPresent(elem);
}

So that you can reuse the keywords, and reduce step length.

Note on gherkins:

https://cucumber.io/docs/bdd/better-gherkin/

THe above link gives more idea about proper gherkins. Gherkins is there to ensure functional validation and not the implementation.

So, the below step is wrong as its talking about implementation details

Given In pricing section ensure tooltip display for List price, Net Price, and packaging conversion

The functional step would be simple as:

 Given I am In pricing section
 Then tooltips are present
1
  • thank you So much for your help!
    – Beti
    Apr 29, 2020 at 21:28

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.