Skip to content

Commit b201dde

Browse files
committed
Updated code for Page Objects
1 parent 36b37c7 commit b201dde

17 files changed

+142
-194
lines changed

app/application.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
1-
from pages.main_page import MainPage
1+
from pages.main_page import MainPage
22
from pages.header import Header
3-
from pages.search_results_page import SearchResultsPage
3+
from pages.search_result_page import SearchResultsPage
44

55

66
class Application:
7+
78
def __init__(self, driver):
8-
self.main = MainPage(driver)
9+
self.main_page = MainPage(driver)
910
self.header = Header(driver)
10-
self.search_results = SearchResultsPage(driver)
11+
self.search_result_page = SearchResultsPage(driver)
12+
13+
14+
15+

features/environment.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
from selenium import webdriver
22
from selenium.webdriver.chrome.service import Service
33
from webdriver_manager.chrome import ChromeDriverManager
4+
from selenium.webdriver.support.wait import WebDriverWait
5+
6+
from app.application import Application
47

58

69
def browser_init(context):
@@ -11,11 +14,14 @@ def browser_init(context):
1114
service = Service(driver_path)
1215
context.driver = webdriver.Chrome(service=service)
1316

14-
context.driver.maximize_window()
15-
1617
context.driver.maximize_window()
1718
context.driver.implicitly_wait(4)
18-
context.wait = Application
19+
context.wait = WebDriverWait(context.driver, timeout=15)
20+
21+
context.app = Application(context.driver)
22+
23+
# context.app.header #to work with login
24+
# context.app.main_page
1925

2026

2127
def before_scenario(context, scenario):
@@ -34,4 +40,4 @@ def after_step(context, step):
3440

3541
def after_scenario(context, feature):
3642
context.driver.delete_all_cookies()
37-
context.driver.quit()
43+
context.driver.quit()

features/steps/add_target_product_steps.py

Lines changed: 0 additions & 55 deletions
This file was deleted.

features/steps/main_page_steps.py

Lines changed: 46 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,69 @@
11
from selenium.webdriver.common.by import By
2+
from selenium.webdriver.support import expected_conditions as EC
23
from behave import given, when, then
34
from time import sleep
45

5-
SEARCH_FIELD = (By.ID, 'search')
6-
SEARCH_ICON = (By.XPATH, "//button[@data-test='@web/Search/SearchButton']")
6+
7+
SEARCH_INPUT = (By.ID, 'search')
8+
SEARCH_BTN = (By.XPATH, "//button[@data-test='@web/Search/SearchButton']")
79
CART_ICON = (By.CSS_SELECTOR, "[data-test='@web/CartLink']")
810
HEADER = (By.CSS_SELECTOR, "[class*='UtilityHeaderWrapper']")
9-
HEADER_LINKS = (By.CSS_SELECTOR, "[data-test*='@web/GlobalHeader/UtilityHeader']")
11+
HEADER_LINKS = (By.CSS_SELECTOR, "a[id*='utilityNav']")
12+
ADD_TO_CART_BTN = (By.CSS_SELECTOR, "[id*='addToCartButton']")
13+
SIDE_NAV_PRODUCT_NAME = (By.CSS_SELECTOR, "h4[class*='StyledHeading']")
14+
SIDE_NAV_ADD_TO_CART_BTN = (By.CSS_SELECTOR, "[data-test='orderPickupButton']")
1015

1116

1217
@given('Open Target main page')
13-
def open_target_main(context):
14-
context.driver.get('https://www.target.com/')
18+
def open_target(context):
19+
context.app.main_page.open_main()
1520

1621

17-
@when('Search for {product}')
18-
def search_product(context, product):
19-
context.driver.find_element(*SEARCH_FIELD).send_keys(product)
20-
context.driver.find_element(*SEARCH_ICON).click()
21-
sleep(6)
22+
@when("Search for {item}")
23+
def search_product(context, item):
24+
context.app.header.search_product(item)
2225

2326

2427
@when('Click on Cart icon')
2528
def click_cart(context):
2629
context.driver.find_element(*CART_ICON).click()
2730

2831

32+
@when('Click on Add to Cart button')
33+
def click_add_to_cart(context):
34+
context.driver.find_element(*ADD_TO_CART_BTN).click()
35+
# Add multiple:
36+
# add_cart_btns = context.driver.find_elements(*ADD_TO_CART_BTN)
37+
# for btn in add_cart_btns[:5]:
38+
# btn.click() # => will click on the first 5 buttons 1 by 1
39+
# add_cart_btns[4].click() # => will only click on the 5th Add to cart btn
40+
41+
42+
@when('Store product name')
43+
def store_product_name(context):
44+
context.wait.until(
45+
EC.presence_of_element_located(SIDE_NAV_PRODUCT_NAME),
46+
message='Product name not present on the page'
47+
)
48+
context.product_name = context.driver.find_element(*SIDE_NAV_PRODUCT_NAME).text
49+
50+
51+
@when('Confirm Add to Cart button from side navigation')
52+
def side_nav_click_add_to_cart(context):
53+
context.driver.find_element(*SIDE_NAV_ADD_TO_CART_BTN).click()
54+
context.wait.until(
55+
EC.invisibility_of_element_located(SIDE_NAV_ADD_TO_CART_BTN),
56+
message='Side nav, Add to Cart button did not disappear'
57+
)
58+
59+
2960
@then('Verify header in shown')
30-
def verify_header(context):
31-
# header = context.driver.find_element(*HEADER)
32-
# print(header)
61+
def verify_header_shown(context):
3362
context.driver.find_element(*HEADER)
3463

