我有一个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做这件事。我只是得到一个“无法解决方法”的问题,它将无法编译。它甚至可以吗?
答案 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;
}
}
但是我发现这很奇怪,我建议使用不同的方法(getElmObjectById
,getElmObjectByCss
等)或使用枚举(ID
,CSS
,{ {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);