Как я могу синхронизировать html/сеанс, используемый между «Клиентом» Django и веб-драйвером Selenium

Я пытаюсь проверить, что пользователи, вошедшие в систему, могут выйти из системы на моем сайте Django с помощью Lettuce, Selenium и lettuce_webdriver.

В моем Terrain.py у меня есть:

@before.all
def setup_browser():
    profile = webdriver.FirefoxProfile()
    profile.set_preference('network.dns.disableIPv6', True)
    world.browser = webdriver.Firefox(profile)
    world.client = Client(HTTP_USER_AGENT='Mozilla/5.0')

И затем, когда я «вхожу в систему»:

@step(r'I am logged in as "(\w*)"')
def log_in(step, name):
    world.client.login(username=name, password=name)

И я захожу на свой сайт:

And I go to "localhost:8000"
    I find a link called "Logout ?" that goes to "/logout"

@step(r'I find a link called "(.*?)" that goes to "(.*?)"$')
def find_link(step, link_name, link_url):
    print(world.browser.page_source)
    elem = world.browser.find_element_by_xpath(r'//a[@href="%s"]' % link_url)
    eq_(elem.text, link_name)

Но мой page_source показывает, что я не вошел в систему. Это имеет смысл... в том, что client и browser не разговаривают друг с другом. Но возможно ли это, или мне нужно войти в систему «вручную», щелкнув ссылки с селеном и т. Д.?

Я хотел бы сделать это:

 world.browser.page_source = world.client.get(world.browser.current_url).content

Но page_source изменить нельзя. Могу ли я каким-то образом кормить Selenium из клиента django?

Изменить: следуя приведенному ниже совету Loius', мой шаг "Я вошел в систему как..." выглядит следующим образом. Я добавил if/else, чтобы просто проверить свои подозрения. Мой клиент по-прежнему настроен, как указано выше (см. шаг setup_browser выше)

@step(r'I am logged in as "(\w*)"')
def log_in(step, name):
    world.client.login(username=name, password=name)
    if world.client.cookies:
        session_key = world.client.cookies["sessionid"].value
        world.browser.add_cookie({'name':'sessionid', 'value':session_key})
        world.browser.refresh()
    else: 
        raise Exception("No Cookies!")

Все советы, которые я видел, это сначала войти в систему. Без моего чека я получаю это:

  Scenario: Logged in users can logout                       # \gantt_charts\features\index.feature:12
    Given I am logged in as "elsepeth"                                # \gantt_charts\features\steps.py:25
    Traceback (most recent call last):
      File "C:\Python34\lib\site-packages\lettuce\core.py", line 144, in __call__
        ret = self.function(self.step, *args, **kw)
      File "D:\Django_Projects\gAnttlr\gantt_charts\features\steps.py", line 27, in log_in
        session_key = world.client.cookies["sessionid"].value
    KeyError: 'sessionid'

person Pureferret    schedule 16.01.2015    source источник


Ответы (1)


Я не пытался делать в точности то, что вы пытаетесь сделать, но я сделал что-то подобное. Что вам нужно сделать, так это установить такой файл cookie в вашем экземпляре Selenium после того, как вы вошли на свой сайт Django с помощью своего экземпляра Client:

driver.add_cookie({'name': 'sessionid', 'value': session_key})

Имя должно совпадать с вашей настройкой SESSION_COOKIE_NAME на сайте Django (по умолчанию используется sessionid). Вам нужно выяснить значение session_key.

Вы можете получить его из экземпляра Client следующим образом:

    session_key = client.cookies["sessionid"].value

Обратите внимание, что Selenium не сможет установить файл cookie для некоторых браузеров, если SESSION_COOKIE_SECURE равно True. У вас должен быть этот параметр True для вашего рабочего сервера, но если вы хотите, чтобы ваши тесты Selenium устанавливали файл cookie сеанса, вам нужно сделать его False для тестирования.

Как только ваш экземпляр Selenium получит файл cookie, он будет выглядеть для Django так, как если бы вы вошли в него с помощью Selenium. Как я уже сказал, я делаю что-то похожее в своих наборах тестов. (Я использую что-то другое, кроме Client, но принцип тот же.)

person Louis    schedule 16.01.2015