当前位置: 首页 > 知识库问答 >
问题:

有什么重构建议吗

毋举
2023-03-14

我有一个很长的switch语句代码(大约8个案例),它决定了在浏览器中使用什么搜索来查找元素。有没有关于如何重构这段代码的建议?

WebElement CurrentObject=null;切换(SearchBy){case“className”:尝试{CurrentObject=new WebDriverWait(driver,ConstantValues.LONGWAIT)。直到(ExpectedConditions.presenceOfElementLocated(By.className(SearchPar));}catch(异常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个答案

索梓
2023-03-14

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

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

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

汪翰墨
2023-03-14

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

创建一个SeleniumMutility类(或您想要的任何名称)并编写如下方法:示例(您可以删除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-03-14

Switch-case是许多编程语言中的反模式。为了避免它们,您可以使用一些技术,如在Java中用多态替换条件。我建议将它们与Reflection一起使用。这是Java的一个特点。

 类似资料:
  • 问题内容: 我正在做一个基于滚动2D地图/平铺的游戏。每个图块(存储为tile [21] [11]-每个地图总共231个图块)最多可以包含21个值(存储为int [3] [7])。在全屏模式下,我一次可以看到8张地图。 平均而言,每张地图的绘制时间约为0.03秒(可通过System.nanoTime找到)。问题在于,一旦在屏幕上显示多于一张地图,Swing事件轮询就会明显变慢。 有什么解决办法吗?

  • 总的来说,问题是做什么?

  • 问题内容: 最近三年,我一直在用PHP进行Web应用程序开发。我现在快要尝试Java。我最近一次使用该语言是在8年前,而且大部分是学术性的。 我对PHP的对象模型(版本5)相当熟悉,并且我几乎完全是在OO中进行编码的。我现在想传达这种经验并将其用于Java开发。 我来自哪里: linux作为桌面和服务器 Vim / gVim +插件作为编辑器 MySQL的数据库 apache httpd 一堆PH

  • 问题内容: 我从未见过 在任何地方实际使用过HTML标记。使用它有陷阱吗,这意味着我应该避免使用它? 我从来没有注意到它在现代生产站点(或任何站点)上使用过的事实,使我对此感到不安,尽管它似乎具有简化我站点上链接的有用应用程序。 编辑 在使用基本标签几周后,我确实发现使用基本标签会引起一些重大麻烦,这使它比最初出现的效果要差得多。从本质上讲,变化和基本标签下是_非常_有它们的默认行为不兼容,并可以

  • 问题内容: 我在我的项目中使用。现在已弃用,我想知道什么是替代品?如何获取语音通话事件? 问题答案: 这没有很好的文档记录,但是我在公共头文件中找到了此提及: “替换为” 因此,从iOS 10开始,您应该使用新框架类来检索有关活动调用的信息: 提供您要在其上执行委托回调的符合协议和队列的对象: 并在委托对象上实现以下方法: 有关更多信息,您可以检查: 通过WWDC 2016的CallKit会话增强

  • 问题内容: 。 对CSS缩小器有什么建议吗? 我将扎根Google并尝试一些方法,但我怀疑聪明,精通和好奇的英俊StackOverflow社区可能已经评估了重量级的优缺点。 问题答案: 在锐压缩机是太棒了。它适用于JavaScript和CSS。一探究竟。