From 0176973a49af226e899e13c799ff113de9021237 Mon Sep 17 00:00:00 2001 From: Mat Hare Date: Sat, 10 Jul 2021 21:02:01 +0100 Subject: [PATCH] Implement home page scenario --- conftest.py | 13 ++++++++----- features/home_page.feature | 20 ++++++++++---------- pages/home.py | 13 +++++++++++-- step_defs/test_home_page_steps.py | 10 +++++++++- 4 files changed, 38 insertions(+), 18 deletions(-) diff --git a/conftest.py b/conftest.py index 71db415..fcc67b8 100644 --- a/conftest.py +++ b/conftest.py @@ -55,7 +55,7 @@ def browser(config): b.quit() -@pytest.fixture() +@pytest.fixture def datatable(): return DataTable() @@ -77,7 +77,6 @@ class DataTable(object): @given(parsers.parse('I have navigated to the \'the-internet\' "{page_name}" page'), target_fixture='navigate_to') def navigate_to(browser, page_name): - BASE_URL = "https://the-internet.herokuapp.com" PAGE_URLS = { @@ -89,7 +88,9 @@ def navigate_to(browser, page_name): "inputs": BASE_URL + "/inputs", "secure area": BASE_URL + "/secure" } - browser.get(PAGE_URLS.get(page_name.lower())) + url = PAGE_URLS.get(page_name.lower()) + browser.get(url) + return url @then(parsers.parse('a "{text}" banner is displayed in the top-right corner of the page')) @@ -108,10 +109,12 @@ def verify_banner_text(browser, text): if attr.startswith("border"): assert "0px" == attr.split(": ")[1] + @then(parsers.parse('the page has a footer containing "{text}"')) def verify_footer_text(browser, text): - assert text == BasePage(browser).get_page_footer_text() + assert text == BasePage(browser).get_page_footer_text() + @then(parsers.parse('the link in the page footer goes to "{url}"')) def verify_footer_link_url(browser, url): - assert url == BasePage(browser).get_page_footer_link_url() + assert url == BasePage(browser).get_page_footer_link_url() diff --git a/features/home_page.feature b/features/home_page.feature index 9d70a33..a883a02 100644 --- a/features/home_page.feature +++ b/features/home_page.feature @@ -57,13 +57,13 @@ Feature: Home Page And the page has a footer containing "Powered by Elemental Selenium" And the link in the page footer goes to "http://elementalselenium.com/" -# Scenario Outline: Open page -# When I click on the "" link -# Then the "" page opens -# Examples: -# | page | -# | Checkboxes | -# | Dropdown | -# | Dynamic Controls | -# | Form Authentication | -# | Inputs | \ No newline at end of file +Scenario Outline: Open page + When I click on the "" link + Then the "" page opens + Examples: + | page | + | Checkboxes | + | Dropdown | + | Dynamic Controls | + | Form Authentication | + | Inputs | \ No newline at end of file diff --git a/pages/home.py b/pages/home.py index 4f5b347..67ec477 100644 --- a/pages/home.py +++ b/pages/home.py @@ -9,11 +9,17 @@ class HomePage(BasePage): def PAGE_TITLE(self): return (By.TAG_NAME, 'h1') SUBHEADER = (By.TAG_NAME, 'h2') - SUBPAGE_LINKS = (By.XPATH, '//*[@id="content"]/ul/li') + SUBPAGE_LINKS = (By.XPATH, '//*[@id="content"]/ul/li/a') def __init__(self, browser): self.browser = browser + def click_page_link(self, page_name): + links = self.browser.find_elements(*self.SUBPAGE_LINKS) + for link in links: + if link.text.startswith(page_name): + link.click() + def get_page_title_text(self): return self.browser.find_element(*self.PAGE_TITLE).text @@ -23,4 +29,7 @@ class HomePage(BasePage): def get_subpage_list(self): links = self.browser.find_elements(*self.SUBPAGE_LINKS) titles = [link.text.split(" (")[0] for link in links] - return titles \ No newline at end of file + return titles + + def get_current_url(self): + return self.browser.current_url diff --git a/step_defs/test_home_page_steps.py b/step_defs/test_home_page_steps.py index 600594f..f4f0187 100644 --- a/step_defs/test_home_page_steps.py +++ b/step_defs/test_home_page_steps.py @@ -1,9 +1,13 @@ -from pytest_bdd import scenarios, given, when, then, parsers +from pytest_bdd import scenarios, when, then, parsers from pages.home import HomePage as page from sttable import parse_str_table +from pages.base import BasePage scenarios('../features/home_page.feature') +@when(parsers.parse('I click on the "{page_name}" link')) +def click_page_link(browser, page_name): + page(browser).click_page_link(page_name) @then(parsers.parse('the page title is "{title}"')) def verify_page_title(browser, title): @@ -20,3 +24,7 @@ def verify_subpage_list(browser, datatable, subpages): expected = parse_str_table(subpages) for field in expected.fields: assert expected.columns[field] == page(browser).get_subpage_list() + +@then(parsers.parse('the "{page_name}" page opens')) +def verify_page_opens(browser, page_name, navigate_to): + assert navigate_to == page(browser).get_current_url()