短篇小说: 我正在使用生菜和碎片为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
起初看起来它与测试数据库刷新有关,但是我删除了其他方案,并且刷新了,并且它一直在发生。
答案 0 :(得分:2)
这可能取决于您And I submit the form
的内容。如果此步骤单击“提交”按钮或类似的内容,那么它就是问题开始的地方。
除了点击和其他“onpage”交互之外,Webdriver几乎在所有操作之后等待页面加载。因此,点击后立即查找元素的存在而不等待响应。
作为一个解决方案,我建议你使用splinter docs中描述的wait_time
参数,或编写你自己的函数,该函数在一个check语句循环中,直到指定的超时。
P.S。:我还建议您查看python selenium,并wait(browser, timeout).until(some_statement)