python - 如何防止 Django 覆盖 sessionid cookie?

标签 python django selenium session-cookies django-sessions

我试图在测试中让 2 个浏览器窗口具有相同的 session 。请注意,由于 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

如您所见,browser1打开/admin/后,其sessionid意外被覆盖。

如何解决这个问题?我试图让 browser1 与 browser0 具有相同的 session 。

修复代码,感谢 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()

最佳答案

我相信事情正在按照预期进行。也就是说, session 应该在选项卡和/或窗口之间共享,而不是在浏览器之间共享。

查看您的代码,您似乎不打算跨浏览器共享 session ,而只是跨两个 Firefox 窗口共享 session 。实例化两个 WebDriver 类不是您应该的工作方式。 看看 Selenium source codefirefox.WebDriver 继承自 remote.WebDriver,它具有切换选项卡和/或窗口的方法(例如第 490 行)。

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

关于python - 如何防止 Django 覆盖 sessionid cookie?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14900106/

相关文章:

javascript - 如何使用 Beautiful Soup 从 python 代码中获取 javascript 函数的结果?

python - "Time Limit Exceeded"关于 LeetCode 的三和题?

python - 如何使用 BeautifulSoup 在 HTML 中提取折扣价

java - 调整浏览器窗口大小后无法从元素获取文本(Chrome)

selenium - 获取 Selenium 启动的浏览器的 PID(java 中)

java - cucumber 背景中的数据表

字符串的 Python 循环 - 为什么会出现 'none'?

javascript - 如何将csrf_token传递给jqgrid的editurl的post参数?

python - 测试之间的 django 数据

django - 在不知道输入名称和数量的情况下使用 request.POST