在我的step-definition.py中将pytest-bdd组页面类对象

问题描述

我是使用pytest-bdd框架进行BDD测试的初学者。 我正在尝试使用Page对象模型技术构建一个框架。 我创建了以下页面类:


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文件添加任何步骤定义时,都必须创建登录页面类的对象。 是否可以仅创建一次页面对象,然后在我的@ when,@ then步骤定义中调用该对象? 下面是我的项目结构 project-hierarchy

解决方法

我想到了以下解决方案:

  1. 将登录页面设为 pytest 固定装置,并像步骤定义中的 setup 固定装置一样使用它
  2. 在您的功能文件中使用额外的给定步骤并添加 target_fixture="login_page" -> pytest-bdd 将创建一个名称为 login_page 的 pytest fixture,它可以像 setup 一样使用步骤定义中的夹具
  3. 在第一次创建登录页面对象时,使用包含在所有步骤定义中以及存储登录页面对象的上下文固定装置(例如字典)

使用pytest夹具


@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()

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...