在我的 step-definition.py 中为 pytest-bdd 分组页面 class 个对象
Group Page class objects in my step-definition.py for pytest-bdd
我是使用 pytest-bdd 框架进行 BDD 测试的初学者。
我正在尝试使用页面对象模型技术构建一个框架。
我在下面创建了页面 class :
login.py
from selenium import webdriver
import time
class Login():
def __init__(self,driver):
self.driver = driver
def click_login(self):
element = self.driver.find_element_by_link_text('Login')
element.click()
def username_available(self):
self.driver.find_element_by_id("user_email").send_keys("test@test.com")
self.driver.find_element_by_id("user_password").send_keys("xyzxyz")
time.sleep(5)
self.driver.find_element_by_xpath("//input[@value='Log In']").click()
下面是我的功能文件。
Feature: LetsKodeIt Website
As an IT engineer,
I want to find information online
So I can learn new things
Scenario: LetsKodeIt Login One
Given the letskodeit website is opened
When I seen login
And I click on login
Then login page with username and password is displayed
Scenario: LetsKodeIt Login Two
Given the letskodeit website is opened
When I seen login
And I click on login
Then login page with username and password is displayed
conftest.py
import pytest
from selenium import webdriver
from pytest_bdd import given
@pytest.fixture()
def setup():
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
yield driver
driver.quit()
@given("the letskodeit website is opened")
def browser(setup):
setup.get("https://letskodeit.teachable.com/")
test_google_search.py
import pytest
from pytest_bdd import scenario,given,when,then
from selenium import webdriver
from pages.login_page import Login
@scenario("C:\Users\A610037\PycharmProjects\pytest-bdd\tests\features\letskodeit.feature","LetsKodeIt Login One")
def test_one():
pass
@when("I seen login")
@when("I click on login")
def step_imp(setup):
log = Login(setup)
log.click_login()
@then("login page with username and password is displayed")
def step_imp(setup):
log = Login(setup)
log.username_available()
@scenario("C:\Users\A610037\PycharmProjects\pytest-bdd\tests\features\letskodeit.feature","LetsKodeIt Login Two")
def test_two():
pass
@when("I seen login")
@when("I click on login")
def step_imp(setup):
log = Login(setup)
log.click_login()
@then("login page with username and password is displayed")
def step_imp(setup):
log = Login(setup)
log.username_available()
每次我在我的 test.py 文件中添加任何步骤定义时,我都必须为我的登录页面创建一个对象 class。
是否可以只创建一次页面对象,然后在我的@when,@then 步骤定义中调用该对象?
下面是我的项目结构
project-hierarchy
我想到了以下解决方案:
- 将登录页面设为 pytest fixture,并像步骤定义中的
setup
fixture 一样使用它
- 在你的功能文件中使用一个额外的给定步骤并向它添加
target_fixture="login_page"
-> pytest-bdd 将创建一个名称为 login_page
的 pytest fixture,可以像 [=13] =] 固定在你的步骤定义中
- 第一次创建时,使用包含在所有步骤定义中以及存储登录页面对象的上下文固定装置(例如字典)
使用 pytest fixture
@pytest.fixture
def login_page(setup):
return Login(setup)
@when("I seen login")
@when("I click on login")
def click_on_login(login_page):
login_page.click_login()
使用给定步骤创建夹具
@given("a login page", target_fixture="login_page")
def login_page(setup):
return Login(setup)
@when("I seen login")
@when("I click on login")
def click_on_login(login_page):
login_page.click_login()
使用上下文对象
@pytest.fixture
def step_context(setup):
return {'login_page': Login(setup)}
@when("I seen login")
def login_seen(setup, step_context):
step_context['login_page'] = Login(setup)
@when("I click on login")
def click_on_login(step_context):
step_context['login_page'].click_login()
我是使用 pytest-bdd 框架进行 BDD 测试的初学者。 我正在尝试使用页面对象模型技术构建一个框架。 我在下面创建了页面 class :
login.py
from selenium import webdriver
import time
class Login():
def __init__(self,driver):
self.driver = driver
def click_login(self):
element = self.driver.find_element_by_link_text('Login')
element.click()
def username_available(self):
self.driver.find_element_by_id("user_email").send_keys("test@test.com")
self.driver.find_element_by_id("user_password").send_keys("xyzxyz")
time.sleep(5)
self.driver.find_element_by_xpath("//input[@value='Log In']").click()
下面是我的功能文件。
Feature: LetsKodeIt Website
As an IT engineer,
I want to find information online
So I can learn new things
Scenario: LetsKodeIt Login One
Given the letskodeit website is opened
When I seen login
And I click on login
Then login page with username and password is displayed
Scenario: LetsKodeIt Login Two
Given the letskodeit website is opened
When I seen login
And I click on login
Then login page with username and password is displayed
conftest.py
import pytest
from selenium import webdriver
from pytest_bdd import given
@pytest.fixture()
def setup():
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
yield driver
driver.quit()
@given("the letskodeit website is opened")
def browser(setup):
setup.get("https://letskodeit.teachable.com/")
test_google_search.py
import pytest
from pytest_bdd import scenario,given,when,then
from selenium import webdriver
from pages.login_page import Login
@scenario("C:\Users\A610037\PycharmProjects\pytest-bdd\tests\features\letskodeit.feature","LetsKodeIt Login One")
def test_one():
pass
@when("I seen login")
@when("I click on login")
def step_imp(setup):
log = Login(setup)
log.click_login()
@then("login page with username and password is displayed")
def step_imp(setup):
log = Login(setup)
log.username_available()
@scenario("C:\Users\A610037\PycharmProjects\pytest-bdd\tests\features\letskodeit.feature","LetsKodeIt Login Two")
def test_two():
pass
@when("I seen login")
@when("I click on login")
def step_imp(setup):
log = Login(setup)
log.click_login()
@then("login page with username and password is displayed")
def step_imp(setup):
log = Login(setup)
log.username_available()
每次我在我的 test.py 文件中添加任何步骤定义时,我都必须为我的登录页面创建一个对象 class。 是否可以只创建一次页面对象,然后在我的@when,@then 步骤定义中调用该对象? 下面是我的项目结构 project-hierarchy
我想到了以下解决方案:
- 将登录页面设为 pytest fixture,并像步骤定义中的
setup
fixture 一样使用它 - 在你的功能文件中使用一个额外的给定步骤并向它添加
target_fixture="login_page"
-> pytest-bdd 将创建一个名称为login_page
的 pytest fixture,可以像 [=13] =] 固定在你的步骤定义中 - 第一次创建时,使用包含在所有步骤定义中以及存储登录页面对象的上下文固定装置(例如字典)
使用 pytest fixture
@pytest.fixture
def login_page(setup):
return Login(setup)
@when("I seen login")
@when("I click on login")
def click_on_login(login_page):
login_page.click_login()
使用给定步骤创建夹具
@given("a login page", target_fixture="login_page")
def login_page(setup):
return Login(setup)
@when("I seen login")
@when("I click on login")
def click_on_login(login_page):
login_page.click_login()
使用上下文对象
@pytest.fixture
def step_context(setup):
return {'login_page': Login(setup)}
@when("I seen login")
def login_seen(setup, step_context):
step_context['login_page'] = Login(setup)
@when("I click on login")
def click_on_login(step_context):
step_context['login_page'].click_login()