2015-07-16 13 views
5

Metoda until() w org.openqa.selenium.support.ui.FluentWait jest przeciążona dla interfejsów Predicate<T> i Function<? super T, V> jako parametrów.Nie można zrozumieć implementacji metody until() w FluentWait

Należy przyjąć jako argument jednego z następujących (w których zastosowano metodę apply()):

  • klasy Anonymous ekspresji
  • N
  • Referencyjny sposób

Każda lambda, że ​​określenie jako argument dla tej metody zgłasza następujący błąd:

Metoda aż (Predicate) jest niejednoznaczna dla typu WebDriverWait

Moja Lambda:

x -> x.findElement(byLocator).isDisplayed() 

Zakładam, że będzie to sprawa dla każdego lambda, jak apply() dla każdej funkcji lub Predicate mogą być realizowane przy użyciu z tych lambda.

Więc moje pytanie brzmi, jakie jest zastosowanie metody until, która przyjmuje Predicate jako parametr?

Zaktualizowana: Usunięto pierwszą część pytania, na którą odpowiedział @drkthng.

Odpowiedz

2

Odpowiadając na pierwsze pytanie:

spojrzeć na Selenium API docs for ExpectedConditon.

cytuję:

public interface ExpectedCondition<T> 
extends com.google.common.base.Function<WebDriver,T> 

Widać, że ExpectedCondition dziedziczone z interfejsu funkcji Google, więc można go używać jako argumentu metody aż do().

Co do drugiego pytania:

Nie sądzę, można przekazać lambda tak po prostu. Dopóki metoda nie oczekuje predykatu lub funkcji (jak już wspomniano poprawnie).

Odnośnie różnic między orzeczników i lambda, spojrzeć na przykład here

więc można spróbować coś takiego zamiast ciągle przy użyciu lambda wyrażeń:

Predicate<WebDriver> myPredicate = x ->x.findElement(By.id("id")).isDisplayed(); 

WebDriverWait wait = (WebDriverWait)new WebDriverWait(driver, 10); 
wait.until(myPredicate); 
+0

Tak, nigdy nie zaobserwowano, każda metoda w klasie 'ExpectedConditions' powrócić' ExpectedCondition '' która rozciąga funkcji '. Więc wszystkie moje rozdzierające włosy na pierwszą część pytania wynikały tylko z niedopatrzenia. Dziękuję za odpowiedź, teraz za drugą część, mam nadzieję, że to nie okaże się również fizzlerem. – Husam

+0

już miał przesłać drugą część mojej odpowiedzi, kiedy skomentowałeś ;-) – drkthng

+0

Jeszcze raz dziękuję. Ogólnie mogę też przekazać Lambda bezpośrednio, ale w 'until()' jestem zmuszony użyć odniesienia do lambda. Co nasuwa pytanie, dlaczego przeładować metodę, gdy pierwsza (z "Funkcja " jako parametr) może osiągnąć to samo. – Husam

0

Jak powiedział metoda until jest przeciążone, a spodziewane parametry to Predicate<T> i Function<? super T, V>.

Twój lambda mecz ekspresja obu podpisów, więc wywołanie metody jest niejednoznaczne, aby rozwiązać niejednoznaczność, istnieje kilka opcji:

Obsada wyrażenia lambda do żądanego typu:

until((Predicate<WebDriver>) x -> x.findElement(byLocator).isDisplayed()); 

Jeśli tworzysz zmienną do wyrażenia lambda, obsada nie jest potrzebna:

Predicate<WebDriver> p = x.findElement(byLocator).isDisplayed(); 
until(p); 

Jeśli masz metodę z tej funkcji, można użyć meto d odniesienie:

boolean testMethod(WebDriver x) { 
    return x.findElement(byLocator).isDisplayed(); 
} 

until(MyClass::testMethod); 
0

Otrzymujesz błąd, ponieważ wyrażenie lambda pasuje do predykatu i funkcji.

Należy rozważyć ulepszenie selenu do wersji 3.0.2. -> w którym metoda FluentWait.until(Predicate<?>) jest przestarzała. A to powinno sprawić, że lambdas będzie działał poprawnie z instancjami Wait teraz.

0

Poniżej funkcjonalnej implementacji interfejsu powinno rozwiązać problem:

FluentWait<WebDriver> wait = new FluentWait<WebDriver>(driver); 
    wait.pollingEvery(500, TimeUnit.MILLISECONDS); 
    wait.withTimeout(5, TimeUnit.MINUTES); 
    wait.ignoring(NoSuchElementException.class); 
    wait.until((WebDriver arg0) ->{ 
    WebElement element = arg0.findElement(By.id("colorVar")); 
    String color = element.getAttribute("style"); 
    System.out.println("The color if the button is " + color); 
    if(color.equals("color: red;")) 
    { 
     return true; 
    } 
    return false; 
    }); 
Powiązane problemy