2015-08-20 38 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