在Clojure中实现Java通用接口 [英] Implementing Java generic interface in Clojure

查看:159
本文介绍了在Clojure中实现Java通用接口的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用 webdriver-clj 包装器在selenium2 / webdriver项目中获得clojure然而,由于web界面是大量脚本,我需要一个选项,等待脚本创建某些元素,而不是页面加载。



所以我试图在clojure中创建一个wait-for函数,使用WebDriverWait 类来按属性测试元素,最好使用clojure语法从webdriver / by-函数。



但是,wait方法需要一个通用接口(com.google.common.base.Function)作为参数,而且由于我的Java知识接近



任何人都有clojure-java互操作技能,以及如何在clojure中实现下面的java代码它与webdriver / by-syntax结合?

 功能< WebDriver,WebElement> existsOfElementLocated(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 [] 
(webdriver / new-driver:firefox)]
(webdriver / get driverhttp://127.0.0.1/)
(webdriver / wait-for(webdriver / by-namebutton) )
))


解决方案

知道webdriver的任何东西,但Clojure实现一个接口的方式是代理和reify(和deftype和defrecord,但是这些可能不相关)在这里reify,实现该接口看起来像

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

Clojure不以任何方式处理泛型, Java泛型的参数在运行时不存在,因此您应该能够将您的Function接口的实现传递给任何期望任何类型的函数的任何东西。


I'm trying to get the hang of clojure in a selenium2/webdriver project using the webdriver-clj wrapper for webdriver.

However, since the webinterface is heavily scripted, I need to have an option to wait until certain elements are created by the script, instead of on page load.

So I was trying to create a wait-for function in clojure, using the WebDriverWait class to test for an element by attribute, preferably using clojure syntax from the webdriver/by- functions.

However, the waiter class until method takes a generic Interface (com.google.common.base.Function) as a parameter, and since my Java knowledge is near nonexistant, this is proving too much for my fledgling clojure skills.

Anyone out there with clojure-java interop skills and an idea how to implement the following java code in clojure so it combines with the 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"))

The result should make something like this possible

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

解决方案

I don't know anything about webdriver, but the clojure ways to implement an interface are proxy and reify (and deftype and defrecord, but those are probably not relevant here). With reify, implementing that interface would look something like

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

Clojure doesn't handle generics in any way, but the type parameters of Java generics don't exist at runtime, so you should be able to pass your implementation of the Function interface to anything expecting any kind of Function.

这篇关于在Clojure中实现Java通用接口的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