2013-07-25 46 views
5

Tôi có một trang bắt đầu mà không có iframe và sau đó thông qua JavaScript sẽ có khung nội tuyến được thêm sau khi nhấp vào một liên kết.Làm cách nào để truy cập iframe được thêm động bằng cách sử dụng Selenium WebDriver?

Sự cố tôi gặp phải là khi chuyển sang khung bằng driver.switch_to_frame(x) Tôi vẫn có thể tìm thấy bất kỳ nội dung nào của mình.

Tôi đã thử lặp qua các khung được tìm thấy với driver.find_elements_by_tag_name('iframe') và kiểm tra từng khung cho lớp tôi muốn tìm, nhưng không có may mắn như vậy.

driver.switch_to_active_element() cũng không cung cấp cho tôi iframe chính xác.

Tôi không chắc chắn nếu nội dung khung nội tuyến không thể truy cập được do những thay đổi JS DOM không được phản ánh trong những gì Selenium đang nhìn thấy từ trình điều khiển. Tôi đã trải qua quá trình tương tự cho các iframe khác không có vấn đề gì, nhưng điều này sẽ không hợp tác. Dưới đây là một phiên bản đơn giản của những gì tôi đang xử lý.

Trước JS:

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

Sau JS:

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

Python WebDriver nỗ lực:

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

Tôi cũng đã cố gắng biến thể trên đó như:

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

Tôi đã thử sự kiện bằng cách sử dụng driver.execute_script để truy cập đối tượng, nhưng nhận được nội dung nằm ngoài tôi. Các lệnh giao diện điều khiển của Firefox hoạt động không chạy qua Selenium.

+0

Làm thế nào về sử dụng 'driver.page_source', viết nó vào một tập tin, và nhìn thấy nếu nó có chứa nội dung bạn mong đợi. Điều đó sẽ không giải quyết được vấn đề, nhưng nó có thể giúp bạn trong quá trình gỡ lỗi. Nếu nó chứa 'div' bạn muốn, và Selenium vẫn không hợp tác, bạn có thể phân tích nguồn trang bằng cách sử dụng các công cụ khác. – ChrisP

+0

HTML nguồn của bạn trông gần như chính xác giống như bạn đã đăng ở trên hay bạn đã cắt nó ngắn gọn chưa? Cũng là khung có thể nhìn thấy? Bạn có thấy chữ "Tin nhắn" không? – nilesh

+0

@ChrisP Tôi hiện đang sử dụng frame.parent.page_source để tìm văn bản liên kết và nó hoạt động. Không phải là nó, vì tôi mong đợi khung có chứa văn bản, không phải là phụ huynh. – Belrog

Trả lời

3

Dường như đó là một vấn đề thời gian, tôi đã kết thúc với một cái gì đó dọc theo những dòng:

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' 
Các vấn đề liên quan