【问题标题】:Implementing Java generic interface in Clojure在 Clojure 中实现 Java 泛型接口
【发布时间】:2010-10-22 17:13:51
【问题描述】:

我正在尝试使用 webdriver 的 webdriver-clj 包装器在 selenium2/webdriver 项目中掌握 clojure。

但是,由于 web 界面是大量脚本化的,我需要有一个选项来等待脚本创建某些元素,而不是在页面加载时。

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

但是,直到方法的服务员类将通用接口 (com.google.common.base.Function) 作为参数,并且由于我的 Java 知识几乎不存在,这对我刚起步的 clojure 技能来说太难了。

任何具有 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"))
    ))

【问题讨论】:

    标签: java generics interface clojure webdriver


    【解决方案1】:

    我对 webdriver 一无所知,但是实现接口的 clojure 方法是 proxy 和 reify(以及 deftype 和 defrecord,但这些在这里可能不相关)。使用 reify,实现该接口看起来像

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      • 1970-01-01
      相关资源
      最近更新 更多