2011-06-23 20 views
5

Próbuję wykonać stosunkowo proste zadanie: czekać, aż przekierowanie strony zostanie zakończone. Właśnie widziałem another odpowiedział na pytanie na ten temat, gdzie porada jest czekać na pojawienie się określonego tekstu na drugiej stronie (JEŚLI mam to prawo). Jeśli tak, to czy zostanie zmienione oczekiwanie na window.location? Czy lepiej? Gorzej? Mniej stosowane? Każdy inny pomysł? po prostu ciekawy, w razie potrzeby, może oznaczyć to pytanie jako wspólnotowe wiki.Jak czekać na przekierowanie strony w Selenium?

Dzięki!

Odpowiedz

1

Monitorowanie wartości, zwrócone driver.get_location wykonał pracę idealnie do mnie. Najwyraźniej z tego co zrozumiałem w ciągu 5 minut podglądania kodu, monitorowano wartość window.location.href pod maską.

+4

Czy mógłbyś bardziej szczegółowo opisać, w jaki sposób monitorujesz wartość? – emery

+0

Czy możesz to rozwinąć –

1

Tak Wystąpił ten problem wiele razy podczas korzystania z Selenium. Są dwa sposoby na obejście tego problemu. Po pierwsze możesz zmienić domyślny czas oczekiwania. Na przykład biorąc pod uwagę ten kawałek kodu:

Actions builder = new Actions(driver); 
builder.click(driver.findElement(By.className("lala"))).perform(); 

Ten kod wygeneruje wyjątek, jeśli w tym momencie to się nazywa nie ma żadnych elementów, które mogłyby zostać uznane dopasować klasę „lala”. Możesz zmienić ten domyślny czas oczekiwania na:

driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); 

To sprawia, że ​​kierowca odpytuje przez 5 sekund, zamiast od razu nie reagować. Jeśli element nadal nie może być zlokalizowany po 5 sekundach, akcja zakończy się niepowodzeniem. Oczywiście możesz zmienić to ustawienie. Odkryłem, że ta metoda działa dobrze przez większość czasu. Przez większość czasu nie przejmujesz się ładowaniem całej strony, tylko pewną częścią.

Pisałem również inną funkcję, która jest GetElementByClassAndText który zrobi to samo jako niejawny czekać na elemencie oprócz tego, że również sprawdza zawierający tekst, jak również w celu umożliwienia drobniejsze detale, co chcesz:

public static void waitAndClick(WebDriver driver, By by, String text) { 
    WebDriverWait wait = new WebDriverWait(driver, 10000); 
    Function<WebDriver, Boolean> waitForElement = new waitForElement(by); 
    wait.until(waitForElement); 

    for(WebElement e : driver.findElements(by)) { 
     if(e.getText().equals(text)) { 
      Actions builder = new Actions(driver); 
      builder.click(e).perform(); 
      return; 
     } 
    } 
} 

a odpowiednia funkcja używa:

public class waitForElement implements Function<WebDriver, Boolean> { 
    private final By by; 
    private String text = null; 

    public waitForElement(By by) { 
     this.by = by; 
    } 

    public waitForElement(By by, String text) { 
     this.by = by; 
     this.text = text; 
    } 

    @Override 
    public Boolean apply(WebDriver from) { 
     if(this.text != null) { 
      for(WebElement e : from.findElements(this.by)) { 
       if(e.getText().equals(this.text)) { 
        return Boolean.TRUE; 
       } 
      } 

      return Boolean.FALSE; 
     } else { 
      try { 
       from.findElement(this.by); 
      } catch(Exception e) { 
       return Boolean.FALSE; 
      } 

      return Boolean.TRUE; 
     } 
    } 
} 

Zdaję sobie sprawę, że używasz selenu w Ruby, ale mam nadzieję, że niektóre z moich kodu (przynajmniej koncepcyjnie) jest zbywalne i pomocny dla Ciebie.

+0

Nie jestem pewien, czy to odpowiada na pytanie: czy możliwe jest po prostu sprawdzenie zmiany w lokalizacji window.location zamiast korzystania z rodzaju strategii, którą implementuje twój kod? – emery

-3

Możesz użyć tej funkcji, spowoduje to ponowne załadowanie bieżącej strony (po przekierowaniu): driver.getCurrentUrl();

Powiązane problemy