Pregunta Manejar múltiples ventanas en Python


Estoy trabajando en proyecto de automatización de selenio usando Python.

Me enfrenta a un problema, que es el manejo de varias 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 porque el foco sigue estando en el controlador web de la página de inicio.

¿Alguien puede mostrarme 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 saber el nombre de la ventana? Si esta es una forma incorrecta de hacer esto, ¿alguien puede dar algunos ejemplos de código para realizar esta acción?


27
2018-05-17 04:26


origen


Respuestas:


Puedes hacerlo usando window_handles y switch_to_window método.

Antes de hacer clic en el enlace, primero guarde el identificador de 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]

luego ejecuta el interruptor a la ventana methow para pasar a la ventana recién abierta

driver.switch_to_window(window_after)

y de manera similar, puede cambiar entre la ventana nueva y la vieja. A continuación está 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()

17
2018-05-01 05:58



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

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


17
2018-05-17 08:11



Además de las respuestas ya dadas, para abrir una pestaña nueva el comando javascript window.open() puede ser usado.

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

Luego puede 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 cierre 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.


8
2017-08-19 11:30



Podemos manejar las diferentes ventanas moviéndonos entre ventanas nombradas usando el "cambiar a"Método:

driver.switch_to.window("windowName")

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

Alternativamente, puede pasar un "identificador de ventana" al "switchTo (). ventana ()"Método. Sabiendo esto, es posible iterar sobre cada ventana abierta de esta manera:

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

3
2018-05-12 06:27