调用具有变量名称的方法 - 可能吗?

时间:2013-07-01 14:05:27

标签: java selenium selenium-webdriver

我有一个Selenium Test的功能,看起来像这样。

public static WebElement getElmObject (String locinfo, String loctype) {
    try{
      return driver.findElement(By.loctype(locinfo));
    } catch (Throwable t){
        return null;
}

该函数应该包含信息字符串和类型(要在BY类中调用的方法的名称 - 如xpath,cssselector,tagname等)。如何让Java来评估“loctype”的值“?

我来自ColdFusion背景,这很容易用CF做,但我很难用Java做这件事。我只是得到一个“无法解决方法”的问题,它将无法编译。它甚至可以吗?

2 个答案:

答案 0 :(得分:3)

您可以使用Reflection执行此操作。

public static WebElement getElmObject(String locinfo, String loctype) {
    try {
        Method method = By.class.getMethod(loctype, String.class);
        By by = (By) method.invoke(By.class, locinfo);
        return driver.findElement(by);
    } catch (Throwable t) {
        return null;
    }
}

但是我发现这很奇怪,我建议使用不同的方法(getElmObjectByIdgetElmObjectByCss等)或使用枚举(IDCSS,{ {1}}等)作为参数而不是方法名称。使用方法名称作为参数,它使您的调用者依赖于Selenium实现。如果他们更改方法的名称,您的代码将不再起作用,您甚至不会在编译时注意到这一点!

答案 1 :(得分:0)

我们也可以像这样使用枚举 除了为每个定位器创建单独的方法,如getElmObjectById,LaurentG表示我们也可以实现它,如下所示

public enum avilableLocators
{
    CLASS_NAME, CSS_SELECTOR, XPATH
}

并且有一个带switch case的方法或if-else,如果返回类型为By

public By locinfo(String locinfo) 
{
 String locatorValue=null;
switch (locType(locinfo)) 
{
case XPATH:
           locatorValue=locinfo.split(",")[1]/*assuming that you are passing locinfo,locvalue*/ 
            return By.xpath(locator);
}
}

public final avilableLocators locType(String loctype) {

if (loctype.contains("xpath")) 
{

return avilableLocators.XPATH;
}

}



so  the final usage can be like this
String locDetails="xpath,//*[@id='ComScorePingFile']"
locinfo(locDetails);