Реализация универсального интерфейса Java в Clojure - PullRequest
11 голосов
/ 22 октября 2010

Я пытаюсь получить представление о clojure в проекте selenium2 / webdriver с использованием оболочки webdriver-clj для веб-драйвера.

Однако, поскольку веб-интерфейс сильно написан на скриптах, янужно иметь возможность ждать, пока определенные элементы не будут созданы скриптом, а не при загрузке страницы.

Поэтому я пытался создать функцию ожидания в clojure, используя WebDriverWait класс для проверки элемента по атрибуту, предпочтительно с использованием синтаксиса clojure из webdriver / by-functions.

Однако класс официанта, пока метод не приобретет универсальный интерфейс (com.google.common.base.Function)в качестве параметра, и так как мои знания Java почти не существуют, это слишком много для моих начинающих навыков clojure.

Любой, у кого есть навыки взаимодействия с clojure-java и идея, как реализовать следующий код Java вClojure, так что он сочетается с веб-драйвером / по синтаксису?

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 Ответ

10 голосов
/ 23 октября 2010

Я ничего не знаю о webdriver, но следующие способы реализации интерфейса - прокси и reify (и deftype и defrecord, но они, вероятно, здесь не актуальны). При использовании reify реализация этого интерфейса будет выглядеть примерно так:

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

Clojure никоим образом не обрабатывает дженерики, но параметры типа дженериков Java не существуют во время выполнения, поэтому вы должны быть в состоянии передать реализацию интерфейса функции чему угодно, ожидающему какой-либо тип функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...