2012-06-04 12 views
29

Używam java z WebDriver. Muszę przełączać się między dwiema ramkami. Nagrałem przypadek testowy w selenowym IDE i otrzymałem wartości jako selectFrame względnie = góra wybierz Frame = środkowa klatkaJak przełączać się między ramkami w Selenium WebDriver używając Java

Ale jest problem, że nie jest on w stanie rozpoznać relative = top i middleFrame. Jak mogę rozwiązać ten problem w Selenium WebDriver z Javą?

Odpowiedz

45

driver.switchTo().frame() sposób WebDriver przybiera jedną z trzech możliwych argumenty

  • A number.

    wybrać ramkę, jego (zero), indeksu. Oznacza to, że jeśli strona ma trzy ramki , pierwsza ramka będzie miała indeks 0, druga na indeksie 1 , a trzecia na indeksie 2. Po wybraniu ramki kolejne wywołania interfejsu WebDriver są wykonywane do tej ramki.

  • A name or ID.

    Wybierz ramkę według nazwy lub identyfikatora. Ramki znajdujące się pod pasującymi nazwami Atrybuty mają zawsze pierwszeństwo przed atrybutami o identyfikatorze.

  • A previously found WebElement.

    Wybierz ramkę używając swojego poprzednio znajdujący WebElement.

Get kadr to id/name lub znaleźć go przez driver.findElement() i będziesz dobry.

+0

Jak SwitchTo(). Ramkę (0) uchwyt iframe VS. frame-in-frameset? Czy tag "ramek" jest zliczany? – djangofan

+0

@djangofan Dobre pytanie. Nie wiem, nigdy nie użyłem parametru liczby. Sądzę, że nie liczy się element ''. Testuję to, proszę, podziel się wynikami :). –

+3

Mimo że jest to stare, opublikuję dla innych, z mojego doświadczenia wynika, że ​​** nie ** liczyć elementów 'frameset'. – aurbano

1

Ten kod jest świetny, więc najprawdopodobniej będziesz musiał wykonać przeróbkę. Pierwszym parametrem jest adres URL, a drugim jest licznik ograniczenia prób.

public boolean selectWindow(window, maxTries) { 
    def handles 
    int tries = 0 
    while (true) { 
     try { 
      handles = driver.getWindowHandles().toArray() 
      for (int a = handles.size() - 1; a >= 0 ; a--) { // Backwards is faster with FF since it requires two windows 
       try { 
        Log.logger.info("Attempting to select window: " + window) 
        driver.switchTo().window(handles[a]); 
        if (driver.getCurrentUrl().equals(window)) 
         return true; 
        else { 
         Thread.sleep(2000) 
         tries++ 
        } 
        if (tries > maxTries) { 
         Log.logger.warn("Cannot select page") 
         return false 
        } 
       } catch (Exception ex) { 
        Thread.sleep(2000) 
        tries++ 
       } 
      } 
     } catch (Exception ex2) { 
      Thread.sleep(2000) 
      tries++ 
     } 
    } 
    return false; 
} 
1

Musisz się upewnić, że po przełączeniu w ramkę, musisz przełączyć się z powrotem do domyślnej zawartości, aby uzyskać dostęp do stron internetowych w innych ramkach. Ponieważ program Webdriver znajduje nową klatkę wewnątrz bieżącej klatki.

driver.switchTo().defaultContent() 
14

do SwitchTo ramkę:

driver.switchTo.frame("Frame_ID"); 

przełączenia do domyślnego ponownie.

driver.switchTo().defaultContent(); 
+1

To jest trudne. Przejście do domyślnej zawartości jest jedną z najgorszych metod, jakie znam w Selenium API. Ponieważ jeśli wybierzesz driver.switchTo(). DefaultContent() i ponownie wydaj driver.switchTo(). DefaultContent() nie ma gwarancji, gdzie się kończysz. Dokument Java Doc stwierdza: Wybiera pierwszą klatkę na stronie lub dokument główny, gdy strona zawiera elementy pływające. Więc jeśli już znajdujesz się w ramie głównej, kończysz w pierwszej klatce, przynosząc cały chaos. Zawsze sprawdzaj, czy jesteś już w ramce głównej (javascript -> return self.location === top.location;) –

1

Można również użyć:

driver.switch_to.frame(0) 

(0) bycia pierwszym iframe w html.

aby powrócić do zawartości domyślnej:

driver.switch_to.default_content() 
+1

Uratowałeś mój dzień. Dzięki –

+0

Cieszę się, że mogę pomóc! –

5

najpierw trzeba zlokalizować identyfikator ramki i zdefiniować go w WebElement

Dla ex: - WebElement fr = driver.findElementById("id");

Następnie przełączyć do ramka używająca tego kodu: - driver.switchTo().frame("Frame_ID");

Przykładowy skrypt: -

WebElement fr = driver.findElementById("theIframe"); 

driver.switchTo().frame(fr); 

Then to move out of frame use:- driver.switchTo().defaultContent(); 
1

Istnieje również możliwość użycia WebDriverWait z ExpectedConditions (aby upewnić się, że Frame będzie dostępny).

  1. z ciągiem jako parametr

    (new WebDriverWait(driver, 5)).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt("frame-name")); 
    
  2. Z lokalizatorem jako parametr

    (new WebDriverWait(driver, 5)).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.id("frame-id"))); 
    

Więcej informacji można znaleźć here

Powiązane problemy