Il selenium non aprirà un nuovo URL in una nuova scheda (Python e Chrome)

Voglio aprire parecchi URL in diverse tabs usando Selenium WebDriver e Python.

Non sono sicuro di cosa stia 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 cercato tutorial e mi sembra che questo codice dovrebbe fare ciò che voglio. In realtà, il browser si apre, url1 si apre come dovrebbe, una nuova scheda si apre come dovrebbe, ma url2 viene caricata nella scheda originale anziché nella nuova (anche se la nuova scheda sembra essere quella triggers).

(Sto usando Chrome perché quando uso 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 cambiare nel mio codice per aprire il nuovo URL nella nuova scheda?

Grazie per l’aiuto!

C’è un bug in ChromeDriver che impedisce a ctrl / command + T di funzionare:

  • Non riesco ad aprire una nuova scheda in ChromeDriver

Quello che puoi fare, come soluzione alternativa, è aprire un link in una nuova scheda e quindi passare a una nuova finestra usando 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’ultimo driver.get() verrà eseguito in una scheda appena aperta.

Ecco un modo semplice, indipendente dalla piattaforma:

Codice:

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

Tornando alla scheda originale:

Codice:

 driver.switch_to_window(driver.window_handles[0]) 

Verifica il titolo corrente per essere sicuro di essere sulla pagina giusta:

Codice:

 driver.title 

Per tutto il resto, buon divertimento!

Un modo alternativo per aprire una nuova finestra è usare JavaScript e il gestore della finestra per passare da una finestra all’altra.

 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 guardi il tuo browser mentre lo stai eseguendo, sembrerà che la nuova finestra abbia il focus, ma per il webdriver no. Non farti ingannare dal visivo. Ricorda inoltre di selezionare un nuovo gestore di windows quando chiudi una scheda perché imposterà driver.current_window_handle su

 selenium.common.exceptions.NoSuchWindowException: Message: no such window: target window already closed from unknown error: web view not found (Session info: chrome=) (Driver info: chromedriver= (),platform=) 

su .close() e .close() a fare cose con il driver in quella fase.