0

短篇小说:我正在使用生菜和 splinter 为 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

起初它看起来与测试数据库刷新有关,但我删除了其他场景,以及刷新,它一直在发生。

4

1 回答 1

2

这可能取决于您的产品And I submit the form。如果这一步点击“提交”按钮或类似的东西,那么这就是问题开始的地方。

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

作为一种解决方案,我建议您使用splinter docswait_time中描述的参数,或者编写您自己的函数,该函数进入检查语句循环直到指定超时。

PS:我还建议您查看python selenium和它的wait(browser, timeout).until(some_statement)

于 2013-07-21T21:32:45.263 回答