Skip to main content
 首页 » 编程设计

python之如何同步 Django 的 'Client' 和 Selenium 的 webdriver 之间使用的 html/ session

2024年10月25日29kevingrace

我正在尝试测试登录用户是否可以使用 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 和 browser 没有互相交谈。但这是可能的,还是我需要通过单击带有 selenium 等的链接“手动”登录?

我想这样做:

 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' 

请您参考如下方法:

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

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

名字应该等于你的SESSION_COOKIE_NAME Django 站点上的设置(sessionid 是默认值)。你需要计算出 session_key 的值.

您可以从 Client 获得它像这样的例子:

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

请注意,如果 SESSION_COOKIE_SECURE,Selenium 将无法为某些浏览器设置 cookie 是True .您应该将此设置设为 True对于您的生产服务器,但如果您希望您的 Selenium 测试设置您的 session cookie,那么您必须将其设置为 False用于测试。

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