2011-05-17 352 views
13

Quiero poder abrir un enlace en una nueva pestaña en Selenium 2. También quiero cerrar la pestaña cuando termine de interactuar con la página. ¿Cómo es esto posible si tengo un WebElement de una etiqueta <a>?Selenium 2: Abrir enlace en una nueva pestaña y cerrar pestañas

estoy usando la API de Java de Selenio 2 con el controlador de Firefox, que se ejecuta en Firefox 4.

+0

Pensé en una solución usando JavaScript. Tal vez esa es la forma más fácil? – Alp

+1

¿Compartirías esta solución? Estoy teniendo el mismo problema. –

+0

No encontré una solución. Parece que no hay forma de hacerlo, ver también la respuesta aceptada. – Alp

Respuesta

6

Por el momento, la API de selenio WebDriver no tiene ninguna manera de manejar las pestañas. El proyecto realmente necesitaría un conjunto de métodos consistente y entre navegadores para administrar pestañas antes de esperar ver una implementación en uno de los enlaces de lenguaje como Java. Hasta entonces, su solución de JavaScript puede ser la única manera, y recuerde que su código sería responsable de administrar la vida útil de esa pestaña.

+0

Temía que esta fuera la respuesta. Gracias. – Alp

7

La forma en que descubra para el selenio 2, trabajan muy bien para Chrome y Firefox, IE tiene problema de control de seguridad:

Set<String> winSet = webDriver.getWindowHandles(); 
List<String> winList = new ArrayList<String>(winSet); 
String newTab = winList.get(winList.size() - 1); 
webDriver.close(); // close the original tab 
webDriver.switchTo().window(newTab); // switch to new tab 
+2

por lo que he entendido, este método solo permite el manejo de 'windows', not' tabs' – Alp

6

de usar el selenio en su mejor momento en el que sol-lógicas combinarlo con java.awt .robot clase. puede enviar claves que pueden cerrar una ventana del navegador. trate de usar

Robot robot = new Robot(); 
robot.keyPress(KeyEvent.VK_CONTROL); 
robot.keyPress(KeyEvent.VK_W); 

y responder si funciona

3

Aquí es cómo lo hice usando Python.

Esta solución está un poco sucia pero funciona si quiere cerrar la pestaña.

Im imitando el acceso directo Mac CMD + W para cerrar una pestaña, si está ejecutando Windows, es posible que deba implementar una combinación de teclas diferente.

import from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.common.keys import Keys 
from selenium.webdriver.common.action_chains import ActionChains 
from selenium import webdriver 

driver = webdriver.Firefox() 
driver.get("http://www.amazon.com/gp/search/ref=sr_in_-2_p_lbr_brands_browse-_2895?rh=n%3A172282%2Cn%3A!493964%2Cn%3A502394%2Cp_lbr_brands_browse-bin%3ALytro") 
action_chains = ActionChains(driver) 
action_chains.key_down(Keys.COMMAND + "w") 
action_chains.perform() 
action_chains.key_up(Keys.COMMAND + "w") 
driver.implicitly_wait(5) 
3

Lo que yo uso es la clase Robor.

Robot robot = new Robot(); 
robot.keyPress(KeyEvent.VK_CONTROL); 
robot.keyPress(KeyEvent.VK_W); 
robot.keyRelease(KeyEvent.VK_CONTROL); 
robot.keyRelease(KeyEvent.VK_W); 

Esto hace que el robot rápidamente presione y suelte las teclas CTRL + W para simular la interacción del usuario. Si solo usa el evento keyPress, esto cerrará todas las pestañas y ventanas del WebDriver.

Espero te ayudé.

4

Me tomó un tiempo (~ 2 semanas) rastrear la secuencia correcta de comandos, pero este es de lejos el método más fácil que he encontrado para una configuración Win7/Chrome para abrir un enlace en una nueva pestaña Y cambiar a la nueva pestaña automáticamente

¡ADVERTENCIA! Asegúrese de realizar siempre las acciones de keyUp. Si no realiza KeyUp, su sistema mantendrá esas teclas presionadas hasta que se produzca un reinicio o una tecla.

Windows 7/Chrome:

WebElement elem = driver.findElement(By.linkText("MyLinkText")); 

// Chrome key combos: 
// SHIFT + CTRL + click = Open in new tab (and switch to new tab) 
// SHIFT + CTRL + RETURN = Open in new tab (in background) 
Actions act = new Actions(driver); 
act.keyDown(Keys.LEFT_CONTROL).keyDown(Keys.LEFT_SHIFT).perform(); 

// Wrap in a try/catch during implementation to ensure you perform keyUp(s). 
elem.click(); 

act.keyUp(Keys.LEFT_CONTROL).keyDown(Keys.LEFT_SHIFT).perform(); 

Nota: Sé que es un hilo de edad, sólo quería para catalogar la solución aquí porque no pude encontrar una solución más elegante y quería salvar a otra persona una poco tiempo (con suerte :).

Editar: Typo

+0

gracias, ese es un gran enfoque – Alp

+0

Ojalá pudiera haber ayudado específicamente con w/FF pero desafortunadamente usamos Chrome como nuestro buscador de prueba principal. Sin embargo, la misma técnica general debería funcionar para otros con sus respectivas combinaciones de teclas. – TwoByteHero

+0

¡Cosas geniales! ¡Gracias! –

Cuestiones relacionadas