2010-10-22 185 views
10

我試圖在selenium2/webdriver項目中使用webdriver-clj wrapd for webdriver獲取clojure的掛起。在Clojure中實現Java通用接口

但是,由於web界面大量編寫腳本,我需要有一個選項可以等待,直到腳本創建某些元素爲止,而不是在頁面加載時。

所以我試圖在clojure中創建一個等待函數,使用WebDriverWait類來測試元素的屬性,最好使用webdriver/by-函數的clojure語法。

但是,直到方法的服務器類接受一個通用的接口(com.google.common.base.Function)作爲參數,並且由於我的Java知識幾乎不存在,這對於我的羽翼未豐技能證明太多了。

任何與clojure-java互操作技巧和想法如何在clojure中實現以下java代碼,以便它與webdriver/by-syntax相結合?

Function<WebDriver, WebElement> presenceOfElementLocated(final By locator) { 
return new Function<WebDriver, WebElement>() { 
public WebElement apply(WebDriver driver) { 
return driver.findElement(locator); 
} 
};} 

// ... 
driver.get("http://www.google.com"); 
WebDriverWait wait = new WebDriverWait(driver, /*seconds=*/3); 
WebElement element = 
wait.until(presenceOfElementLocated(By.name("q")) 

結果應該讓這樣的事情可能

(defn test [] 
    (let [driver (webdriver/new-driver :firefox)] 
    (webdriver/get driver "http://127.0.0.1/") 
    (webdriver/wait-for (webdriver/by-name "button")) 
    )) 

回答

9

我不知道webdriver的任何東西,但Clojure的方式來實現一個接口是代理和具體化(和DEFTYPE和defrecord,但這些可能與此無關)。隨着具體化,實現該接口看起來像

(defn presence-of-element-located [locator] 
    (reify Function 
     (apply [this driver] 
     (.findElement driver locator)))) 

的Clojure以任何方式不處理仿製藥,但Java泛型類型參數沒有在運行時存在,所以你應該能夠通過您的實現的函數接口,以期望任何類型的函數。