Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 64 additions & 12 deletions features/environment.py
Original file line number Diff line number Diff line change
@@ -1,37 +1,89 @@
import allure
from allure_commons.types import AttachmentType
from app.application import Application

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.wait import WebDriverWait
from app.application import Application
from selenium.webdriver.support.events import EventFiringWebDriver
from selenium.webdriver.chrome.service import Service

from support.logger import logger, MyListener

# Allure command:
# behave -f allure_behave.formatter:AllureFormatter -o test_results/ features/tests/product_page.feature

def browser_init(context):

def browser_init(context, test_name):
"""
:param context: Behave context
:param test_name: scenario.name
"""
service = Service('/Users/svetlanalevinsohn/JobEasy/13-python-selenium-automation/chromedriver')
context.driver = webdriver.Chrome(service=service)
# context.browser = webdriver.Safari()
# context.browser = webdriver.Firefox()
# service = Service('/Users/svetlanalevinsohn/JobEasy/13-python-selenium-automation/chromedriver')
# service = Service('/Users/svetlanalevinsohn/JobEasy/12-python-selenium-automation/geckodriver')
# context.driver = webdriver.Chrome(service=service)
# context.driver = webdriver.Firefox(service=service)
# context.driver = webdriver.Safari()

## HEADLESS MODE ####
# options = webdriver.ChromeOptions()
# options.add_argument('--headless')
# context.driver = webdriver.Chrome(
# chrome_options=options,
# service=service
# )

### EventFiringWebDriver - log file ###
### for drivers ###
# context.driver = EventFiringWebDriver(
# webdriver.Chrome(service=service),
# MyListener()
# )
# for headless mode ###
# context.driver = EventFiringWebDriver(webdriver.Chrome(chrome_options = options), MyListener())

# for browerstack ###
# Register for BrowserStack, then grab it from https://www.browserstack.com/accounts/settings
bs_user = ''
bs_key = ''

desired_cap = {
'browserName': 'Firefox',
'bstack:options': {
'os': 'Windows',
'osVersion': '10',
'sessionName': test_name
}
}
url = f'http://{bs_user}:{bs_key}@hub-cloud.browserstack.com/wd/hub'
context.driver = webdriver.Remote(url, desired_capabilities=desired_cap)

context.driver.maximize_window()
context.driver.implicitly_wait(4)
context.driver.implicitly_wait(5)
context.driver.wait = WebDriverWait(context.driver, 10)
context.app = Application(driver=context.driver)

context.app = Application(context.driver)


def before_scenario(context, scenario):
print('\nStarted scenario: ', scenario.name)
browser_init(context)
# print('\nStarted scenario: ', scenario.name)
logger.info(f'Started scenario: {scenario.name}')
browser_init(context, scenario.name)


def before_step(context, step):
print('\nStarted step: ', step)
# print('\nStarted step: ', step)
logger.info(f'Started step: {step}')


def after_step(context, step):
if step.status == 'failed':
logger.error(f'Step failed: {step}')
print('\nStep failed: ', step)
# Mark test case as FAILED on BrowserStack:
# context.driver.execute_script(
# 'browserstack_executor: {"action": "setSessionStatus", "arguments": {"status":"failed", "reason": "Step failed"}}')


def after_scenario(context, feature):
context.driver.delete_all_cookies()
context.driver.quit()
1 change: 1 addition & 0 deletions features/tests/bestsellers.feature
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
Feature: Tests for bestsellers functionality

@smoke @negative
Scenario: Bestsellers links can be opened
Given Open Amazon Bestsellers
Then User can click through top links and verify correct page opens
3 changes: 2 additions & 1 deletion pages/base_page.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from support.logger import logger
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

Expand Down Expand Up @@ -25,7 +26,7 @@ def input_text(self, text, *locator):
e = self.driver.find_element(*locator)
e.clear()
e.send_keys(text)
print(f'Inputting text: {text}')
logger.info(f'Inputting text: {text}')

def wait_for_element_click(self, *locator):
e = self.wait.until(EC.element_to_be_clickable(locator), message=f'Element not clickable by {locator}')
Expand Down
2 changes: 2 additions & 0 deletions pages/main_page.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
from support.logger import logger
from pages.base_page import Page


class MainPage(Page):

def open_main_url(self):
logger.info('Opening url https://www.amazon.com/...')
self.open_url('https://www.amazon.com/')
3 changes: 2 additions & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
behave
selenium
selenium
allure-behave
Empty file added support/__init__.py
Empty file.
25 changes: 25 additions & 0 deletions support/logger.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import logging

from selenium.webdriver.support.events import AbstractEventListener

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
handler = logging.FileHandler('./test_automation.log')
handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)


class MyListener(AbstractEventListener):
logger = logger

def before_find(self, by, value, driver):
logger.info(f"Searching by {by} '{value}'...")

def after_find(self, by, value, driver):
logger.info(f"Found by {by} '{value}'")

def on_exception(self, exception, driver):
logger.error(exception)