2016-05-07 12 views
7

Voglio aprire alcuni URL in diverse schede usando Selenium WebDriver & Python.Selenium non aprirà un nuovo URL in una nuova scheda (Python e Chrome)

io non sono sicuro di quello che sta andando male:

driver = webdriver.Chrome() 
driver.get(url1) 
time.sleep(5) 
driver.find_element_by_tag_name('body').send_keys(Keys.CONTROL+'t') 
url2 = 'https://www.google.com' 
driver.get(item2) 

ho guardato tutorial e mi sembra come se questo codice dovrebbe fare quello che voglio. In realtà, il browser si apre, url1 si apre come dovrebbe, una nuova scheda si apre come dovrebbe ma url2 quindi carica nella scheda originale anziché quella nuova (anche se la nuova scheda sembra essere quella attiva).

(Sto usando Chrome perché quando utilizzo Firefox non riesco a farlo caricare nessun URL.) Firefox si apre ma non ottiene l'url richiesto. Ho cercato di trovare una soluzione a questo ma senza successo.)

C'è qualcosa che posso modificare nel mio codice per aprire il nuovo URL nella nuova scheda?

Grazie per il vostro aiuto!

risposta

7

C'è un bug in ChromeDriver che impedisce Ctrl/Comando + T di lavorare:

Cosa si può fare, come soluzione alternativa, è quello di aprire un link in una nuova scheda e quindi passare a una nuova finestra utilizzando il switch_to.window(). campione di lavoro:

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

driver = webdriver.Chrome() 
driver.get("https://www.google.com") 

# open a link in a new window 
actions = ActionChains(driver) 
about = driver.find_element_by_link_text('About') 
actions.key_down(Keys.CONTROL).click(about).key_up(Keys.CONTROL).perform() 

driver.switch_to.window(driver.window_handles[-1]) 
driver.get("https://stackoverflow.com") 

Ora l'ultima driver.get() verrebbe eseguita in una scheda di recente apertura.

+0

grazie, ma il bug sembra riguardare il fatto che ctrl-t non apre affatto una nuova scheda. Posso aprire una nuova scheda, ma non caricare un URL in quella scheda. Ho provato il tuo codice ma probabilmente non lo capisco correttamente. Si è verificato un errore sulla riga find_element_by_link (impossibile individuare l'elemento). Sto caricando una pagina html (una fonte di pagina), non sono sicuro che questo faccia la differenza. – SamH123

+0

@ SamH123 okay, nel tuo caso è solo che devi fare "driver.switch_to.window (driver.window_handles [-1])' dopo aver aperto una nuova scheda. – alecxe

+0

grazie mille, che ha funzionato! – SamH123

8

Ecco un modo semplice, indipendente dalla piattaforma:

Codice:

driver.execute_script("window.open('http://google.com', 'new_window')") 

Ritornando alla scheda originale:

Codice:

driver.switch_to_window(driver.window_handles[0]) 

Controllo del titolo corrente per essere sicuro di essere sulla pagina giusta:

Codice:

driver.title 

Per tutto il resto, buon divertimento!

+0

Sto usando il webdriver Chrome e in realtà si apre in una nuova scheda, grazie mille – PossessWithin

5

Un modo alternativo per aprire una nuova finestra è utilizzare JavaScript e il gestore di finestre per passare da uno all'altro.

driver = webdriver.Chrome() 

# Open a new window 
# This does not change focus to the new window for the driver. 
driver.execute_script("window.open('');") 

# Switch to the new window 
driver.switch_to.window(driver.window_handles[1]) 
driver.get("http://stackoverflow.com") 

# close the active tab 
driver.close() 

# Switch back to the first tab 
driver.switch_to.window(driver.window_handles[0]) 
driver.get("http://google.se") 

# Close the only tab, will also close the browser. 
driver.close() 

Se guardate il browser mentre si sta eseguendo sarà simile la nuova finestra è attiva, ma al WebDriver, non è così. Non farti ingannare dal visivo.Ricordarsi inoltre di selezionare un nuovo gestore finestra quando si chiude una scheda come sarà impostato il driver.current_window_handle a

selenium.common.exceptions.NoSuchWindowException: 
    Message: no such window: target window already closed from unknown error: web view not found 
    (Session info: chrome=<Your version of chrome>) 
    (Driver info: chromedriver=<Your chrome driver version> (<string of numbers>),platform=<Your OS>) 

su .close() e getterà che errore se si tenta di fare cose con il driver in quella fase.

Problemi correlati