繁体   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