Come posso riconnettermi al browser aperto dal webdriver con selenium?

Per alcuni motivi sconosciuti, il mio browser apre le pagine di test del mio server remoto molto lentamente. Quindi penso che se riesco a riconnetterti al browser dopo aver lasciato lo script ma non eseguire webdriver.quit() questo lascerà il browser aperto. Probabilmente è un tipo di handle di HOOK o webdriver. Ho consultato il documento API selenium ma non ho trovato alcuna funzione. Sto usando Chrome 62, x64, Windows 7, selenium 3.8.0. Sarò molto apprezzato se la domanda può essere risolta o meno.

No , non è ansible riconnettersi alla sessione del Web Browser precedente dopo aver chiuso lo script. Anche se si è in grado di estrarre l’ Session ID , i Cookies e altri attributi di sessione dalla precedente Browsing Session , non sarà ansible passare tali attributi come HOOK al WebDriver .

Un modo più semplice sarebbe chiamare webdriver.quit() e quindi estendere una nuova Browsing Session .

Storia :

In precedenza c’erano state alcune discussioni e tentativi di ricolbind WebDriver a una sessione di navigazione esistente esistente. Puoi trovare le discussioni in questi QA:

  • Allow webdriver to attach to a running browser
  • [docs] webdriver.firefox.useExisting not implemented

Senza entrare nel perchè pensi che lasciare una finestra aperta del browser risolva il problema di essere lento, non hai davvero bisogno di un handle per farlo. Continua a eseguire i test senza chiudere la sessione o, in altre parole, senza chiamare driver.quit() come hai detto tu stesso. La domanda qui, nonostante la struttura che viene fornito con il proprio corridore? Ti piace Cetriolo?

In ogni caso, è necessario disporre del codice “setup” e “cleanup”. Quindi quello che devi fare è assicurarti durante la fase di “pulizia” che il browser sia tornato allo stato iniziale. Questo significa:

  • Viene visualizzata una pagina vuota
  • I cookie vengono cancellati per la sessione

Questo è davvero facile da fare: una sessione SE è rappresentata da un url di connessione e da session_id.

Disclaimer : l’approccio utilizza le proprietà interne del selenium (“private”, in un modo), che possono cambiare nelle nuove versioni; faresti meglio a non usarlo per il codice di produzione; è meglio non essere usato contro il SE remoto (il tuo hub o provider come BrowserStack / Sauce Labs), a causa di un caveat / drenaggio delle risorse spiegato alla fine.
Ad esempio, non usarlo nel tuo caso particolare, se non sei proprio sicuro di averne bisogno 🙂

Quando viene avviata un’istanza di webdriver, è necessario ottenere le proprietà menzionate in precedenza; campione:

 from selenium import webdriver driver = webdriver.Chrome() driver.get('https://www.google.com/') # now Google is opened, the browser is fully functional; print the two properties # command_executor._url (it's "private", not for a direct usage), and session_id print(f'driver.command_executor._url: {driver.command_executor._url}') print(f'driver.session_id: {driver.session_id}') 

Con quei due ora conosciuti, un’altra istanza può connettersi; il “trucco” è avviare un driver Remote e fornire il _url sopra, quindi si collegherà a quel processo di selenium in esecuzione:

 driver2 = webdriver.Remote(command_executor=the_known_url) # when the started selenium is a local one, the url is in the form 'http://127.0.0.1:62526' 

Quando viene eseguito, vedrai una nuova finestra del browser che viene aperta. Questo perché all’avvio del driver, la libreria del selenium avvia automaticamente una nuova sessione (iniziata intorno a Selenium3, anche se non sono sicuro per l’ora esatta) – e ora hai 1 processo con 2 sessioni.

Se navighi in un url, vedrai che viene eseguito su quella nuova istanza del browser, non quella che è rimasta dall’avvio precedente, che non è il comportamento desiderato. A questo punto, è necessario eseguire due operazioni: a) chiudere la sessione SE corrente e b) passare questa istanza alla sessione precedente:

 if driver2.session_id != the_known_session_id: # this is pretty much guaranteed to be the case driver2.close() # this closes the session's window - it is currently the only one, thus the session itself will be auto-killed, yet: driver2.quit() # for remote connections (like ours), this deletes the session, but does not stop the SE server # take the session that's already running driver2.session_id = the_known_session_id # do something with the now hijacked session: driver.get('https://www.bing.com/') 

E questo è tutto – ora sei connesso alla sessione precedente / già esistente, con tutte le sue proprietà (cookie, LocalStorage, ecc.). Non è necessario fornire le funzionalità desired_capabilities quando si avvia il nuovo driver remoto: quelle sono memorizzate ed ereditate dalla sessione esistente che è stata desired_capabilities .


Avvertenza : l’esecuzione di un processo SE può comportare un drenaggio delle risorse nel sistema.

Ogni volta che uno viene avviato e quindi non chiuso, come nel primo pezzo del codice, rimarrà lì finché non lo ucciderai manualmente. Con questo voglio dire – in Windows per esempio – vedrai un processo “chromedriver.exe”, che dovrai terminare manualmente una volta che avrai finito. Non può essere chiuso da un driver che si è connesso ad esso come ad un processo di selenium remoto.
Il motivo: ogni volta che avvii un’istanza del browser locale e poi chiami il suo metodo quit() , contiene due parti: la prima è quella di eliminare la sessione dall’istanza Selenium (cosa succede nel secondo pezzo di codice lì sopra) , e l’altro è quello di fermare il servizio locale (il chrome / geckodriver) – che generalmente funziona bene.

Il fatto è che per le sessioni Remote manca il secondo pezzo: la macchina locale non può controllare un processo remoto, questo è il lavoro dell’hub di quel telecomando. Quindi la seconda parte è letteralmente un’istruzione pass python: un no-op.

Se si avviano troppi servizi di selenium su un hub remoto e non si dispone di un controllo su di esso, ciò comporterà il drenaggio delle risorse da quel server. I provider di cloud come BrowserStack prendono provvedimenti contro questo – stanno chiudendo i servizi senza attività per gli ultimi 60 anni, ecc., Tuttavia – questo è qualcosa che non vuoi fare.

E per quanto riguarda i servizi SE locali, non dimenticarti di ripulire il sistema operativo da driver di selenium orfani che hai dimenticato 🙂