2013-07-16 3 views
13

Sto lavorando su un'applicazione web, in cui facendo clic su qualche collegamento appare un'altra finestra popup. La finestra pop non è un avviso ma è un modulo con vari campi da inserire dall'utente e fare clic su "Avanti".Web browser Python per gestire finestre popup popup che non sono un avviso

Come posso gestire/automatizzare questa finestra popup utilizzando il selenio.

Sommario: -

  1. Clicca sul collegamento ipertestuale (URL) - "CLICCA QUI" modulo di registrazione
  2. Un utente appare come un pop-up
  3. Un dato deve essere riempito dall'utente
  4. Fare clic sul pulsante Avanti/Invia.
  5. Un altro vicino reindirizzato a un'altra pagina/modulo 'Informazioni utente Pagina Personale'
  6. informazioni personali deve essere riempito dall'utente
  7. Fare clic su "Avanti/Invia"
  8. Popup scomparso.
  9. Ora ulteriore elaborazione nella pagina originale/Base.
+0

Se non è un avviso, ci sono alcuni modi diversi in cui potrebbe essere una finestra pop-up. Puoi includere uno screenshot dell'app Web e il bit rilevante di html? –

+0

Potrebbe essere questa la causa principale? Una chiamata bypassata a fxdriver.modals.clearFlag_ ... cf. https://stackoverflow.com/questions/44568402/how-do-i-manually-mouse-dismiss-a-javascript-alert-and-get-back-the-body-o/44592827#44592827 – NevilleDNZ

risposta

3

Se il suo un nuovo window o un iframe si dovrebbe utilizzare il driver.switch_to_frame(webelement) o driver.switch_to_window(window_name). Questo dovrebbe quindi consentire di interagire con lo elements all'interno del popup. Al termine, è necessario quindi driver.switch_to_default_content() per tornare alla pagina Web principale.

25

Il passaggio a un popup è impegnativo per almeno due ragioni distinte:

  1. Quello che molti sanno, e cioè che è necessario utilizzare driver.switch_to.window(window_handle) sia quando appare il popup, in modo che si possono trovare elementi nella finestra pop-up e dopo che il popup è chiuso, in modo da poter trovare gli elementi nella finestra principale.
  2. È probabile che si incontrino solo le persone con macchine lente, ovvero che quando il selenio rende disponibile un handle di finestra come variabile, inizialmente viene impostato su Nessuno e richiede un po 'di tempo prima che venga inserito un valore.

Ecco un codice che risolve questi problemi durante l'esecuzione della sequenza richiesta. Tralascio le dichiarazioni import e sto usando nomi variabili che spero siano ovvi. Inoltre, nota che mi piace usare find_element(s)_by_xpath nel mio codice; Sentitevi liberi di usare altri metodi find_element(s)_by:

main_window_handle = None 
while not main_window_handle: 
    main_window_handle = driver.current_window_handle 
driver.find_element_by_xpath(u'//a[text()="click here"]').click() 
signin_window_handle = None 
while not signin_window_handle: 
    for handle in driver.window_handles: 
     if handle != main_window_handle: 
      signin_window_handle = handle 
      break 
driver.switch_to.window(signin_window_handle) 
driver.find_element_by_xpath(u'//input[@id="id_1"]').send_keys(user_text_1) 
driver.find_element_by_xpath(u'//input[@value="OK"]').click() 
driver.find_element_by_xpath(u'//input[@id="id_2"]').send_keys(user_text_2) 
driver.find_element_by_xpath(u'//input[@value="OK"]').click() 
driver.switch_to.window(main_window_handle) #or driver.switch_to_default_content() 

Si prega di farmi sapere se qualcuno (forse me) ha bisogno di aggiungere di più per l'esempio, o di fornire altre informazioni, per renderlo più chiaro.

+1

La tua risposta mi ha salvato la vita qualche tempo fa! Ha funzionato come un fascino, ma poiché Chrome 54 e Chromedriver 2.25, non c'è modo di ottenere l'handle della finestra del popup dell'estensione. Nell'autista.window_handles' ci sono solo la finestra principale per me. Hai forse un'altra idea? Grazie! – monami

+1

Migliorare il ritorno alla finestra originale usando 'driver.switch_to_default_content()' come nella risposta @MarkRowlands https://stackoverflow.com/a/17676233/248616 –