2012-05-17 21 views
22

Sto lavorando nel progetto di automazione del selenio . Qui sto usando il linguaggio Python per l'automazione del selenio invece di Java.Gestire più finestre in Python

Sto affrontando un problema, gestendo più finestre

scenario è quando fa clic su un link nella home page una nuova finestra opens.In finestra appena aperta Non è possibile eseguire alcuna azione perché il controllo è ancora in casa pagina web driver.

Chiunque può incollare del codice qui per impostare il controllo del focus dalla finestra di sfondo alla finestra appena aperta.

Una possibile soluzione è self.driver.switchtowindow() è nella libreria. Ma richiede un nome di finestra. Come trovare il nome della finestra? Se questo è sbagliato qualcuno può dare dei codici per eseguire questa azione?

risposta

15

window_handles dovrebbe fornire i riferimenti a tutte le finestre aperte.

this è ciò che il docu ha da dire sul passaggio a Windows.

11

È possibile farlo utilizzando il metodo window_handles e switch_to_window.

Prima di fare clic sul collegamento prima memorizzare l'handle della finestra come

window_before = driver.window_handles[0] 

dopo aver cliccato il negozio link handle di finestra della finestra appena aperta come

window_after = driver.window_handles[1] 

quindi eseguire il passaggio alla finestra di Methow a muoversi alla finestra di nuova apertura

driver.switch_to_window(window_after) 

e allo stesso modo si può cambiare la scommessa ween vecchia e nuova finestra. Di seguito è riportato l'esempio di codice

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

Seguendo il tuo codice, ricevo un 'IndexError: list index out of range' quando eseguo 'window_after = browser.window_handles [1]'. Che c'è? Vedi: https://stackoverflow.com/questions/45354850/focus-on-second-page-form-with-selenium – LucSpan

2

Siamo in grado di gestire le diverse finestre spostando tra Windows denominato utilizzando il metodo “switchto”:

driver.switch_to.window("windowName") 

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

In alternativa, è possibile passare un “handle di finestra” per il metodo "switchTo(). window()". Sapendo questo, è possibile iterare su ogni finestra aperta in questo modo:

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

In cima alle risposte già date, per aprire una nuova scheda il comando JavaScript window.open() può essere utilizzato.

Ad esempio:

# 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 

Sei quindi in grado di chiudere la scheda originale come segue

# 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 chiudere la scheda di recente apertura

# Close current tab 
self.driver.close() 

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

Spero che questo aiuti.

+1

switch_to_window è deprecato. Usa switch_to.window –

+0

Grazie @StephanSchielke, risposta aggiornata –

Problemi correlati