2013-04-10 116 views
2

我正在開發一個django項目,使用django_facebook進行Facebook交互,使用Selenium進行自動系統測試。Facebook登錄Selenium測試

在測試中,當談到從我的應用程序登錄到Facebook上,我這樣做:

 self.browser.get(self.live_server_url) 
     self.browser.find_element_by_xpath('//*[@id="facebook_login_js"]/input').click() 

     self.browser.switch_to_window(self.browser.window_handles[1]) 
     self.login_to_facebook() 

但由於Facebook的JS SDK還沒有完成它的異步初始化過程中出現失敗。我的測試過去曾經工作過,不知道現在是否有變化(比如初始化較慢)。

我想過使用fbAsyncInit的解決方案,但該代碼是由JavaScript文件中的django_facebook提供的,我不想去碰它。

有任何想法如何等待Facebook JS SDK完全加載,所以我可以使用登錄功能?

回答

0

我終於不得不重寫Facebook的初始化,所以之後沒有任何問題。我只是做了

function facebookJSLoaded(){ 
    FB.init({appId: facebookAppId, status: false, cookie: true, xfbml: true, oauth: 

    $('#fb-root').attr("data-sdk-loaded", 1); 
}; 

window.fbAsyncInit = facebookJSLoaded; 
F = new facebookClass(facebookAppId); 
F.load(); 

(這是一個非常類似於How to detect when facebook's FB.init is complete的解決方案)。在我的硒測試中,我等待此屬性出現在fb-root中以單擊登錄按鈕。

1
self.browser.get(self.live_server_url); 
self.browser.find_element_by_xpath('//*[@id="facebook_login_js"]/input').click(); 

self.browser.switch_to_window(self.browser.window_handles[1]); 

window.set_timeout(function(){ 
    self.login_to_facebook(); 
}, 1000) 

以上將使它等待一秒鐘,然後它會調用登錄。您可以通過更改1000來玩玩時間。 Set_timeout需要以毫秒爲單位的時間值(因此1000 = 1秒)。

+0

問題是由於SDK尚未加載,所以點擊不起作用。 「login_to_facebook」消息應該填寫登錄表單。 – geekazoid 2013-04-11 12:33:12

+0

@geekazoid好吧,把所有你認爲不起作用的東西放在'set_timeout()'裏面,因爲SDK沒有加載。 – Ryan 2013-04-11 14:37:59

+0

我發現的另一個解決方案是「點擊」,直到出現兩個窗口,但我們知道這是不好的。由於加載時間可能會有所不同,它也不會等待一秒鐘。 我正在考慮像「fb-root」div或類似的改變,但不能從文檔中猜出它。 – geekazoid 2013-04-11 14:43:02