Убрать дублирование в коде

Есть такой вопрос. Есть меню и в меню элементы. Как красиво организовать код для выбора элементов главного меню и суб элементов на selenium?

Мой код:

    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;


    public class MainMenu extends AbstractContainer {

    public MainMenu(WebDriver driver) {
        super(driver);
    }

    // name - текст элемента меню
    public MainMenu selectMenuItem(String name) {
        String menuItemXpath = String.
                format("//li[@class='nav']//a[text()='%s']", name);

        return clickMenuElement(menuItemXpath);
    }

    public MainMenu selectSubMenuItem(String name) {
        String subMenuItemXpath = String.
                format("//li[@class='subnav']//a[text()='%s']", name);

        return clickMenuElement(subMenuItemXpath);
    }

    private MainMenu clickMenuElement(String elementXpath) {
        driver.findElement(By.xpath(elementXpath))
                .click();

        return this;
    }
}

Как видите все элементы меню имеют css класс ‘nav’, а суб меню класс ‘submenu’. Можно ли мой код переписать как то более красиво?

Нормальный код :smile: Что не устраивает?

Если ты имеешь ввиду то, что у тебя XPath почти полностью дублируется и хочешь выразить XPath для сабменю через XPath для меню, то это неправильно, т.к. он совсем не обязательно будет сохраняться в таком виде. Меню и сабменю - это разные элементы и то, что XPath для них похож, не является дублированием кода.

Можно конечно добавить пару методов типа:

private String getCommonXPath(String cssClass) {
    return "//li[@class='"+ cssClass +"']//a[text()='%s']";
}

private String getMenuItemXPath() {
    return getCommonXPath("nav");
}

private String getSubMenuItemXPath() {
    return getCommonXPath("subnav");
}

Тогда если они вдруг перестанут так просто выражаться друг через друга, то можно будет тупо возвращать индивидуальные значения. Но стоит ли так заморачиваться, если всё происходит в рамках одного небольшого класса?

Если только два метода, я бы не заморачивался, в данном случае “генерализация” выдаст больше кода. :smile: