2012-05-17 55 views
22

Estoy trabajando en proyecto de automatización de selenio. Aquí estoy usando el lenguaje de Python para la automatización de selenio en lugar de Java.Manejar ventana múltiple en Python

Estoy frente a un problema, manejando varias ventanas se

Escenario al hacer clic en un enlace en la página de inicio de una nueva ventana opens.In la nueva ventana abierta que no puede realizar cualquier acción porque el control se encuentra todavía en el hogar controlador web de la página.

¿Alguien puede pegar aquí un código para configurar el enfoque del control desde la ventana de fondo a la ventana recién abierta.

Una posible solución es self.driver.switchtowindow() está allí en la biblioteca. Pero requiere un nombre de ventana.¿Cómo encontrar el nombre de la ventana? Si esto está mal, ¿alguien puede dar algunos códigos para realizar esta acción?

Respuesta

15

window_handles debería darle las referencias a todas las ventanas abiertas.

this es lo que el documento tiene que decir sobre el cambio de ventanas.

11

Puede hacerlo utilizando el método window_handles y switch_to_window.

Antes de hacer clic en el vínculo primera almacenar el identificador de ventana como

window_before = driver.window_handles[0] 

tras pulsar el acoplamiento del almacén el identificador de ventana de la ventana que se abre como

window_after = driver.window_handles[1] 

luego ejecutar el cambio a methow ventana para mover a la ventana recién abierta

driver.switch_to_window(window_after) 

y similarmente puede cambiar de apuesta Ween vieja y nueva ventana. A continuación se presenta el ejemplo de código

import unittest 
from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 
from selenium.webdriver.common.by import By 

class GoogleOrgSearch(unittest.TestCase): 

    def setUp(self): 
     self.driver = webdriver.Firefox() 

    def test_google_search_page(self): 
     driver = self.driver 
     driver.get("http://www.cdot.in") 
     window_before = driver.window_handles[0] 
     print window_before 
     driver.find_element_by_xpath("//a[@href='http://www.cdot.in/home.htm']").click() 
     window_after = driver.window_handles[1] 
     driver.switch_to_window(window_after) 
     print window_after 
     driver.find_element_by_link_text("ATM").click() 
     driver.switch_to_window(window_before) 


    def tearDown(self): 
    self.driver.close() 

if __name__ == "__main__": 
unittest.main() 
+0

Siguiendo su código, recibo un índice 'IndexError: list index fuera de rango 'cuando ejecuto' window_after = browser.window_handles [1] '. ¿Qué está mal? Ver: https://stackoverflow.com/questions/45354850/focus-on-second-page-form-with-selenium – LucSpan

2

Podemos manejar las diferentes ventanas moviendo entre las ventanas de nombres se crean utilizando el método “switchTo”:

driver.switch_to.window("windowName") 

<a href="somewhere.html" target="windowName">Click here to open a new window</a> 

Alternativamente, se puede pasar un “identificador de ventana” para el método "switchTo(). window()". Sabiendo esto, es posible iterar sobre cada ventana abierta de este modo:

for handle in driver.window_handles: 
    driver.switch_to.window(handle) 
5

En la parte superior de las respuestas ya dadas, para abrir una nueva pestaña del comando javascript window.open() se puede utilizar.

Por ejemplo:

# Opens a new tab 
self.driver.execute_script("window.open()") 

# Switch to the newly opened tab 
self.driver.switch_to.window(self.driver.window_handles[1]) 

# Navigate to new URL in new tab 
self.driver.get("https://google.com") 
# Run other commands in the new tab here 

Usted es entonces capaz de cerrar la pestaña original de la siguiente manera

# Switch to original tab 
self.driver.switch_to.window(self.driver.window_handles[0]) 

# Close original tab 
self.driver.close() 

# Switch back to newly opened tab, which is now in position 0 
self.driver.switch_to.window(self.driver.window_handles[0]) 

o cerrar la pestaña de reciente apertura

# Close current tab 
self.driver.close() 

# Switch back to original tab 
self.driver.switch_to.window(self.driver.window_handles[0]) 

Espero que esto ayude.

+1

switch_to_window está en desuso. Use switch_to.window –

+0

Gracias @StephanSchielke, respuesta actualizada –

Cuestiones relacionadas