Usa sempre lo stesso codice, in entrambi gli ambienti, altrimenti non si capisce più cosa può essere dovuto alla particolare configurazione o altro.
Riepilogo:
- Non usare il .Get con il parametro di logout, tieni il classico .Get strUrl
- Se subito dopo il .Get c'è un Exit Sub è più che normale che il browser controllato da Selenium si chiuda. Potrebbe essere talmente veloce che ti sembra che non si apra nemmeno.
30/12/2023 - Goemon ha scritto:
inizialmente pensavo che la pagina Edge … anche dopo “Quit”.
Questo è impossibile altrimenti il .Quit che senso avrebbe? Se vuoi tenerlo aperto non devi usare .Quit.
30/12/2023 - Goemon ha scritto:
Quale potrebbe essere un comando di interruzione, che tiene aperta la pagina Edge anche dopo che si è chiuso il file Access?
Impossibile 2, la vendetta. Dopo ti spiego come tenere aperto Edge, sempre sotto il controllo di Selenium, ma con il file accdb ancora aperto. Nel momento in cui chiudi il file accdb (o accde che sia), tutto quello che era gestito tramite codice inevitabilmente deve terminare. A meno che tu non abbia lanciato altro di cui però non avevi il controllo, a titolo d'esempio un FollowHyperLink di un documento di Word: anche se chiudi Access il documento di Word rimane aperto perché con il FollowHyperLink hai semplicemente aperto il file con il programma predefinito, non hai avviato Word come server di automazione. Aggiungo poi una considerazione: alla base di tutto c'è la necessità di controllare il browser (Edge, nello specifico) tramite codice, senza intervenire manualmente. Se chiudi “il codice”, significa che hai finito di controllare il browser. Se ti serve un'istanza normale puoi lanciarla come ultima azione, come si aprirebbe un programma qualsiasi.
Quello che puoi fare è sicuramente aprire il browser (gestito con Selenium) all'interno di una routine e mantenerlo “in vita” anche quando esci dalla routine (l'End Sub per restare nell'esempio). Devi fare in modo che la variabile abbia uno scope più ampio della singola routine. Qui dipende da quanto vuoi che resti “in vita”: se a livello di oggetto (ad esempio finché una determinata maschera è aperta) o se a livello di intera durata del programma (file accd* aperto).
A livello di oggetto (maschera): dichiari la variabile all'inizio del modulo, fuori da ogni routine, con il modificatore Private (andrebbe bene anche Dim ma Private è più adatto, rende meglio l'idea)
Option Explicit
Option Compare Database
Private d As Selenium.EdgeDriver
Private Sub ApriEdge
Dim strUrl As String
Set d = New Selenium.EdgeDriver
strUrl = "https://www.google.it/" 'sito indicativo
d.Get strUrl
End Sub
Come detto prima non devi mettere il .Quit altrimenti chiedi di fare l'esatto contrario di quello che vorresti. Anche se si esce dalla routine la variabile “d” non è uscita dallo scope e quindi non viene distrutta perché dichiarata a livello di modulo dell'oggetto: finché quell'oggetto rimane aperto (continuo a pensare alla classica maschera) Edge restera a perto e controllato da Selenium. Potresti avere un'altra routine di questo tipo
Private Sub CambiaPagina
Dim strUrl As String
strUrl = "https://www.bing.com/" 'sito indicativo
d.Get strUrl
End Sub
e fai fare all'oggetto associato a d quello che vuoi, perché è sempre lo stesso Edge di prima controllato da Selenium.
Se vuoi invece che il Edge rimanga aperto fino a quando non chiudi il file accd*, dichiari la variabile a livello di modulo generale con un
Global d As Selenium.EdgeDriver
In qualunque punto del codice puoi istanziare d (una volta sola, ovviamente) e gestirlo. Solo quando chiudi il file accd* d viene distrutto, anche se è bene esplicitare un d.Quit ed un Set d = Nothing.
Se non vuoi usare un modulo generale ma una variabile globale dichiarata in un modulo oggetto potresti usare una maschera che apri all'avvio del file accd* ma che rimane sempre nascosta. Quando chiudi il file anche quella maschera sarà chiusa e nell'evento Close chiudi Edge e distruggi la variabile.
30/12/2023 - Goemon ha scritto:
utilizzato anche per eseguire il login (inserendo dati e premendo pulsanti nella pagina web).... ?
Con Selenium puoi fare anche questo. Lì però sarà difficile per me aiutarti perché dipende dalla pagina specifica. Sicuro di voler automatizzare anche l'autenticazione? Intendi inserire i classici nome utente e pwd? Stai attento al discorso sicurezza, e qui si apre un altro mondo.
Note conclusive:
Forse c'è qualche eccezione a quello che ho scritto in merito ad apertura e “ripresa” del controllo dei programmi tra due distinte aperture di Access ma credo serva una conoscenza tosta delle API, che io non ho.
Dovesse esserci bisogno di più variabili dello stesso tipo, evita di dar loro lo stesso nome solo per il fatto che hanno scope diversi. E' una grana poi capire quale variabile si sta usando (c'è una priorità nella scelta della variabile da usare in caso di “omonimia” ma con scope diversi). Siccome non cosa nulla, usa nomi diversi.