我有一个很长的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! <<<");
}
如果searchBy总是匹配一个方法名,那么我认为反射可能是解决方案。
Method searchMethod = By.class.getMethod(searchBy, returnClass.class);
CurrentObject = new WebDriverWait(driver, ConstantValues.LONGWAIT).until(ExpectedConditions.presenceOfElementLocated(searchMethod.invoke(null,searchPar);
您必须捕获一些可能的异常。
我强烈建议不要以这种方式编写代码,而是创建一个框架。
创建一个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);
}
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。一探究竟。