如何在 java 中将两种方法简化为一种方法

How to simplify two methods to one method in java

我需要将两种方法合并为一种方法(两种方法只有 xpath 值在变化,其余功能相同)。除 xpath 值外,两种方法执行相同的功能。我如何在一种方法中使用这两个 xpath 值并将其变成一种方法。

NAV_MENU_ITEMS_LIST= driver.findElement(By.xpath(mat-input-0))
NAV_SUB_MENU_ITEMS_LIST= driver.findElement(By.xpath(//span[text()=' Quick Login ']))

private void methodOne(String menuItemName) {
        NAV_MENU_ITEMS_LIST.findBy(text(menuItemName))
                .click();
        log.info("Navigating to " + menuItemName);
    }


private void methodTwo(String subMenuItemName) {
        NAV_SUB_MENU_ITEMS_LIST.findBy(text(subMenuItemName))
                           .click();
        log.info("Navigating to " + subMenuItemName);
    }

主要调用方式:

public DashboardPage goDashboardManagement() {
        methodOne("People");
        methodTwo("Salary");

        return new PplPage();
    }

如果您有两个或多个具有相同方法主体且仅内部值发生变化的方法,您可以简单地将变量数据作为参数传递给方法。在你的情况下,

private void commonizedMethod(String menuItemName, WebElement element) {
    element.findBy(text(menuItemName)).click();
    log.info("Navigating to: " + menuItemName);
}

或者,您可以通过将 Xpath 传递给方法来在内部解析元素

private void commonizedMethod(String menuItemName, WebDriver driver, String xpath) {
    WebElement element = driver.findElement(By.xpath(xpath));
    element.findBy(text(menuItemName)).click();
    log.info("Navigating to: " + menuItemName);
}

如果驱动是全局参数,则不需要在方法中传递。

更新:根据 OP 刚刚发布的更新,我添加了额外的信息来解决这个问题。

多年来我做过的一个“技巧”是利用覆盖方法来支持遗留代码并同时扩展功能。例如,在这种情况下,遗留代码有两个相似的方法,新功能合并为一个。


遗留代码

public DashboardPage goDashboardManagement() {
    methodOne("People");
    methodTwo("Salary");

    return new PplPage(); // not sure what this does or relevancy to the two method calls that preceded
}

添加的功能(覆盖方法)

public DashboardPage goDashboardManagement(String[] args, WebElement[] elements) {
    // check to make sure both arrays are of the same length
    for (for int i = 0; i < arr.length, i++) {
        commonizedMethod(args[i], elements[i]);
    }
    return new PplPage(); // not sure what this does or relevancy to the two method calls that preceded
}

由于旧的遗留 goDashboardManagement() 方法具有硬编码值并遵循此模式,并且假设 NAV_MENU_ITEMS_LISTNAV_SUB_MENU_ITEMS_LIST 是全局常量,我可以简单地更新方法体如下:

public DashboardPage goDashboardManagement() {
    String[] arr = {"People", "Salary"};
    WebElement elements = {NAV_MENU_ITEMS_LIST, NAV_SUB_MENU_ITEMS_LIST};
    commonizedMethod(arr, elements);

    return new PplPage(); // not sure what this does or relevancy to the two method calls that preceded
}

这将允许您安全地删除 methodOne(String)methodTwo(String),并仍然保留 goDashboardManagement() 以支持遗留代码。你对该方法的单元测试应该继续工作,因为新版本 goDashboardManagement() 和旧版本基本相同,即使它在内部发生了变化。

最后,您显然有创建所需数组的负担。