12

webdriver用のwebdriver-cljラッパーを使用して、selenium2/webdriverプロジェクトでclojureのコツをつかもうとしています。

ただし、Webインターフェイスは高度にスクリプト化されているため、ページの読み込みではなく、スクリプトによって特定の要素が作成されるまで待機するオプションが必要です。

そこで、 WebDriverWaitクラスを使用して属性ごとに要素をテストし、できればwebdriver / by-functionsのclojure構文を使用して、clojureで待機関数を作成しようとしました。

ただし、メソッドまでのウェイタークラスはジェネリックインターフェイス(com.google.common.base.Function)をパラメーターとして受け取り、Javaの知識はほとんど存在しないため、これは私の駆け出しのclojureスキルにはあま​​りにも多くのことを証明しています。

clojure-java相互運用スキルを持ち、次のJavaコードをclojureに実装して、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"))
    ))
4

1 に答える 1

11

Webdriverについては何も知りませんが、インターフェイスを実装するためのclojureの方法は、プロキシと具体化です(deftypeとdefrecordですが、ここではおそらく関係ありません)。reifyを使用すると、そのインターフェイスの実装は次のようになります。

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

Clojureはジェネリックスをまったく処理しませんが、Javaジェネリックスの型パラメーターは実行時に存在しないため、関数インターフェースの実装をあらゆる種類の関数を期待するものに渡すことができるはずです。

于 2010-10-23T16:31:16.790 に答える