代码之家  ›  专栏  ›  技术社区  ›  NielsK

在Culjure中实现Java通用接口

  •  11
  • NielsK  · 技术社区  · 14 年前

    我正在尝试在Selenium2/WebDriver项目中使用 webdriver-clj WebDriver的包装。

    但是,由于WebInterface是大量编写脚本的,所以我需要有一个选项来等待脚本创建某些元素,而不是页面加载。

    所以我尝试在Clojure中创建一个wait-for函数,使用 WebDriverWait 类来逐个属性测试元素,最好使用WebDriver/By-函数中的Clojure语法。

    但是,侍者类直到方法将一个通用接口(COM.谷歌.Cudio.Base.For)作为参数,并且由于我的Java知识接近于不存在,这对于我刚刚起步的CuljeRead技能来说是太多了。

    任何人都有Culjress Java互操作技巧,以及如何在Culjure中实现下面的Java代码,因此它与WebDistor/B-语法相结合?

    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"))
        ))
    
    1 回复  |  直到 14 年前
        1
  •  10
  •   Jouni K. Seppänen    14 年前

    我对WebDriver一无所知,但实现接口的Clojure方法是代理和REIFY(以及deftype和defrecord,但这些在这里可能不相关)。使用reify,实现该接口将类似于

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

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