2013-04-10 3 views
2

Я работаю над проектом django, используя django_facebook для взаимодействия с Facebook и Selenium для автоматического тестирования системы.Facebook Войти в Selenium Tests

В тестах, когда дело доходит до входа в 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

Наконец-то мне пришлось переопределить инициализацию 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, чтобы щелкнуть кнопку входа.

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

+0

@geekazoid хорошо, поставьте все, что, по вашему мнению, не работает, потому что SDK еще не загружен внутри 'set_timeout()'. – Ryan

+0

Еще одно решение, которое я нашел, это «щелкнуть», пока не появится два окна, но мы знаем, что это не хорошо. Также не нужно ждать секунды, так как время загрузки может меняться. Я думал о чем-то вроде изменения в «fb-root» div или kinda, но не могу догадаться об этом из документации. – geekazoid