Привет!
Нужен простой пример, например для страницы логина.
Кто может дать пример, самый простой, но понятный как организовать тест и запустить. Проблема с передачей драйвера в базовый конструктор класса и дальше.
Если можно пример с использованием фикстур.
1 лайк
rmerkushin
(rmerkushin)
18.Октябрь.2017 06:46:05
#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 - синглтон.
@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()
Чтобы показать, как пользоваться им
1 лайк
rmerkushin
(rmerkushin)
18.Октябрь.2017 07:00:07
#4
Можно и так, у меня просто был другой подход. Драйвер создавался в фикстуре, а на прямую в тестах он не использовался. По скольку он синглтон его легко можно было щупать прямо из page object в отдельном модуле. Ваше пример всеж лучше, у меня просто копипаста со старого кода )
З.Ы.: 6. Page Objects — Selenium Python Bindings 2 documentation вот может и не самый лучший но пример Page Object, только натянуть нужно на fixture и pyttest )
З.З.Ы: вообще автору топика лучше поглядеть в сторону чего нибудь такого GitHub - actmd/elementium: jQuery-style syntactic sugar for highly reliable automated browser testing in Python или selene. Думаю это будет лучше чем велосипедить Page Object
1 лайк
Maxim1
19.Октябрь.2017 11:23:37
#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
Это из фреймворка, там стенды (фикстуры) используют ранее написанные фикстуры. Все происходит по цепочке и без повторений кода