当我 运行 我的功能测试时,BDD Behave Selenium Python 错误没有模块命名页面

BDD Behave Selenium Python error no module named pages when i run my feature test

我在 Behave Python Selenium 中编写了一个功能测试。当我 运行 测试时,它会抛出错误 ImportError No module named pages。 我认为它在页面目录中找不到我的 类。 homepage.py、searchpage.py

我的导入不正确吗?我该如何解决这个问题?

完整的错误是:

    > log
Traceback (most recent call last):
  File "C:\Python27\lib\runpy.py", line 162, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "C:\Python27\lib\runpy.py", line 72, in _run_code
    exec code in run_globals
  File "c:\Python27\Scripts\behave.exe\__main__.py", line 9, in <module>
  File "C:\Python27\lib\site-packages\behave\__main__.py", line 109, in main
    failed = runner.run()
  File "C:\Python27\lib\site-packages\behave\runner.py", line 672, in run
    return self.run_with_paths()
  File "C:\Python27\lib\site-packages\behave\runner.py", line 678, in run_with_pat
    self.load_step_definitions()
  File "C:\Python27\lib\site-packages\behave\runner.py", line 658, in load_step_de
    exec_file(os.path.join(path, name), step_module_globals)
  File "C:\Python27\lib\site-packages\behave\runner.py", line 304, in exec_file
    exec(code, globals, locals)
  File "steps\steps.py", line 5, in <module>
    from pages import homepage
ImportError: No module named pages

我的代码如下:

features\steps\steps.py

from behave import given, when, then
from pages import homepage
from pages import searchpage

@given ('we are on the homepage')
def step(context):
   context.browser.get('http://localhost:8080/test')

@when ('we enter "{product}" in the search field')
def step(context, product):
   home_page = homepage.HomePage(context)
   home_page.enter_product_in_search_field(product, context)

@when ('And we click the search button')
def step(context, home_page):
   searchPage_results = home_page.click_search_button(context)

@then ('the list of products are displayed')
def step(context, searchPage):
   searchPage.search_products_results(context)

features\environment.py

import logging
from selenium import webdriver

def before_all(context):
    selenium_logger = logging.getLogger(
        'selenium.webdriver.remote.remote_connection')
    selenium_logger.setLevel(logging.WARN)
    context.browser = webdriver.Firefox()
    context.browser.get('http://localhost:8080/test')
    context.browser.implicitly_wait(3)


def after_all(context):
    context.browser.quit()

pages\homepage.py

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from searchpage import SearchPage

class HomePage(object):

    def __init__(self, context):
        context = context

    def enter_product_in_search_field(self, product, context):
        search_field = context.browser.find_element(By.ID, 'search_field')
        search_field.send_keys(product)
        return self

    def click_search_button(self, context):
        search_button = context.find_element(By.ID, 'search_button_home_page').click()
        return SearchPage(context)

pages\searchpage.py

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

class SearchPage():

    def __init__(self, context):
        context = context

    def search_products_results(self, context):
        wait = WebDriverWait(context.browser, 60)
        divs =  wait.until(EC.presence_of_all_elements_located((By.XPATH, '//div/a/h2')))
        for i in divs:
         print i.text
        return self

我的目录结构如下:

E:\selenium_test\features\steps\steps.py
E:\selenium_test\features\environment.py
E:\selenium_test\features\search.feature
E:\selenium_test\features\__init__.py

E:\selenium_test\pages\homepage.py
E:\selenium_test\pages\searchpage.py
E:\selenium_test\pages\__init__.py

谢谢, 里亚兹

首选

移动到feature/steps下。添加 init 文件。然后导入就可以了

更难

更新 sys.path 以包含 'pages' 的位置。 您可以从 environment.py 或 steps.py 本身

执行此操作

笨拙

import imp
myPkg = imp.load_source('module.name', '/path/to/pages/file.py')

刚知道:

导出 PYTHONPATH=$PYTHONPATH:/abs/path/to/pages。不过不推荐。

插图:

.
├── anotherpages
│   ├── __init__.py
│   └── third.py
├── features
│   ├── __init__.py
│   └── steps
│       ├── __init__.py
│       ├── pages
│       │   ├── first.py
│       │   └── __init__.py
│       └── steps.py
└── outpages
    ├── __init__.py
    └── second.py

$猫features/steps/steps.py

#Preferred
from pages.first import inside_hello
inside_hello()

#Harder
import sys
import os
path = os.path.abspath(os.path.join(os.path.dirname(__file__), '../..'))
if not path in sys.path:
    sys.path.insert(1, path)
del path
from outpages.second import outside_hello
outside_hello()

#Fiddly
import imp
third = imp.load_source('third', '/path/to/anotherpages/third.py')
from third import another_hello
another_hello()

$pythonfeatures/steps/steps.py

Hello from inside
Hello from outer world
Hello from another outer world

$ cd features/steps/

~features/steps$ python steps.py
Hello from inside
Hello from outer world
Hello from another outer world