Подтвердить что ты не робот

Реализация Java-интерфейса в Clojure

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

Однако, поскольку webinterface сильно написан по сценарию, мне нужно иметь возможность ждать, пока определенные элементы будут созданы script, а не на загрузке страницы.

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

Тем не менее, класс waiter до тех пор, пока метод не примет общий интерфейс (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"))
    ))
4b9b3361

Ответ 1

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

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

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