2012-06-04 10 views
29

Sto usando java con WebDriver. Devo passare tra due frame. Ho registrato il test case in IDE selenio e ho ottenuto i valori come selectFrame relative = top select Frame = middle FrameCome passare da un frame a Selenium WebDriver utilizzando Java

Ma c'è un problema che non è in grado di riconoscere il relativo = top e middleFrame. Come posso risolvere questo problema in Selenium WebDriver con Java?

risposta

45

metodo WebDriver driver.switchTo().frame() prende uno dei tre possibili argomenti:

  • A number.

    selezionare un frame suo indice (a base zero). Cioè, se una pagina ha tre frame , il primo frame sarà nell'indice 0, il secondo nell'indice 1 e il terzo nell'indice 2. Una volta selezionato il frame, tutte le chiamate successive all'interfaccia WebDriver vengono create su quel frame.

  • A name or ID.

    selezionare un frame con il suo nome o ID. I frame localizzati con gli attributi di nome corrispondenti hanno sempre la precedenza su quelli corrispondenti per ID.

  • A previously found WebElement.

    Selezionare un frame utilizzando il suo WebElement trova precedenza.

Prendi il telaio è id/nome o individuarlo da driver.findElement() e sarete pronti.

+0

Come funziona switchto(). Cornice (0) gestire iframe VS. frame-in-frame? Il tag "frameset" è contato? – djangofan

+0

@djangofan Buona domanda. Non lo so, non ho mai usato il parametro numero. Immagino che non contenga l'elemento ''. L'ho mai provato, per favore condividi i tuoi risultati :). –

+3

Anche se questo è vecchio, pubblicherò per altri, dalla mia esperienza non ** conta ** elementi 'frameset'. – aurbano

1

Questo codice è in groovy, quindi molto probabilmente avrai bisogno di fare qualche rielaborazione. Il primo parametro è un url, il secondo è un contatore per limitare i tentativi.

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

È necessario assicurarsi che, una volta passati in un frame, sia necessario tornare ai contenuti predefiniti per accedere agli elementi in un altro frame. Come Webdriver tendi a trovare il nuovo frame all'interno del frame corrente.

driver.switchTo().defaultContent() 
14

ad switchto un frame:

driver.switchTo.frame("Frame_ID"); 

per passare al predefinito nuovamente.

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

Questo è difficile. Passare al contenuto predefinito è uno dei peggiori metodi che conosco nell'API Seleniums. Dal momento che se si utilizza driver.switchTo(). DefaultContent() e si genera nuovamente driver.switchTo(). DefaultContent() non è possibile garantire dove si finisce. Lo stato del documento Java: seleziona il primo fotogramma sulla pagina o il documento principale quando una pagina contiene iframe. Quindi, se sei già nel frame principale, finisci nel primo frame con tutto il caos che questo comporta. Quindi prova sempre se sei già nel frame principale (javascript -> return self.location === top.location;) –

1

È anche possibile utilizzare:

driver.switch_to.frame(0) 

(0) essere il primo iframe sulla html.

per tornare al contenuto predefinito:

driver.switch_to.default_content() 
+1

Hai salvato il mio giorno. Grazie –

+0

Felice di poterti aiutare! –

5

In primo luogo è necessario individuare la cornice id e definirlo in un WebElement

Per esempio: - WebElement fr = driver.findElementById("id");

poi passare alla frame using this code: - driver.switchTo().frame("Frame_ID");

Un esempio di script: -

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

driver.switchTo().frame(fr); 

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

C'è anche la possibilità di usare WebDriverWait con ExpectedConditions (per assicurarsi che Frame sia disponibile).

  1. Con stringa come parametro

    (new WebDriverWait(driver, 5)).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt("frame-name")); 
    
  2. Con localizzatore come parametro

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

Maggiori informazioni si possono trovare here

Problemi correlati