2015-08-20 40 views
0

我试图动态生成一个查询硒如下,但它没有工作:动态生成硒查询使用Java中的字符串

String Query = "By."+Selector+"("+Expression+")))"; 

element = wait.until(ExpectedConditions.elementToBeClickable(Query)); 

如何实现这一要求吗?

+0

你是什么意思它没有工作?它是否抛出异常?你有错误的价值吗?你有没有攻击邻国:)?还请为“选择器”和“表达式”提供值。 – npinti

+0

:)我得到:即使在将值赋给变量之后,类型ExpectedConditions中的elementToBeClickable(By)方法也不适用于参数(String)'。 – bpk

回答

0

根据documentation和您收到的错误,似乎并不存在elementToBeClickable方法,它将字符串作为参数。

然而,检查By文档,这似乎是您所使用的方法的输入参数之一,可以看到它们可以从字符串构造它。

总之,你的代码需要改变的东西,像这样:

String cssQuery = ... //You can construct the CSS query dynamically. 
element = wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector(cssQuery))); 
+0

有意义。所以我只限于在By.cssSelector()中使用字符串参数,而不在elementToBeClickable()中使用。好的,会试一试。 – bpk

0

看起来像你想获得一个元素通过查询,使用选择表达参数,然后通过结果来ExpectedConditions。 那么你可能需要通用的方法吗?

像:

public By getSeleniumQuery(String selector, String expression){ 
    if(selector.equalsIgnoreCase("id")){ 
     return By.id(expression); 
    } 
    else if(selector.equalsIgnoreCase("name")){ 
     return By.name(expression); 
    } 
    else if(selector.equalsIgnoreCase("class")){ 
     return By.className(expression); 
    } 
    else if(selector.equalsIgnoreCase("css")){ 
     return By.cssSelector(expression); 
    } 
    else if(selector.equalsIgnoreCase("link")){ 
     return By.linkText(expression); 
    } 
    else if(selector.equalsIgnoreCase("partialLink")){ 
     return By.partialLinkText(expression); 
    } 
    else if(selector.equalsIgnoreCase("tag")){ 
     return By.tagName(expression); 
    } 
    else if(selector.equalsIgnoreCase("xpath")){ 
     return By.xpath(expression); 
    } 
    else{ 
     throw new IllegalArgumentException("Unknown selector - " + selector); 
    } 
} 
+0

看起来很漂亮... – bpk