Page object с py.test нужен простой пример

pytest
webdriver
python
Теги: #<Tag:0x00007fedb9688ab8> #<Tag:0x00007fedb9688950> #<Tag:0x00007fedb96886a8>

(Philip Kandyba) #1

Привет!

Нужен простой пример, например для страницы логина.

Кто может дать пример, самый простой, но понятный как организовать тест и запустить. Проблема с передачей драйвера в базовый конструктор класса и дальше.

Если можно пример с использованием фикстур.


(rmerkushin) #2

Зачем вам вообще классы? Пишите просто функции. Сделайте инициализацию драйвера в фикстуре и просто передавайте ее в функции или маркайте функции на использование этой фикстуры. Лучше используйте yield fixture

conftest.py:

@pytest.yield_fixture(scope='module')
def chrome_driver_setup():
    driver = SeleniumWrapper().chrome_driver()
    yield driver
    driver.close()

test.py:


@pytest.mark.usefixtures('chrome_driver_setup')
def test()
    pass

В примере выше driver - синглтон.


(Sergei Chipiga) #3

@rmerkushin

Может тогда:

@pytest.yield_fixture(scope='module')
def chrome_driver():
    driver = SeleniumWrapper().chrome_driver()
    yield driver
    driver.close()

def test(chrome_driver):
    chrome_driver.do_some_stuff()

Чтобы показать, как пользоваться им :wink:


(rmerkushin) #4

Можно и так, у меня просто был другой подход. Драйвер создавался в фикстуре, а на прямую в тестах он не использовался. По скольку он синглтон его легко можно было щупать прямо из page object в отдельном модуле. Ваше пример всеж лучше, у меня просто копипаста со старого кода )

З.Ы.: http://selenium-python.readthedocs.io/page-objects.html вот может и не самый лучший но пример Page Object, только натянуть нужно на fixture и pyttest )

З.З.Ы: вообще автору топика лучше поглядеть в сторону чего нибудь такого https://github.com/actmd/elementium или selene. Думаю это будет лучше чем велосипедить Page Object


(Maxim Andryushchenkov) #5

Не согласен, без своего велосипеда он не разберется что ему лучше и понятнее

А вообще сложный вы пример ему дали, надо сначала разобраться как фикстура инита драйвера используется в стендовых фикстурах

@pytest.fixture()
def get_driver(request):
    browser = request.config.getoption('--browser')
    results_dir = path.join(getcwd(), 'results')

    if not path.exists(results_dir):
        makedirs(results_dir)

    log_path = path.join(results_dir, 'driver.log')
    drivers_dir = path.join(getcwd(), 'drivers')

    os_name = system().lower()
    os_arch = ''.join([s for s in architecture()[0] if s.isdigit()])
    os_type = os_name + os_arch
    driver = None
    driver_name = dict(
        firefox='geckodriver',
        chrome='chromedriver'
    )[browser]
    driver_path = path.join(drivers_dir, driver_name, os_type, driver_name)
    if os_name == 'windows':
        driver_path += '.exe'

    if browser == 'firefox':
        cap = webdriver.DesiredCapabilities().FIREFOX
        cap['marionette'] = False
        driver = webdriver.Firefox(executable_path=driver_path,
                                   log_path=log_path,
                                   capabilities=cap)
    elif browser == 'chrome':
        driver = webdriver.Chrome(executable_path=driver_path, service_log_path=log_path)

    print(popen(driver_path + ' --version').read())
    driver.maximize_window()

    def close_driver():
        driver.quit()

    request.addfinalizer(close_driver)
    return driver


@pytest.fixture()
def get_welcome_page(get_driver):
    from pages.welcome_page import WelcomePage
    page = WelcomePage(get_driver)
    page.navigate()
    return page

Это из фреймворка, там стенды (фикстуры) используют ранее написанные фикстуры. Все происходит по цепочке и без повторений кода