亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

任何重構建議

任何重構建議

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 關注
  • 129 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號