2013-07-25 17 views
5

Ho una pagina che inizia senza iframe, quindi tramite JavaScript viene aggiunto un iframe dopo aver fatto clic su un'ancora.Come accedere a un iframe aggiunto dinamicamente utilizzando Selenium WebDriver?

Il problema che sto avendo è che quando si passa al frame con driver.switch_to_frame(x) posso ancora trovare uno qualsiasi dei miei contenuti.

Ho provato a scorrere tra i frame trovati con driver.find_elements_by_tag_name('iframe') e controllando ciascuno di essi per la classe che mi aspetto di trovare, ma non ho avuto tanta fortuna.

driver.switch_to_active_element() non mi dà neanche l'iframe corretto.

Non sono sicuro che il contenuto dell'iframe non sia accessibile a causa delle modifiche del DOM JS non riflesse in ciò che il selenio sta vedendo dal driver. Ho seguito lo stesso processo per altri iframe senza problemi, ma questo non collaborerà. Di seguito è una versione semplificata di ciò che sto trattando.

Prima JS:

<html> 
    <body> 
     <a onclick="jsmagic">load iframe</a> 
    </body> 
</html> 

Dopo JS:

<html> 
    <body> 
     <iframe><div class='modal'>Message</div></iframe> 
     <a onclick="jsmagic">load iframe</a> 
    </body> 
</html> 

Python WebDriver tentativo:

driver.switch_to_frame(0) 
driver.find_elements_by_class_name('modal') 
driver.switch_to_default_content() 

Ho anche provato variazioni su che, come:

frame = driver.find_elements_by_tag_name('iframe')[0] 
driver.switch_to_frame(frame) 
driver.find_elements_by_class_name('modal') 

Ho provato l'evento utilizzando driver.execute_script per ottenere l'oggetto, ma ottenere il contenuto è oltre me. La console di Firefox comanda che il lavoro non funzioni tramite Selenium.

+0

ne dite di usare 'driver.page_source', scrivendo in un file, e vedere se contiene il contenuto ti aspetti. Questo non risolverà il problema, ma potrebbe aiutarti nel processo di debug. Se contiene il 'div' che vuoi, e il selenio continua a non collaborare, puoi analizzare il sorgente della pagina usando altri strumenti. – ChrisP

+0

Il tuo codice HTML di origine sembra quasi identico a quello pubblicato sopra o lo hai tagliato per brevità? Inoltre è visibile la cornice? Vedi il messaggio "Messaggio"? – nilesh

+0

@ChrisP Attualmente sto utilizzando frame.parent.page_source per trovare il testo del link e funziona. Non che dovrebbe, dal momento che mi aspetto che il frame contenga il testo, non il genitore. – Belrog

risposta

3

Sembra che si tratta di un problema di temporizzazione, ho finito con qualcosa in queste righe:

def modal_must_show(self, string): 
    for _ in range(12): 
    for frame in self.driver.find_elements_by_tag_name('iframe'): 
     try: 
     if not frame.is_displayed(): 
      continue 
     if frame.parent.page_source.find(string): 
      return 
     except: 
     pass 
    assert False, 'Modal missing string' 
Problemi correlati