2

テストで同じセッションの2つのブラウザウィンドウを作成しようとしています。セレンの制限により、ブラウザごとに異なる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 /を開いた後、そのセッションIDが予期せずオーバーライドされました。

これを回避する方法は?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()
4

1 に答える 1

2

物事は想定どおりに機能していると思います。つまり、セッションはブラウザー間ではなく、タブやウィンドウ間で共有する必要があります。

コードを見ると、ブラウザー間でセッションを共有するつもりはないようです。2 つの Firefox ウィンドウの間だけです。2 つの WebDriver クラスをインスタンス化することは、本来あるべき方法ではありません。から継承したセレンのソースコードを見てください。これには、タブやウィンドウを切り替えるメソッドがあります (例: 490 行目)。firefox.WebDriverremote.WebDriver

ブラウザをクラス変数として設定し、それに応じてウィンドウまたはタブを開く必要があります。

于 2013-02-15T19:46:09.187 に答える