有没有办法编写适用于多个关键字的步骤。比如说我的功能是:
Scenario: Something happens after navigating
Given I navigate to "/"
And say some cookie gets set
When I navigate to "/some-other-page"
Then something happens because of that cookie
我试图避免同时定义两者:
@given('I navigate to "{uri}"')
def get(context, uri):
current_url = BASE_URL + uri
context.driver.get(current_url)
@when('I navigate to "{uri}"')
def get(context, uri):
current_url = BASE_URL + uri
context.driver.get(current_url)
如果您只定义一个并尝试同时使用它,则会收到raise NotImplementedError(u'STEP:
错误。使用上面的例子,它并没有那么糟糕,因为步骤很简单,但重复代码似乎是不好的做法,你可能会在更复杂的事情上发生同样的事情,对我来说,如果有@all或@any关键字,这似乎是有意义的。
抱歉,如果这已在某处得到解答,但很难搜索,因为很难找到此类问题的独特搜索词
事实证明,这可以使用@step
来完成。
from behave import step
@step('I navigate to "{uri}"')
def step_impl(context, uri):
current_url = BASE_URL + uri
context.driver.get(current_url)
将适用于:
Scenario: Demo how @step can be used for multiple keywords
Given I navigate to "/"
When I navigate to "/"
Then I navigate to "/"
注意:从导致此文件的票证中弄清楚了这一点。
如果您不想使用@step,还可以执行以下操作:
@and(u'I navigate to "{uri}"')
@when(u'I navigate to "{uri}"')
@given(u'I navigate to "{uri}"')
def get(context, uri):
current_url = BASE_URL + uri
context.driver.get(current_url)
@given、@when和@then装饰器所代表的含义之间存在概念差异。您遇到的情况是,一个步骤适用于所有、部分或仅应用于一个。
当步骤仅适用于 2 种情况时,@step都是易于使用的,然后依靠测试编写者仅在正确的情况下使用该步骤。我鼓励人们不要这样做。请改用以下示例。
@given('step text')
@when('step text')
def step_impl(context):
pass
但是,当一个步骤真正适用于所有情况时,一个很好的例子是延迟步骤,然后使用@step装饰器:
@step('delay {duration} second(s)')
def step_impl(context, duration):
time.sleep(float(duration))
你可以尝试这样的事情:
作为网络用户 鉴于我导航到"/"并说设置了一些cookie 然后我导航到"/some-other-page" 因为那块饼干而发生了一些事情
它对我有用。当您在"Then"语句后面编写"And"语句时,它会将其视为两个"Then"语句。此外,您应该在给定的括号中包括u',然后是语句括号。
尝试如下:
@given(u'I navigate to "{uri}"')
def get(context, uri):
current_url = BASE_URL + uri
context.driver.get(current_url)
@given(u'say some cookie gets set')
def get(context, uri):
current_url = BASE_URL + uri
context.driver.get(current_url)
@then(u'I navigate to "/some-other-page"')
def step_impl(context):
//your code
@then(u'something happens because of that cookie')
def step_impl(context):
//your code