2015-11-10 14 views
5

Mam metodę, która klika przycisk, jednak po uruchomieniu selen powraca do wyniku po kliknięciu z powodzeniem, kiedy w rzeczywistości przycisk nie jest kliknięty. Jeśli przeprowadzę test kilka razy, okazyjnie, kliknięcie zostanie wykonane zgodnie z oczekiwaniami. Moja struktura testowa jest ustawiona jako domniemane oczekiwanie na około 15 sekund. Ustawiłem wyraźne oczekiwanie na ten element i nadal widzę ten sam problem. Kiedy robię <element>.isDisplayed(), element jest zawsze znaleziony. Umieściłem .click w pętli while, aby kliknąć go kilka razy, co działa przez większość czasu, jednak czasami zdarza się, że test się nie powiódł. Czy możliwe jest posiadanie instrukcji if w celu sprawdzenia, czy element jest rzeczywiście wyświetlany przed kliknięciem przycisku?Selen kliknie element "pomyślnie", ale tak naprawdę nie jest klikany

Próbowałem:

if(!element.isDisplayed){ 
    element.click 
} 

Oto przycisk Mam problemy z:

<button class="notkoButton listNew"> 
<div class="l6e iconAdd">New List</div> 
</button> 

Oto moja metoda:

public marketing_lists_page navigateToNewListPage() throws Throwable { 
    try { 
     int x = 0; 
     while(x < 5) { 
      newListBtn.click(); 
      x++; 
     } 
     //newListPageHeader.isDisplayed(); 
    } catch (NoSuchElementException e){ 
     logs.errorDetails("Could not navigate to New List Page"); 
     Assert.fail(); 
    } 
    return this; 
} 
+0

Nie powinieneś wykonywać 'if (! Element.isDisplayed) {element.click};'. – AGill

+0

Możliwy duplikat [webdriver - czekaj na element] (http://stackoverflow.com/questions/11736027/webdriver-wait-for-element) – JeffC

Odpowiedz

4

Wydaje się, że element nie jest włączona lub nie klikać na początku.I odpowiedzieć na pytanie, tak istnieje wyraźna wait można używać i czekać na element, aby być klikalny:

WebDriverWait wait = new WebDriverWait(driver, timeOut); 
wait.until(ExpectedConditions.elementToBeClickable(locator)); 
+0

Po zmaganiu się z tym konkretnym elementem i wypróbowaniu sugestii innych, było to najlepsze rozwiązanie. Czasami jednak zawiedzie. Tak samo jak staram się unikać Thread.sleep() po tym, jak element był klikalny w moich testach, aby skrypt się nie zawiódł, musiałem go użyć. –

0

Mówisz próbowało wyraźne oczekiwanie, ale wygląda na to, że to, o co prosisz, najlepiej można osiągnąć przy pomocy fluentWait (który jest rodzajem wyraźnego oczekiwania):

public WebElement fluentWait(final By locator) { 
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver) 
     .withTimeout(30, TimeUnit.SECONDS) 
     .pollingEvery(5, TimeUnit.SECONDS) 
     .ignoring(NoSuchElementException.class); 

WebElement foo = wait.until(new Function<WebDriver, WebElement>() { 
    public WebElement apply(WebDriver driver) { 
     return driver.findElement(locator); 
    } 
}); 

return foo; };; 

Tutaj WebElement będzie przyciskiem, który próbujesz kliknąć. Fajną rzeczą w FluentWait jest to, że sam element jest zwracany, jeśli zostanie znaleziony. Z dokumentacji:

Implementacja interfejsu Wait, który może mieć ustawiony czas oczekiwania i interwał sondowania w locie. Każda instancja FluentWait określa maksymalny czas oczekiwania na warunek, a także częstotliwość sprawdzania warunku. Ponadto użytkownik może skonfigurować oczekiwanie na ignorowanie określonych typów wyjątków podczas oczekiwania, takich jak NoSuchElementExceptions podczas wyszukiwania elementu na stronie.

Aby go użyć po prostu zrobić:

WebElement newListBtn = fluentWait(By.id("button")); 

Sponsorowane:

Driver.SwitchTo().DefaultContent(); 

przed kliknięciem tylko w przypadku jest to kwestia rama.

+0

Próbowałem używać fluentWait i otrzymuję te same wyniki. Chodzi o to, że selen przechodzi ten krok jako sukces, ale tylko sporadycznie zostanie kliknięty. Próbowałem używać css i xpath, element im using nie ma przypisanego do niego id. @marchocolate –

+0

Interesujące. W pętli, w której klikasz ją pięć razy, po każdym kliknięciu wywoływam metodę ConfirmPage (Next_Page). Pomyśl o elemencie, który można znaleźć tylko na następnej stronie, i poszukaj go po każdym kliknięciu. Jeśli jest, kliknięcie zadziałało i możesz wyjść z pętli. Jeśli nie, spróbuj kliknąć ponownie. Zastanowię się nad jakimś kodem i go edytuję. – marchocolate

+0

Nawet jeśli przycisk nie ma id, to ma klasę "notkoButton listNew", czy ta klasa jest używana w innym miejscu na stronie? – marchocolate

1

Spróbuj przewinąć do elementu, zanim go klikniesz. Dzieje się tak najczęściej, gdy testujesz na chrome. Do przewijania można użyć JavaScriptExecutor.

coś takiego:

JavascriptExecutor jse = (JavascriptExecutor)driver; 
jse.executeScript("window.scrollTo(0," + element.getLocation().Y + ")"); 
+0

Dziękuję za to, ale element jest na górze strony i używam firefox. –

+0

Czy próbowałeś użyć elementu.sendkeys (Keys.Enter) lub element.sendkeys (Keys.return) zamiast kliknięcia() – Prat0567

1

Spróbuj, kliknij przy użyciu javascript i czuć się swobodnie zmienić zlokalizowania dla elementu według Państwa wygoda: -

WebElement element= driver.findElement(By.xpath("YOUR XPATH")); 

JavascriptExecutor executor = (JavascriptExecutor) driver; 
executor.executeScript("arguments[0].click();", element); 

nadzieję, że pomoże :)

0

Selen cierpi na brak GUI "dynamiki". W tym celu zalecam odświeżenie strony po kliknięciu.

Powiedz mi, co słychać.

0

Miałem do czynienia z dokładnie tym samym problemem, ale dopiero po tym, jak zaktualizowałem moje biblioteki selenowe z 2.45 na 2.48.2. Wywołanie metody "kliknij" nigdy się nie zawiedzie, co oznacza, że ​​element zawsze znajduje się w sterowniku, co nie jest możliwe, ponieważ kliknięcie odpowiedniego miejsca może być niemożliwe. Mój test działał poprawnie na ekranie o wyższej rozdzielczości i czasami przechodzi (ale najczęściej kończy się niepowodzeniem z powodu problemów z kliknięciami) na ekranie o niższej rozdzielczości. Próbowałem wielu rzeczy, ale w końcu to, co zadziałało, to ZOOM.

Przed uruchomieniem testu wywołuję następującą metodę, a metoda "kliknij" działa teraz zgodnie z oczekiwaniami na ekranie o niskiej rozdzielczości.

public void zoomOut() { 
     WebElement html = driver.findElement(By.tagName("html")); 
     html.sendKeys(Keys.chord(Keys.CONTROL, Keys.SUBTRACT)); 
}