2013-07-01 127 views
0

我有一个硒测试功能,看起来像这样。调用具有变量名称的方法 - 可能吗?

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

功能是应该采取的信息字符串和类型(方法的名称在按类来调用 - 例如Xpath,cssselector,标记名等)如何获取Java评估“loctype”的价值?

我来自ColdFusion背景,这很容易与CF做,但我很难尝试在Java中做到这一点。我只是得到一个“无法解决方法”的问题,它不会编译。它甚至有可能做到吗?

+0

你需要反思。 – SLaks

回答

3

你可以使用反射来做到这一点。

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等),或者使用一个枚举(IDCSSXPATH等)作为参数,而不是方法名。使用方法名称作为参数,它使您的调用者依赖于Selenium实现。如果他们改变方法的名字,你的代码将不再工作,你甚至不会在编译时注意到这一点!

0

我们也可以用枚举像这样做 比创建为每个单独的方法和像getElmObjectById每定位器LaurentG说,我们还可以实现它如下所示

public enum avilableLocators 
{ 
    CLASS_NAME, CSS_SELECTOR, XPATH 
} 

和具有开关的方法的其它情况或如果 - 否则,如果哪些将有一个返回类型通过

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); 
相关问题