0

我有一个看起来像这样的硒测试功能。

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

该函数应该接受信息字符串和类型(在 BY 类中调用的方法的名称 - 如 xpath、cssselector、标记名等)如何让 Java 评估“loctype”的值?

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

4

2 回答 2

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 实现。如果他们更改了方法的名称,您的代码将不再工作,您甚至不会在编译时注意到这一点!

于 2013-07-01T14:17:29.293 回答
0

除了为每个定位器(如 LaurentG 所说的 getElmObjectById)创建单独的方法之外,我们也可以像这样使用枚举来做到这一点,我们也可以实现它,如下所示

public enum avilableLocators
{
    CLASS_NAME, CSS_SELECTOR, XPATH
}

并有一个带有 switch case 或 if-else if 的方法,其返回类型为 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);
于 2013-07-03T11:51:46.467 回答