2012-06-04 20 views
29

Estoy usando java con WebDriver. Tengo que cambiar entre dos fotogramas. Grabé el caso de prueba en IDE de selenio y obtuve los valores como selectFrame relative = top select Frame = Frame medioCómo cambiar entre fotogramas en Selenium WebDriver usando Java

Pero existe el problema de que no es capaz de reconocer el relative = top y middleFrame. ¿Cómo puedo resolver este problema en Selenium WebDriver con Java?

Respuesta

45

método de WebDriver driver.switchTo().frame() toma uno de los tres argumentos posibles:

  • A number.

    seleccionar un marco por su índice (basado en cero). Es decir, si una página tiene tres marcos , el primer cuadro estaría en el índice 0, el segundo en el índice 1 y el tercero en el índice 2. Una vez que se ha seleccionado el marco, todas las llamadas posteriores en la interfaz WebDriver se realizan en ese marco.

  • A name or ID.

    seleccionar un marco por su nombre o ID. Los marcos ubicados por nombre coincidente tienen prioridad sobre los que coinciden con ID.

  • A previously found WebElement.

    seleccionar un marco utilizando su WebElement que antes se encontraba.

Consigue el cuadro por su ID/nombre o localizarlo por driver.findElement() y usted será bueno.

+0

¿Cómo switchTo(). Marco (0) manejar el iframe VS. frame-in-frameset? ¿Se cuenta la etiqueta "frameset"? – djangofan

+0

@djangofan Buena pregunta. No sé, nunca he usado el parámetro numérico. Supongo que no cuenta el elemento ''. Si alguna vez lo pruebas, comparte tus resultados :). –

+3

Aunque esto es viejo, lo publicaré para otros, por mi experiencia ** ** no cuenta los elementos 'frameset'. – aurbano

1

Este código está en groovy, por lo que es muy probable que tenga que volver a trabajar. El primer param es una url, el segundo es un contador para limitar los intentos.

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

Es necesario asegurarse de que una vez que se haya cambiado a un marco, necesite volver al contenido predeterminado para acceder a los elementos de otro cuadro. Como Webdriver tiende a encontrar el nuevo marco dentro del marco actual.

driver.switchTo().defaultContent() 
14

a switchto un marco:

driver.switchTo.frame("Frame_ID"); 

para cambiar al defecto.

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

Esto es complicado. Cambiar al contenido predeterminado es uno de los peores métodos que conozco en Seleniums API. Puesto que si elige driver.switchTo(). DefaultContent() y vuelve a emitir driver.switchTo(). DefaultContent() no hay garantía de dónde termina. Estados de Java Doc: selecciona el primer fotograma en la página o el documento principal cuando una página contiene iframes. Así que si ya estás en el marco raíz terminas en el primer cuadro con todo el caos que esto conlleva. Así que siempre prueba si ya estás en el marco raíz (javascript -> return self.location === top.location;) –

1

También puede utilizar:

driver.switch_to.frame(0) 

(0) ser el primer marco flotante en el html.

para cambiar de nuevo al contenido predeterminado:

driver.switch_to.default_content() 
+1

Me salvaste el día. Gracias –

+0

Me alegro de poder ayudar! –

5

primero hay que localizar el ID de trama y definirlo en un WebElement

Por ejemplo: - WebElement fr = driver.findElementById("id");

A continuación, cambiar a la marco usando este código: - driver.switchTo().frame("Frame_ID");

Un script de ejemplo: -

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

driver.switchTo().frame(fr); 

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

También existe la posibilidad de utilizar WebDriverWait con ExpectedConditions (para asegurarse de que Frame estará disponible).

  1. Con cadena como parámetro

    (new WebDriverWait(driver, 5)).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt("frame-name")); 
    
  2. Con localizador como parámetro

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

Más información se puede encontrar here

Cuestiones relacionadas