2013-07-25 12 views
5

Mam stronę, która zaczyna się bez elementu iframe, a następnie przez JavaScript dostaje element iframe dodany po kliknięciu zakotwiczenia.Jak uzyskać dostęp do dynamicznie dodawanego elementu iframe za pomocą Selenium WebDriver?

Problem polega na tym, że po przełączeniu się na ramkę z driver.switch_to_frame(x) nadal mogę znaleźć dowolną z moich treści.

Próbowałem przeszukiwać ramki znalezione przy użyciu driver.find_elements_by_tag_name('iframe') i sprawdzać każdą z nich dla klasy, którą spodziewam się znaleźć, ale bez takiego szczęścia.

driver.switch_to_active_element() nie daje mi również odpowiedniego elementu iframe.

Nie jestem pewien, czy zawartość elementu iframe jest niedostępna z powodu zmian w JS DOM, które nie zostały odzwierciedlone w tym, co Selenium otrzymuje ze sterownika. Przeszedłem przez ten sam proces dla innych elementów iframe bez żadnych problemów, ale ten po prostu nie będzie współpracował. Poniżej znajduje się uproszczona wersja tego, z czym mam do czynienia.

Przed JS:

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

Po JS:

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

Python WebDriver próba:

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

Próbowałem również wariacje na który jak:

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

Wcześniej próbowałem użyć driver.execute_script, aby dostać się do obiektu, ale uzyskanie zawartości jest poza mną. Polecenia konsoli Firefox, które działają, nie działają przez Selenium.

+0

Jak na temat korzystania 'driver.page_source', pisząc go do pliku, a widząc, jeśli zawiera ona treści oczekujesz. To nie rozwiąże problemu, ale może pomóc w procesie debugowania. Jeśli zawiera on 'div', który chcesz, a Selen nadal nie będzie współpracował, możesz przeanalizować źródło strony za pomocą innych narzędzi. – ChrisP

+0

Czy Twój źródłowy HTML wygląda prawie tak samo, jak napisałeś powyżej lub czy został skrócony dla zwięzłości? Również rama jest widoczna? Czy widzisz tekst "Wiadomość"? – nilesh

+0

@ChrisP Obecnie korzystam z frame.parent.page_source, aby znaleźć tekst linku i to działa. Nie żeby tak było, ponieważ spodziewałbym się, że ramka zawiera tekst, a nie rodzica. – Belrog

Odpowiedz

3

Wydaje się, że jest to problem rozrządu, skończyło się coś wzdłuż tych linii:

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' 
Powiązane problemy