From cd47acc8fd94f4f7db45a88e22eae76702209cc9 Mon Sep 17 00:00:00 2001 From: Svetlana Levinsohn Date: Thu, 23 Mar 2023 20:03:39 -0700 Subject: [PATCH] Lesson 9 --- features/environment.py | 76 +++++++++++++++++++++++++----- features/tests/bestsellers.feature | 1 + pages/base_page.py | 3 +- pages/main_page.py | 2 + requirements.txt | 3 +- support/__init__.py | 0 support/logger.py | 25 ++++++++++ 7 files changed, 96 insertions(+), 14 deletions(-) create mode 100644 support/__init__.py create mode 100644 support/logger.py diff --git a/features/environment.py b/features/environment.py index 824f82d04..6c9c409af 100755 --- a/features/environment.py +++ b/features/environment.py @@ -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() diff --git a/features/tests/bestsellers.feature b/features/tests/bestsellers.feature index 54d122a8a..c7f61c2f6 100644 --- a/features/tests/bestsellers.feature +++ b/features/tests/bestsellers.feature @@ -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 \ No newline at end of file diff --git a/pages/base_page.py b/pages/base_page.py index 8ad04ff64..e74a280b8 100644 --- a/pages/base_page.py +++ b/pages/base_page.py @@ -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 @@ -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}') diff --git a/pages/main_page.py b/pages/main_page.py index f2c55497d..9d88057be 100644 --- a/pages/main_page.py +++ b/pages/main_page.py @@ -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/') \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 6ba4fa085..de3656ddb 100755 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ behave -selenium \ No newline at end of file +selenium +allure-behave \ No newline at end of file diff --git a/support/__init__.py b/support/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/support/logger.py b/support/logger.py new file mode 100644 index 000000000..8c9285ad6 --- /dev/null +++ b/support/logger.py @@ -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) +