Facebook登录Selenium测试

时间:2013-04-10 18:55:06

标签: javascript django facebook selenium django-facebook

我正在开发一个django项目,使用django_facebook进行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这样的解决方案,但是这个代码是由django_facebook在Javascript文件中提供的,我不想触摸它。

知道如何等到Facebook JS SDK完全加载,以便我可以使用登录功能吗?

2 个答案:

答案 0 :(得分: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秒)。

答案 1 :(得分: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非常相似的解决方案)。在我的selenium测试中,我等待此属性出现在fb-root中以单击登录按钮。