2014-07-11 51 views
1

Helo,guys! 我們使用watir-webdriver和Cheezy提供的黃瓜和頁面對象gem。我們的項目使用ExtJS,所以有很多Ajax。在我們的一個場景中,當用戶點擊按鈕(在iframe中,讓我們說iframe1)並且系統在不同的iframe中填充同一頁面(比如說frame2)時,在我們的PageObject類中我們有這樣的一個步驟:在場景運行期間切換iframes內容

in_iframe(:width =>「100%」)do | frame | //一些元素 結束

因此,問題是有沒有辦法用具體的iframe實例化新的PageObject或更改當前使用的PageObject的iframe?

將不勝感激任何幫助。

+0

你能澄清你所說的「具體的iframe」的意思是什麼,爲什麼你需要「改變IFRAME」?根據問題描述,這聽起來像是在兩個不同的iframe中有兩個元素,這意味着只有兩個in_iframe訪問器? –

+0

對不起,我會嘗試更具體地描述我的問題。 從開始我的步驟只使用一個iframe-iframe1,然後在測試期間運行驅動程序按下創建iframe2的按鈕,所有其他步驟需要在iframe2中完成,但驅動程序繼續與iframe1中的元素交互(原因iframe1和iframe2具有相同的元素)。 所以我想要做這樣的事情:@ current_page.frame = browser.iframes(:width => 100%)[1]改變當前工作的驅動程序iframe。 – Smooyk

+0

我有類似的問題,最終不得不放棄Cheezy的寶石,贊成像Alister Scott所描述的那樣「滾動我自己」:http://watirmelon.com/2012/06/04/roll-your-own-page-對象/ –

回答

2

我預想你的網頁是這樣的:

<html> 
    <body> 
    <iframe id="iframe1" src="test.htm" width="100%"></iframe> 
    <iframe id="iframe2" src="test.htm" width="100%"></iframe> 
    </body> 
</html> 

凡TEST.HTM是:

<html> 
    <body> 
    <input id="user_login" type="text"> 
    </body> 
</html> 

換句話說,有具有相同文本字段元素的兩幀。

這看起來有點不方便,但您可以採取的一種方法是定義各種元素方法。當您切換幀時,您可以重新定義使用第二幀的定位器的方法。 Page對象是:

class MyPage 
    include PageObject 

    def self.setup(iframe_locator) 
    in_iframe(iframe_locator) do |login_iframe| 
     text_field(:email_field, :id => 'user_login', frame: login_iframe) 
    end 
    end 
    setup(:width => "100%") 

    def frame=(iframe_locator) 
    eval %Q{ 
     class << self 
     setup(#{iframe_locator}) 
     end 
    } 
    end 
end 

的用法是:

page = MyPage.new(browser) 

# Input the text field in the first frame 
page.email_field = 'hi' 

# Redefine the frame locator to be the second frame 
page.frame={:index=> 1, :width=>'100%'} 

# Input the text field in the second frame 
page.email_field = 'bye' 
+0

它絕對有效。十分感謝! – Smooyk