簡體   English   中英

在Clojure中實現Java通用接口

[英]Implementing Java generic interface in Clojure

我正在嘗試使用webdriver的webdriver-clj包裝器在selenium2 / webdriver項目中獲取clojure。

但是,由於Web界面是大量編寫腳本的,我需要有一個選項來等待腳本創建某些元素,而不是頁面加載。

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

然而,服務員類直到方法采用通用接口(com.google.common.base.Function)作為參數,並且由於我的Java知識幾乎不存在,這對於我剛剛起步的clojure技能來說太過分了。

任何人都有clojure-java互操作技能,並想知道如何在clojure中實現以下java代碼,以便它與webdriver / by-語法結合?

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"))
    ))

我對webdriver一無所知,但實現接口的clojure方法是代理和reify(以及deftype和defrecord,但這些可能與此無關)。 使用reify,實現該接口看起來就像

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

Clojure不以任何方式處理泛型,但Java泛型的類型參數在運行時不存在,因此您應該能夠將Function接口的實現傳遞給任何期望任何類型的函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM