2013-06-26 45 views
9

Sto tentando di aprire una nuova scheda OPPURE una nuova finestra in un browser che utilizza il selenio per Python. È di poca importanza se viene aperta una nuova scheda o una nuova finestra, è importante solo che venga aperta una seconda istanza del browser.Come aprire una nuova finestra su un browser usando Selenium WebDriver per python?

Ho provato già diversi metodi e nessuno ha avuto successo.

  1. passaggio a una finestra che non esiste nella speranza che sarebbe quindi aprire una nuova finestra in caso di errore di individuare detta finestra:

    driver.switch_to_window(None)

  2. iterazione attraverso le finestre aperte (anche se c'è attualmente solo uno)

    for handle in driver.window_handles: 
        driver.switch_to_window(handle) 
    
  3. tentativo di simulare un tasto della tastiera

    from selenium.webdriver.common.keys import Keys 
    driver.send_keys(Keys.CONTROL + 'T') 
    

Il problema con questo in particolare è che non sembra possibile inviare le chiavi direttamente al browser, solo per un elemento specifico come questo:

driver.find_element_by_id('elementID').send_keys(Keys.CONTROL + 'T') 

Tuttavia, quando un comando come questo viene inviato ad un elemento, sembra non fare assolutamente nulla. Ho tentato di individuare l'elemento HTML più in alto nella pagina e inviare le chiavi di quella, ma era ancora una volta incontrato con il fallimento:

driver.find_element_by_id('wrapper').send_keys(Keys.CONTROL + 'T') 

Un'altra versione di questo che ho trovato on-line, e non era in grado di verificare la validità o la mancanza ciò perché io non sono sicuro di quale classe/modulo che ha bisogno di importare

act = ActionChains(driver) 
act.key_down(browserKeys.CONTROL) 
act.click("").perform() 
act.key_up(browserKeys.CONTROL) 

Qualcosa di molto simile con sintassi diversa (non sono sicuro se uno o entrambi di questi è la correttezza sintattica)

actions.key_down(Keys.CONTROL) 
element.send_keys('t') 
actions.key_up(Keys.CONTROL) 
+0

Questo solo per i browser testa, Firefox, Chrome, ecc. Nell'esempio PhantomJS non ha associazioni di tasti e devi chiamare 'execute_script()' con il codice javascript corretto. Caso è necessario passare elementi/cookie, basta creare un link = _blank target quindi fare clic prima. – erm3nda

risposta

12

Che ne dite di fare qualcosa di simile

driver = webdriver.Firefox() #First FF window 
second_driver = webdriver.Firefox() #The new window you wanted to open 

A seconda di quale finestra che si desidera interagire con, si inviano comandi di conseguenza

print driver.title #to interact with the first driver 
print second_driver.title #to interact with the second driver 

Per tutti verso il basso gli elettori:


L'OP ha richiesto "it is only important that a second instance of the browser is opened. ". Questa risposta non comprende TUTTI i possibili requisiti dei casi d'uso di ciascuno e di tutti. Le altre risposte di seguito potrebbero soddisfare le tue particolari esigenze.

+0

Perfetto! Così semplice ma ha raggiunto esattamente quello che desideravo, grazie. Tuttavia, c'è un modo per generalizzare quel comando in modo che funzioni, indipendentemente dal browser utilizzato? Forse un modo per ricavare il browser utilizzato nel primo driver per aprire il secondo? –

+0

@ "Forse un modo per ricavare il browser utilizzato nel primo driver per aprire il secondo?" - Non sono sicuro di quale valore aggiungerà questo valore. Anche se lo fa. Mi dispiace, non so come farlo. Comunque, se hai trovato utile questa risposta, puoi contrassegnarla come risposta, ecco come: http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235 – Amey

+4

In realtà si apre una seconda istanza di Firefox. La distinzione tra "nuova finestra nel browser esistente" e "completamente nuova applicazione browser" può essere importante per alcuni casi di test. – ManicDee

9

È possibile utilizzare execute_script per aprire una nuova finestra.

driver = webdriver.Firefox() 
driver.get("https://linkedin.com") 
driver.execute_script("$(window.open('https://twitter.com'))") 
print driver.current_window_handle 

# Switch to new window 
driver.switch_to_window(driver.window_handles[-1]) 
print " Twitter window should go to facebook " 
print "New window ", driver.title 
driver.get("http://facebook.com") 
print "New window ", driver.title 

# Switch to old window 
driver.switch_to_window(driver.window_handles[0]) 
print " Linkedin should go to gmail " 
print "Old window ", driver.title 
driver.get("http://gmail.com") 
print "Old window ", driver.title 

# Again new window 
driver.switch_to_window(driver.window_handles[1]) 
print " Facebook window should go to Google " 
print "New window ", driver.title 
driver.get("http://google.com") 
print "New window ", driver.title 
+1

Non c'è alcun riferimento al caricamento di Jquery e si presume che sia stato caricato dall'url precedente caricato con PhantomJS. Inoltre, il codice javascript è lo stesso, quindi solo 'driver.execute_script (" window.open ('https://twitter.com') ")' funzionerà. – erm3nda

4

vi consiglio di usare CTRL + N comando su Firefox per ridurre l'utilizzo della memoria meno che creare nuove istanze del browser.

import selenium.webdriver as webdriver 
from selenium.webdriver.common.keys import Keys 

browser = webdriver.Firefox() 
body = browser.find_element_by_tag_name('body') 
body.send_keys(Keys.CONTROL + 'n') 

Il modo per commutare e finestre di controllo è già stato menzionato da Dhiraj.

+0

Questa è la soluzione migliore, poiché la finestra viene aperta nello stesso driver. Ma questo non funzionerà per le pagine XML. – Andrew

+1

@ fx-kirin Non funziona nel browser firefox? –

Problemi correlati