为了账号安全,请及时绑定邮箱和手机立即绑定

任何重构建议

任何重构建议

holdtom 2023-09-20 16:23:15
我有一个很长的 switch 语句代码(大约 8 种情况),它决定使用什么搜索来查找浏览器中的元素。有什么建议如何重构这段代码吗?WebElement 当前对象 = null; switch (SearchBy) { case "className": try { CurrentObject = new WebDriverWait(driver, ConstantValues.LONGWAIT) .until(ExpectedConditions.presenceOfElementLocated(By.className(SearchPar))); } catch (Exception e) { System.out.println("未找到元素:" + e); } 休息;    case "cssSelector":        try {            CurrentObject = new WebDriverWait(driver, ConstantValues.LONGWAIT)                    .until(ExpectedConditions.presenceOfElementLocated(By.cssSelector(SearchPar)));        } catch (Exception e) {            System.out.println("Element not found: " + e);        }        break;    case "id":        try {            CurrentObject = new WebDriverWait(driver, ConstantValues.LONGWAIT)                    .until(ExpectedConditions.presenceOfElementLocated(By.id(SearchPar)));        } catch (Exception e) {            System.out.println("Element not found: " + e);        }        break;    case "linkText":        try {            CurrentObject = new WebDriverWait(driver, ConstantValues.LONGWAIT)                    .until(ExpectedConditions.presenceOfElementLocated(By.linkText(SearchPar)));        } catch (Exception e) {            System.out.println("Element not found: " + e);        }        break;    case "name":        try {            CurrentObject = new WebDriverWait(driver, ConstantValues.LONGWAIT)                    .until(ExpectedConditions.presenceOfElementLocated(By.name(SearchPar)));        } catch (Exception e) {            System.out.println("Element not found: " + e);        }        break;   default:        System.out.println(">>> SEARCH BY KEYWORD IS NOT VALID! <<<");    }
查看完整描述

3 回答

?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

Switch-case是许多编程语言中的反模式。为了避免它们,您可以使用一些类似于Replace conditional with polymorphismJava 的技术。我建议将它们与 一起使用Reflection。这是 Java 的一个功能。



查看完整回答
反对 回复 2023-09-20
?
温温酱

TA贡献1752条经验 获得超4个赞

我强烈建议不要以这种方式编写代码,而是创建一个框架。


创建一个 SeleniumUtility 类(或任何您想要的名称)并编写如下方法: 示例(您可以删除 WebDriver 驱动程序)


/**

 * Method returns WebElement by Xpath.

 * 

 * @param String xpathExpression

 * @param WebDriver driver

 * @return WebElement

 */

public WebElement getElementByXpath(String xpathExpression, WebDriver driver){

    return driver.findElement(By.xpath(xpathExpression));

}


/**

 * Method returns WebElement by ID.

 * 

 * @param String id

 * @param WebDriver driver

 * @return WebElement

 */

public WebElement getElementByID(String id, WebDriver driver){

    return driver.findElement(By.id(id));

}

或者是这样的:


/**

 * Method returns By.

 * 

 * @param String identifier Example: xpath,id,name etc

 * @param String expression Example: //*[@class='text']

 * @return By

 */

public By getBy(String identifier, String expression){

    switch (identifier.toLowerCase()) {

    case "xpath":

        return By.xpath(expression);

    case "id":

        return By.id(expression);

    case "name":

        return By.name(expression);

    case "classname":

        return By.className(expression);

    case "cssselector":

        return By.cssSelector(expression);

    case "linktext":

        return By.linkText(expression);

    case "partiallinktext":

        return By.partialLinkText(expression);

    case "tagname":

        return By.tagName(expression);

    default:

        throw new RuntimeException("Invalid identifier passed: " + identifier);

    }

}

在不同的类中编写显式等待和流畅等待并反复使用。


现在你的整个代码将是这样的:


        try {

            CurrentObject = waitTillElementLocated(getBy("cssselector","SearchPar"));

        } catch (Exception e) {

            System.out.println("Element not found: " + e);

        }

或者


        try {

            CurrentObject = waitTillElementLocated(getBy("id","SearchPar"));

        } catch (Exception e) {

            System.out.println("Element not found: " + e);

        }


查看完整回答
反对 回复 2023-09-20
?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

如果 searchBy 总是匹配方法名称,那么我认为反射可能是解决方案。

Method searchMethod = By.class.getMethod(searchBy, returnClass.class);
CurrentObject = new WebDriverWait(driver, ConstantValues.LONGWAIT).until(ExpectedConditions.presenceOfElementLocated(searchMethod.invoke(null,searchPar);

您必须捕获一些可能的异常。


查看完整回答
反对 回复 2023-09-20
  • 3 回答
  • 0 关注
  • 88 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信