Python..Behave..Selenium..Page Objects - 在environment.py中设置浏览器但无法访问页面对象模块

时间:2018-04-19 14:22:32

标签: python selenium selenium-webdriver pageobjects python-behave

我的文件结构如下

Tests/
├── BehaveTest1
│   ├── BehaveTest1.feature
│       └── environment.py
│   └── steps 
│       └── test_steps.py
├── BehaveTest2
│   ├── BehaveTest2.feature
│       └── environment.py
│   └── steps
│       └── test_steps.py
├── common.py
├── __init__.py

我已在environment.py

中设置了Chrome浏览器
from selenium import webdriver

def before_feature(context, feature):
    print("Before feature\n")
    context.browser = webdriver.Chrome()

base_model.py中,我为Page Objects

设置了基类
class BaseModel:
    def __init__(self, browser):
        self.browser = browser

第一个页面对象是home_model.py

from selenium.common.exceptions import NoSuchElementException
from .base_model import *

class HomeModel(BaseModel):
    def __init__(self, context):
        BaseModel.__init__(self, context.browser)

    def cookie_notification(self):
        return "all4gn-cookie-policy-notification"

    def click_cookie_notification(self, context):
        context.browser.click_element('class', str(self.cookie_notification()))

当我运行测试时,两个浏览器启动。那是为什么?

我想在页面对象中进行所有调用,而不是在步骤定义中。我只是希望能够在我的步骤定义中调用页面对象。

这意味着我需要访问控制浏览器的context变量。

1 个答案:

答案 0 :(得分:0)

首先,如果您正在测试相同的系统/软件,请允许我建议您没有2个单独的目录来进行测试。

为什么呢?您可以在features/目录中拥有多个功能文件,并在features/steps/目录中拥有多个步骤定义。在features/目录中运行时,Behave将搜索所有.feature文件,并使用与您的功能文件相关的必要.py文件。 environment.py目录中的features/适用于features/steps/目录中的所有步骤定义。

如果您正在测试完全不同的内容(即需要不同环境的不同功能文件/ environment.py),那么我相信您必须在更高的位置控制您的程序级别并可能重新组织您的测试套件,因为您已经尝试过的功能似乎并不起作用。

更重要的是,如果您出于组织目的使用此目录结构,请认识到Behave对其目录结构是严格的。相反,您必须使用标签和良好的命名约定来组织您的套件。

其次,对于您希望在BaseModel内以及步骤定义中使用HomeModelenvironment.py类的方式,我建议您按照以下步骤操作:

  1. 将您的所有文件放在一个测试套件中:

    Tests/
    ├── environment.py
    ├── common.py
    ├── __init__.py
    ├── BehaveTest1.feature
    ├── BehaveTest2.feature
    └── steps 
        └── test_step1.py
        └── test_step2.py 
    
  2. 将您的base_model.pyhome_model.py文件导入environment.py文件。
  3. environment.py的{​​{1}}函数中初始化您的类对象。例如,

    before_all(context)
  4. 在一个步骤中使用您的类对象:

    def before_all(context):
        browser = webdriver.Chrome()
        base_model = BaseModel(browser)
        context.home_model = HomeModel(base_model)
    
  5. 根据我对Behave的经验,这是使用Behave及其功能的普通方法。