2011-09-27 27 views
20

Tengo un iframe que se carga cuando hago clic en una pestaña en una página. Cuando uso Firebug para mirar el marco flotante en Internet Explorer 8, todo lo que veo es:Selenium and iframe

iframe id=tabContextFrame class=contextFrame contentEditable=inherit src=/xyz.dt?forward=show&layouttype=NoHeader&runid=1234 name=tabContextFrame url=/xyz.dt?forward=show&layouttype=NoHeader&runid=1234 scrolling=auto

y eso es it.The jerarquía por debajo del marco flotante no puede ser visto. Quiero hacer clic en un enlace dentro del iframe. Para encontrar los elementos dentro del iframe, hice un selenium.click("on the tab that loads the iframe") y luego selenium.getHtmlSource(). Desde esta fuente, al menos puedo localizar mi enlace de interés. Hice selenium.click("//span[text()='Link']") pero parece que no hace nada. Alguna idea, por favor?

Aquí está el código:

selenium.click("//span[text()='tab that loads iframe']"); 
Thread.sleep(5000); 
selenium.selectFrame("tabContextFrame");   
selenium.mouseOver("//span[text()='Link']"); 
selenium.mouseDown("//span[text()='Link']"); 
selenium.mouseUp("//span[text()='Link']"); 
Thread.sleep(5000); 
selenium.selectFrame("null"); 
+1

¿Has probado selenio 2.0 con el controlador web? U puede usar driver.SwitchTo(). Frame() – Sudara

+0

posible duplicado de [manejo de iframe en webdriver] (http://stackoverflow.com/questions/9942928/handling-iframe-in-webdriver) – Innovation

Respuesta

38

supongo que está utilizando selenio 1.0. ¿Has mirado Selenium 2.0 y WebDriver? Encontré lo siguiente y funcionó para mí:

P: ¿Cómo se escribe en un iframe content ifditable? R: Suponiendo que el marco flotante se denomina "foo":

driver.switchTo().frame("foo"); 
WebElement editable = driver.switchTo().activeElement(); 
editable.sendKeys("Your text here"); 

A veces esto no funciona, y esto se debe a que el iframe no tiene ningún contenido. En Firefox se puede ejecutar el siguiente antes "SendKeys":

((JavascriptExecutor) driver).executeScript("document.body.innerHTML = '<br>'"); 

Esto es necesario porque el iframe no tiene contenido por defecto: no hay nada que enviar a la entrada del teclado. Esta llamada a método inserta una etiqueta vacía , que configura todo muy bien.

Recuerde que debe cambiar fuera del marco, una vez que haya terminado (como todas las otras interacciones será con este marco específico):

driver.switchTo().defaultContent(); 

He encontrado esto en http://code.google.com/p/selenium/wiki/FrequentlyAskedQuestions

0

Uso controlador .switchTo(). defaultContent(); primero, luego haz tu operación