如何同步 Django 的“客户端”和 Selenium 的 webdriver 之间使用的 html/session

2023-12-29

我正在尝试使用 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 显示我没有登录。这是有道理的......因为client and browser彼此不说话。但这是否可能,或者我是否需要通过单击带有硒等的链接来“手动”登录?

我想这样做:

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

但 page_source 无法更改。我可以如何从 django 的客户端提供 Selenium 吗?

编辑:正在关注Loius' https://stackoverflow.com/a/27990317/1075247下面的建议,我的“我以...登录”步骤如下。我添加了 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'

我没有尝试过做exactly你正在尝试做的事情,但我已经做了类似的事情。您需要做的是在使用您的 Django 站点登录后,在 Selenium 实例上设置一个像这样的 cookieClient实例:

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

该名称应该与您的名称相同SESSION_COOKIE_NAMEDjango 网站上的设置(sessionid是默认值)。你需要弄清楚的价值session_key.

您可以从Client像这样的实例:

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

请注意,Selenium 将无法设置 cookie对于某些浏览器 if SESSION_COOKIE_SECURE is True。你应该有这个设置True对于您的生产服务器,但如果您希望 Selenium 测试设置您的会话 cookie,那么您必须这样做False供测试用。

一旦您的 Selenium 实例拥有 cookie,Django 就会认为您已经使用 Selenium 登录了它。正如我所说,我做某事similar在我的测试套件中。 (我使用除Client但原理是一样的。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何同步 Django 的“客户端”和 Selenium 的 webdriver 之间使用的 html/session 的相关文章

随机推荐