如何同步Django'客户端'之间使用的html /会话?和Selenium的网络驱动程序

时间:2015-01-16 12:15:40

标签: python django selenium lettuce

我正在尝试测试登录的用户可以使用Lettuce,Selenium和lettuce_webdriver在我的Django网站上注销。

在我的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显示我没有登录。这种情况很有意义......因为clientbrowser没有相互交谈。但这是可能的,还是我需要通过点击链接硒等来“手动”登录?

我想这样做:

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

但是无法更改page_source。我可以从django的客户那里喂一些Selenium吗?

编辑:在下面的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'

1 个答案:

答案 0 :(得分:2)

我没有尝试完全你正在尝试做什么,但我做了类似的事情。您需要做的是在使用Client实例登录Django站点后在Selenium实例上设置这样的cookie:

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

该名称应该等于Django站点上的SESSION_COOKIE_NAME设置(默认为sessionid)。你需要弄清楚session_key的价值。

您可以从Client这样的实例中获取它:

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

请注意,如果SESSION_COOKIE_SECURETrue,Selenium将无法为某些浏览器设置Cookie 。对于您的生产服务器,您应该将此设置设为True,但如果您希望Selenium测试设置会话cookie,则必须进行False测试。

一旦你的Selenium实例有了cookie,就会看到Django就像你用Selenium登录它一样。正如我所说,我在我的测试套件中做了类似的事情。 (我使用的不是Client,但原理是相同的。)