我正在开发一个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完全加载,以便我可以使用登录功能吗?
答案 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中以单击登录按钮。