2013-02-15 4 views
2

나는 테스트에서 같은 세션을 가진 2 개의 브라우저 창을 가지려고한다. 셀레늄 제한으로 인해 각 브라우저마다 다른 파이어 폭스 프로필이 있음에 유의하십시오.Django가 sessionid 쿠키를 덮어 쓰지 않게하는 방법은 무엇입니까?

테스트 (당신이 아니라 당신이 테스트/검사 직원의 사용자를 가지고, 그것을 시도 할 수 있습니다)입니다 :

import time 

from django.test import LiveServerTestCase 
from selenium.webdriver.common.keys import Keys 
from selenium.webdriver.common.action_chains import ActionChains 
from selenium.webdriver.firefox.webdriver import WebDriver 
from selenium.common.exceptions import NoSuchElementException 

class ScriptTestCase(LiveServerTestCase): 
    def do_admin_login(self, username, password, browser): 
     browser.get('%s%s' % (self.live_server_url, '/admin/')) 
     username_input = browser.find_element_by_name("username") 
     username_input.send_keys(username) 
     password_input = browser.find_element_by_name("password") 
     password_input.send_keys(password) 
     browser.find_element_by_xpath('//input[@value="Log in"]').click() 

    def test_double_window_inactivity(self): 
     browser0 = WebDriver() 
     self.do_admin_login('test', 'test', browser0) 
     cookie = browser0.get_cookie('sessionid') 
     cookies = {'name': 'sessionid', 'value': cookie['value']} 

     browser1 = WebDriver() 
     browser1.add_cookie(cookies) 
     print 1, browser0.get_cookie('sessionid')['value'] 
     print 2, browser1.get_cookie('sessionid')['value'] 
     browser1.get('%s%s' % (self.live_server_url, '/admin/')) 
     print 3, browser0.get_cookie('sessionid')['value'] 
     print 4, browser1.get_cookie('sessionid')['value'] 

출력은 다음과 같습니다

1 08ba4efecf00d2b98aacd174ed20e144 
2 08ba4efecf00d2b98aacd174ed20e144 
3 08ba4efecf00d2b98aacd174ed20e144 
4 cb49379190cb37735697c5c82ab300fc 

당신이 볼 수 있듯이, 후 browser1이/admin /을 열었을 때 sessionid가 unexpectively 무시되었습니다.

어떻게 해결할 수 있습니까? 나는 browser0과 같은 세션을 가질 브라우저 1을 갖고있다.

고정 코드, Hedde 덕분에 ---

def test_double_window_inactivity(self): 
     self.browser.execute_script('window.open("/admin/", "other")') 

     for win in self.browser.window_handles: 
      self.browser.switch_to_window(win) 
      self.assertWarningHidden() 

     time.sleep(5+1) # Added one second to compensate for fadeIn 
     for win in self.browser.window_handles: 
      self.browser.switch_to_window(win) 
      self.assertWarningShown() 

     time.sleep(5+1) # Added one second to compensate for lag 
     for win in self.browser.window_handles: 
      self.browser.switch_to_window(win) 
      self.assertWarningNotInPage() 

답변

2

나는 일이 그들이에 가정되는 것처럼 노력하고 있습니다 생각합니다. 즉, 세션은 브라우저가 아닌 탭 및/또는 창에서 공유되어야합니다.

코드를 보면 두 개의 파이어 폭스 창을 통해 브라우저간에 세션을 공유하지 않으려는 것 같습니다. 두 개의 WebDriver 클래스를 인스턴스화하는 것은 당신이해야하는 방식이 아닙니다. 셀렌 source code을보고 firefox.WebDriverremote.WebDriver에서 상속되며 탭 및/또는 창 (예 : 490 줄)을 전환하는 방법이 있습니다.

브라우저를 클래스 변수로 설정하고 그에 따라 창이나 탭을 열어야합니다.