2013-07-25 19 views
5

Ich habe eine Seite, die ohne einen iframe startet, und dann über JavaScript erhält einen iframe nach dem Klicken auf einen Anker hinzugefügt.Wie kann ich mit Selenium WebDriver auf einen dynamisch hinzugefügten Iframe zugreifen?

Das Problem, das ich habe, ist, dass beim Umschalten auf den Rahmen mit driver.switch_to_frame(x) ich immer noch meine Inhalte finden kann.

Ich habe versucht, durch die Rahmen mit driver.find_elements_by_tag_name('iframe') zu finden und jeden von ihnen für die Klasse zu überprüfen, die ich erwarte zu finden, aber kein solches Glück.

driver.switch_to_active_element() gibt mir auch nicht den richtigen iframe.

Ich bin mir nicht sicher, ob der Iframe-Inhalt einfach nicht zugänglich ist, weil die JS-DOM-Änderungen nicht in dem widergespiegelt werden, was Selenium vom Treiber sieht. Ich habe den gleichen Prozess für andere iframes ohne Probleme durchlaufen, aber dieser wird einfach nicht kooperieren. Unten ist eine vereinfachte Version dessen, womit ich es zu tun habe.

Vor JS:

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

Nach JS:

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

Python WebDriver Versuch:

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

Ich habe auch versucht Variationen dieses wie:

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

Ich habe Ereignis versucht mit driver.execute_script, um an das Objekt zu gelangen, aber den Inhalt zu bekommen ist mir ein Rätsel. Die funktionierenden Firefox-Konsolenbefehle laufen nicht über Selenium.

+0

Wie wäre es 'driver.page_source' verwendet wird, in eine Datei zu schreiben, und zu sehen, wenn sie den Inhalt enthält du erwartest. Das wird das Problem nicht lösen, aber es könnte Ihnen beim Debugging-Prozess helfen. Wenn es das gewünschte "div" enthält und Selenium weiterhin nicht kooperiert, können Sie die Seitenquelle mit anderen Tools analysieren. – ChrisP

+0

Sieht Ihr Quell-HTML-Code fast genau so aus wie oben beschrieben oder haben Sie es aus Platzgründen gekürzt? Ist der Rahmen auch sichtbar? Siehst du den Text "Nachricht"? – nilesh

+0

@ChrisP Ich benutze derzeit die frame.parent.page_source, um den Linktext zu finden, und es funktioniert. Nicht, dass es sollte, da ich erwarten würde, dass der Rahmen den Text enthält, nicht der Elternteil. – Belrog

Antwort

3

Es scheint, dass es sich um ein Timing-Problem ist, landete ich mit etwas in dieser Richtung nach oben:

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' 
Verwandte Themen