3564

3665
@then('Verify header has {expected_amount} links')
37-
def verify_header_links(context, expected_amount):
38-
expected_amount = int(expected_amount)
39-
header_links = context.driver.find_elements(*HEADER_LINKS)
40-
assert len(header_links) == expected_amount, f'Expected {expected_amount} links, but got {len(header_links)}'
66+
def verify_header_links(context, expected_amount): # expected_amount = '5'
67+
expected_amount = int(expected_amount) # '5' (str) => 5 (int)
68+
links = context.driver.find_elements(*HEADER_LINKS)
69+
assert len(links) == expected_amount, f'Expected {expected_amount} links but got {len(links)}'
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
from selenium.webdriver.common.by import By
2+
from behave import then
3+
from time import sleep
4+
5+
6+
SEARCH_RESULT_HEADER = (By.XPATH, "//div[@data-test='resultsHeading']")
7+
LISTINGS = (By.CSS_SELECTOR, "[data-test='@web/site-top-of-funnel/ProductCardWrapper']")
8+
PRODUCT_TITLE = (By.CSS_SELECTOR, "[data-test='product-title']")
9+
PRODUCT_IMG = (By.CSS_SELECTOR, "[class*='ProductCardImage']")
10+
11+
12+
@then('Verify search results are shown for {expected_item}')
13+
def verify_search_results(context, expected_item):
14+
context.app.search_result_page.verify_search_results(expected_item)
15+
16+
17+
@then('Verify that every product has a name and an image')
18+
def verify_products_name_img(context):
19+
# To see ALL listings (comment out if you only check top ones):
20+
context.driver.execute_script("window.scrollBy(0,2000)", "")
21+
sleep(4)
22+
context.driver.execute_script("window.scrollBy(0,2000)", "")
23+
24+
all_products = context.driver.find_elements(*LISTINGS) # [WebEl1, WebEl2, WebEl3, WebEl4]
25+
26+
for product in all_products:
27+
title = product.find_element(*PRODUCT_TITLE).text
28+
assert title, 'Product title not shown'
29+
product.find_element(*PRODUCT_IMG)

features/steps/target_circle_steps.py

Lines changed: 0 additions & 17 deletions
This file was deleted.

features/steps/target_search.py

Lines changed: 0 additions & 29 deletions
This file was deleted.

features/tests/add_target_product.feature

Lines changed: 0 additions & 13 deletions
This file was deleted.

features/tests/cart_tests.feature

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,10 @@ Feature: Cart tests
77

88
Scenario: User can add a product to cart
99
Given Open target main page
10-
When Search for Lunar New Year M&M's
10+
When Search for Ice Tea
1111
And Click on Add to Cart button
1212
And Store product name
1313
And Confirm Add to Cart button from side navigation
1414
And Open cart page
1515
Then Verify cart has 1 item(s)
16-
And Verify cart has correct product
17-
18-
Scenario: User can add different products to cart
19-
Given Open target main page
20-
When Search for Lunar New Year M&M's
21-
And Click on Add to Cart button for product 1
22-
And Store product name to a list
23-
And Confirm Add to Cart button from side navigation
24-
And Close side navigation
25-
And Click on Add to Cart button for product 2
26-
And Store product name to a list
27-
And Confirm Add to Cart button from side navigation
28-
And Open cart page
29-
Then Verify cart has 2 item(s)
30-
And Verify cart has correct multiple products
16+
And Verify cart has correct product
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
Feature: Tests for main page UI
2+
3+
Scenario: Verify header in shown
4+
Given Open Target main page
5+
Then Verify header in shown
6+
7+
Scenario: Verify header has correct amount links
8+
Given Open Target main page
9+
Then Verify header has 5 links

features/tests/target_circle.feature

Lines changed: 0 additions & 7 deletions
This file was deleted.

features/tests/target_search.feature

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,22 @@
11
Feature: Search tests
22

3-
Scenario: User can search for tea
4-
Given Open Target main page
5-
When Search for 'tea'
6-
Then Verify search results are shown for tea
73

4+
Scenario: User can search for a tea
5+
Given Open Target main page
6+
When Search for ice tea
7+
Then Verify search results are shown for ice tea
88

9-
Scenario Outline: User can search for a product# Given Open Target main page
9+
Scenario Outline: User can search for a product
1010
Given Open Target main page
11-
When Search for '<item>'
11+
When Search for <item>
1212
Then Verify search results are shown for <expected_item>
1313
Examples:
14-
| item | expected_item |
15-
| mug | mug |
16-
| tea | tea |
17-
| spoon | spoon |
18-
| sugar | sugar |
14+
|item |expected_item |
15+
|mug |mug |
16+
|tea |tea |
17+
|white mug |white mug |
1918

20-
Scenario Verify that user can see product
19+
Scenario: Verify that user can see product names and images
20+
Given Open target main page
21+
When Search for AirPods (3rd Generation)
22+
Then Verify that every product has a name and an image

pages/base_page.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
1+
12
class Page:
23

34
def __init__(self, driver):
45
self.driver = driver
56

67
def find_element(self, *locator):
7-
self.driver.find_element(*locator)
8+
return self.driver.find_element(*locator)
89

910
def find_elements(self, *locator):
10-
self.driver.find_element(*locator)
11+
return self.driver.find_elements(*locator)
1112

1213
def click(self, *locator):
1314
self.find_element(*locator).click()

0 commit comments

Comments
 (0)