如何防止Django覆盖sessionid cookie?
我正在尝试在测试中让两个浏览器窗口使用相同的会话。需要注意的是,由于selenium的限制,每个浏览器都有不同的firefox配置文件。
这个测试(只要你有一个测试用户或测试工作人员的账号,就可以尝试)是:
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
如你所见,当浏览器1打开/admin/时,它的会话ID意外地被覆盖了。
我该怎么解决这个问题呢?我希望浏览器1和浏览器0能有相同的会话。
修复后的代码,感谢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()
1 个回答
2
我觉得现在的情况是正常的。也就是说,浏览器的会话应该在不同的标签页或窗口之间共享,但不应该在不同的浏览器之间共享。
从你的代码来看,你似乎并不打算在不同的浏览器之间共享会话,而只是想在两个Firefox窗口之间共享。创建两个WebDriver类的实例并不是你应该采用的方式。
你可以看看selenium的源代码,firefox.WebDriver
是从remote.WebDriver
继承而来的,后者有一些方法可以切换标签页或窗口(比如第490行)。
你应该把浏览器设置为一个类变量,然后根据需要打开窗口或标签页。