2010-10-22 10 views
10

J'essaie de comprendre le fonctionnement de clojure dans un projet selenium2/webdriver en utilisant le wrapper webdriver-clj pour webdriver.Implémentation d'une interface générique Java dans Clojure

Toutefois, étant donné que l'interface Web est fortement scriptée, j'ai besoin d'une option permettant d'attendre que certains éléments soient créés par le script, plutôt que lors du chargement de la page. J'ai donc essayé de créer une fonction d'attente dans clojure, en utilisant la classe WebDriverWait pour tester un élément par attribut, de préférence en utilisant la syntaxe clojure des fonctions webdriver/by. Cependant, la classe waiter until method prend une interface générique (com.google.common.base.Function) en paramètre, et comme mes connaissances Java sont quasiment inexistantes, cela s'avère trop pour mes compétences naissantes de clojure.

Quelqu'un là-bas avec des compétences d'interopérabilité clojure-java et une idée sur la façon d'implémenter le code java suivant dans clojure pour qu'il se combine avec la syntaxe webdriver/by?

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")) 

Le résultat devrait faire quelque chose comme cela possible

(defn test [] 
    (let [driver (webdriver/new-driver :firefox)] 
    (webdriver/get driver "http://127.0.0.1/") 
    (webdriver/wait-for (webdriver/by-name "button")) 
    )) 

Répondre

9

Je ne sais pas quoi que ce soit au sujet WebDriver, mais les moyens de Clojure pour mettre en œuvre une interface sont proxy et réifier (et DEFTYPE et defrecord, mais ceux-ci ne sont probablement pas pertinents ici). Avec reify, la mise en œuvre de cette interface ressemblerait à quelque chose comme

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

Clojure ne gère pas les médicaments génériques en aucune façon, mais les paramètres de type Java de génériques n'existe pas à l'exécution, vous devriez donc être en mesure de passer votre mise en œuvre de l'interface de fonction à tout ce qui attend tout type de fonction.

Questions connexes