在使用生菜+碎片和django的功能测试期间等待响应

时间:2013-05-10 01:42:23

标签: django bdd lettuce

短篇小说: 我正在使用生菜和碎片为django应用程序编写功能测试。 由于步骤调用中缺少同步,该方案失败。

问题: 有没有办法防止这个错误发生,而不是在我的步骤中添加一个人为的等待时间?

更长的故事: 该方案检查现有用户是否能够登录。

Scenario: User exists as admin
    Given I access the url "/login/"
    And The user "someuser" with password "something" exists as admin
    When I fill username with "someuser" and password with "exists"
    And I submit the form        
    Then I see the paragraph "You're successfully logged in!"

这里的关键步骤是:

@step(r'I see the paragraph "(.*)"')
def see_paragraph(step, text):
    assert text in world.browser.html

当我收获生菜特征时,它会随机失败。

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/lettuce/core.py", line 143, in __call__
    ret = self.function(self.step, *args, **kw)
  File "/vagrant/src/enext/apps/auth/features/authentication-steps.py", line 21, in see_paragraph
    assert text in world.browser.html
AssertionError

当我尝试调试它时,我发现打印响应会使它每次都有效,所以我无法重现错误。添加暂停似乎也可以解决问题。

@step(r'I see the paragraph "(.*)"')
def see_paragraph(step, text):
    # print world.browser.html.encode('utf-8')
    # either the next or the previous line fixes it
    time.sleep(0.3)
    assert text in world.browser.html

起初看起来它与测试数据库刷新有关,但是我删除了其他方案,并且刷新了,并且它一直在发生。

1 个答案:

答案 0 :(得分:2)

这可能取决于您And I submit the form的内容。如果此步骤单击“提交”按钮或类似的内容,那么它就是问题开始的地方。

除了点击和其他“onpage”交互之外,Webdriver几乎在所有操作之后等待页面加载。因此,点击后立即查找元素的存在而不等待响应。

作为一个解决方案,我建议你使用splinter docs中描述的wait_time参数,或编写你自己的函数,该函数在一个check语句循环中,直到指定的超时。

P.S。:我还建议您查看python selenium,并wait(browser, timeout).until(some_statement)