2012-03-30 76 views
26
<div>  
    <iframe id="cq-cf-frame ">  
    <iframe id="gen367"> 
     <body spellcheck="false" id="CQrte" style="height: 255px; font-size: 12px; font-family:tahoma,arial,helvetica,sans-serif; background-image: url(&quot;/libs/cq/ui/widgets/themes/default/ext/form/text-bg.gif&quot;); background-repeat: repeat-x; background-attachment: fixed;"> 
     <p>4t43t4<br></p> 
     </body > 
    </iframe> 
    </iframe>  
</div> 

En este escenario hay una iframe bajo iframe. Y tengo que seleccionar el exterior iframe para ir al interior iframe y escribir en el cuerpo que está en el interior iframe.Cómo manejar iframe en selenio WebDriver usando java

A continuación, tengo que salir de la iframe interior a iframe exterior y haga clic en el botón Aceptar, (que se encuentra en el exterior iframe).

que sigue es mi código

/*Line 1 */ driver.switchTo().frame("cq-cf-frame"); 
/*  2 */ driver.findElement(By.css("#extdd-9 > div.tblRow > input.edititem").click(); 
/*  3 */ driver.switchT().Frame("cq-gen379"); 
/*  4 */ driver.findElement(By.id("CQrte").sendKeys("Tnx"); 
/*  5 */ selenium.selectFrame("relative=up");  
/*  6 */ driver.findElement(By.xpath("//button[text()='OK']")).click(); 

siguiente es mi problema:

Mi código de prueba está trabajando bien hasta la línea número 4 es decir, escribir en el cuerpo, pero quiero venir desde el interior al exterior iframe dice que no se ha encontrado el elemento //button[text()='OK'].

Intenté con usar index, parent, relative, pero no tuve suerte.

NOTA: Si no selecciono el cuadro interno (cq-gen379). Puedo hacer clic en el botón OK.

Respuesta

36

En WebDriver, debe utilizar driver.switchTo().defaultContent(); salir de un marco. Primero debe salir de todos los marcos y luego volver a cambiar al marco externo.

// between step 4 and step 5 
// remove selenium.selectFrame("relative=up"); 
driver.switchTo().defaultContent(); // you are now outside both frames 
driver.switchTo().frame("cq-cf-frame"); 
// now continue step 6 
driver.findElement(By.xpath("//button[text()='OK']")).click(); 
+0

También, como un FYI: he encontrado que switchTo(). Frame necesita espera implícita desactivada: driver.manage(). Timeouts(). ImplicitlyWait (0, TimeUnit.SECONDS); – JohnP2

30

Tienes que volver a salir del marco flotante con el siguiente código:

driver.switchTo().frame(driver.findElement(By.id("frameId"))); 
//do your stuff 
driver.switchTo().defaultContent(); 

esperanza de que ayuda a

+0

Acepto esta respuesta. En la sección "// haz tus cosas", usaría un JavaScriptExectutor si el DOM devuelto parece ser nulo. P: ¿Por qué el método se llama ".frame" cuando el nombre real de la etiqueta es "iframe" ??? ¿Los marcos/conjuntos de marcos no son diferentes de un iframe? – djangofan

+0

Hola, esta es solo mi suposición, pero un iframe sigue siendo un tipo de marco y este fragmento de código no es iframe exclusivo, por lo que debería funcionar con otros marcos (no lo compruebo) – Tarken

+0

Si guarda el url con 'driver. getCurrentUrl(). then (function (data) { \t console.log ("la url es:" + datos); }); 'encontrarás que es una ruta diferente sin algunas de las características. Básicamente, has dejado atrás todos tus scripts. Todavía estoy tratando de resolver esto yo mismo. – Shane

1

para volver al marco de los padres, el uso:

driver.switchTo().parentFrame(); 

para volver al primer cuadro principal /, utilice:

driver.switchTo().defaultContent(); 
17

Es necesario encontrar primero iframe. Puedes hacerlo usando la siguiente declaración.

WebElement iFrame= driver.findElement(By.tagName("iframe")); 

A continuación, puede swith a él utilizando switchTo método en que WebDriver objeto.

driver.switchTo().frame(iFrame); 

Y para volver al marco de los padres, puede utilizar switchTo().parentFrame() o si desea volver a la estructura principal (o la mayoría de los padres), puede utilizar switchTo().defaultContent();.

driver.switchTo().parentFrame(); // to move back to parent frame 
driver.switchTo().defaultContent(); // to move back to most parent or main frame 

Espero que ayude.

2
WebDriver driver=new FirefoxDriver(); 
driver.get("http://www.java-examples.com/java-string-examples"); 
Thread.sleep(3000); 
//Switch to nested frame 
driver.switchTo().frame("aswift_2").switchTo().frame("google_ads_frame3"); 
1

A continuación enfoque de gestión de tramas: Cuando no se da ninguna identificación o nombre en caso de marco anidado

WebElement element =driver.findElement(By.xpath(".//*[@id='block-block19']//iframe")); 
driver.switchTo().frame(element); 
driver.findElement(By.xpath(".//[@id='carousel']/li/div/div[3]/a")).click(); 
0

selenio conductor bulárcamas Manejo

driver.switchTo().defaultContent(); [parentFrame, defaultContent, frame]

Marcos :

// Based on index position: 
int frameIndex = 0; 
List<WebElement> listFrames = driver.findElements(By.tagName("iframe")); 
System.out.println("list frames "+listFrames.size()); 
driver.switchTo().frame(listFrames.get(frameIndex)); 

// XPath|CssPath Element: 
WebElement frameCSSPath = driver.findElement(By.cssSelector("iframe[title='Fill Quote']")); 
WebElement frameXPath = driver.findElement(By.xpath(".//iframe[1]")); 
WebElement frameTag = driver.findElement(By.tagName("iframe")); 

driver.switchTo().frame(frameCSSPath); // frameXPath, frameTag 


driver.switchTo().frame("relative=up"); // focus to parent frame. 
driver.switchTo().defaultContent(); // move to the most parent or main frame 

// For alert's 
Alert alert = driver.switchTo().alert(); // Switch to alert pop-up 
alert.accept(); 
alert.dismiss(); 

Prueba XML:

<html> 
    <IFame id='1'>...  parentFrame() « context remains unchanged. <IFame1> 
    | 
    -> <IFrame id='2'>... parentFrame() « Change focus to the parent context. <IFame1> 

    <Fame id='11'>...  defaultContent() « driver focus to top window/first frame. <html> 
    | 
    -> <Frame id='22'>... defaultContent() « driver focus to top window/first frame. <Fame11> 
          frame("relative=up") « focus to parent frame. <Fame11> 

    ... 

Conversión de RC a Web-controlador Java comandos. link.

Cuestiones relacionadas