Manejar múltiples ventanas en Python

Estoy trabajando en un proyecto de automatización de selenium usando Python.

Estoy enfrentando un problema, que es manejar múltiples ventanas del navegador.

El escenario es el siguiente. Cuando hago clic en un enlace en la página de inicio, se abre una nueva ventana. En la ventana recién abierta no puedo realizar ninguna acción, ya que el foco sigue estando en el controlador web de la página de inicio.

¿Alguien me puede mostrar cómo cambiar el enfoque de la ventana de fondo a la ventana recién abierta?

Una posible solución es driver.switch_to.window() , pero requiere el nombre de la ventana. ¿Cómo averiguar el nombre de la ventana? Si esta es una forma incorrecta de hacerlo, ¿puede alguien dar algunos ejemplos de código para realizar esta acción?

Puedes hacerlo usando los window_handles y switch_to_window .

Antes de hacer clic en el enlace, primero almacene el manejador de la ventana como

 window_before = driver.window_handles[0] 

después de hacer clic en el enlace almacenar el identificador de ventana de la ventana recién abierta como

 window_after = driver.window_handles[1] 

a continuación, ejecute el interruptor a methow ventana para mover a la ventana recién abierta

 driver.switch_to_window(window_after) 

y de igual manera puedes cambiar entre la ventana antigua y la nueva. A continuación se muestra el ejemplo del 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() 

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

Esto es lo que el docu tiene que decir sobre el cambio de ventanas.

Sobre las respuestas ya dadas, para abrir una nueva pestaña se puede usar el comando javascript window.open() .

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 

Entonces puedes 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 cierra la pestaña recién abierta

 # 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.

Podemos manejar las diferentes ventanas moviéndonos entre ventanas con nombre usando el método ” switchTo “:

 driver.switch_to.window("windowName") Click here to open a new window 

Alternativamente, puede pasar un “identificador de ventana” al métodoswitchTo (). Window () “. Sabiendo esto, es posible iterar sobre cada ventana abierta así:

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

por ej. puedes tomar

 driver.get('https://www.naukri.com/') 

Ya que, es una ventana actual, podemos nombrarla.

 main_page = driver.current_window_handle 

Si hay al menos una ventana emergente, excepto la ventana actual, puede probar este método y poner la condición if en break break by hit n trial para el índice

 for handle in driver.window_handles: if handle != main_page: print(handle) login_page = handle break 

Después del inicio de sesión, al volver a la página actual,

 driver.switch_to.window(login_page) 

Ahora, independientemente de las credenciales que tenga que aplicar, proporcione una vez que se haya registrado. La ventana desaparecerá, pero tendrá que acceder a la ventana de la página principal y habrá terminado.

 driver.switch_to.window(main_page) sleep(10)