Любое предложение по рефакторингу - PullRequest
0 голосов
/ 03 октября 2019

У меня есть длинный код оператора switch (около 8 случаев), который решает, какой поиск использовать для поиска элемента в браузере. Любое предложение, как реорганизовать этот код?

WebElement CurrentObject = 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);} break;

    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 ]

1 голос
/ 03 октября 2019

Switch-case является анти-паттерном во многих языках программирования. Чтобы избежать их, вы можете использовать некоторые методы, такие как Replace conditional with polymorphism в Java. Я предлагаю использовать их с Reflection. Это особенность Java.

0 голосов
/ 03 октября 2019

Я настоятельно рекомендую не писать свой код таким образом, вместо этого создайте фреймворк.

Создайте класс 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);
        }
0 голосов
/ 03 октября 2019

Если searchBy всегда совпадает с именем метода, то я думаю, что отражение могло бы быть решением.

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

Вам нужно было бы поймать несколько возможных исключений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...