2013-02-15 98 views
2

我想在测试中使用同一个会话的2个浏览器窗口。请注意,由于硒限制,每个浏览器都有不同的Firefox配置文件。如何防止Django重写sessionid cookie?

测试(你可以尝试,只要你有一个测试/测试人员的用户)是:

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未被覆盖。

如何解决此问题?我试图让browser1拥有与browser0相同的会话。

固定码,这要归功于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

我相信一切正常,就像他们应该。也就是说,会话应跨标签和/或窗口共享,而不是跨浏览器。

看着你的代码,看起来你并不打算跨浏览器共享会话,只是跨越两个Firefox窗口。实例化两个WebDriver类不是你应该工作的方式。 查看从remote.WebDriver继承的硒source code,firefox.WebDriver,其具有切换标签和/或窗口(例如,行490)的方法。

您应该将浏览器设置为类变量,并相应地打开它的窗口或选项卡。