From 661c202c9817e837c8270d16098d28fcf7c3c6f7 Mon Sep 17 00:00:00 2001 From: Tuychi M Date: Mon, 18 Mar 2024 22:48:39 -0400 Subject: [PATCH 01/12] update automated search script --- sample_script.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sample_script.py b/sample_script.py index 23d64fc06..3e276743f 100755 --- a/sample_script.py +++ b/sample_script.py @@ -18,7 +18,7 @@ # populate search field search = driver.find_element(By.NAME, 'q') search.clear() -search.send_keys('Car') +search.send_keys('table') # wait for 4 sec sleep(4) @@ -27,7 +27,7 @@ driver.find_element(By.NAME, 'btnK').click() # verify search results -assert 'car' in driver.current_url.lower(), f"Expected query not in {driver.current_url.lower()}" +assert 'table' in driver.current_url.lower(), f"Expected query not in {driver.current_url.lower()}" print('Test Passed') driver.quit() From e93ca5f324b00467cc5ace8ba0bc34b4f53b5ab5 Mon Sep 17 00:00:00 2001 From: Tuychi M Date: Tue, 26 Mar 2024 20:18:20 -0400 Subject: [PATCH 02/12] Update files --- Target test case.py | 27 +++++++++++++++++++++++++++ features/__init__.py | 25 +++++++++++++++++++++++++ features/tests/__init__.py | 24 ++++++++++++++++++++++++ locator.py | 34 ++++++++++++++++++++++++++++++++++ 4 files changed, 110 insertions(+) create mode 100644 Target test case.py create mode 100644 locator.py diff --git a/Target test case.py b/Target test case.py new file mode 100644 index 000000000..571b4003a --- /dev/null +++ b/Target test case.py @@ -0,0 +1,27 @@ +from selenium import webdriver +from selenium.webdriver.common.by import By +from selenium.webdriver.chrome.service import Service +from webdriver_manager.chrome import ChromeDriverManager +from time import sleep + +# get the path to the ChromeDriver executable +driver_path = ChromeDriverManager().install() + +# create a new Chrome browser instance +service = Service(driver_path) +driver = webdriver.Chrome(service=service) +driver.maximize_window() + +driver.get('http://www.target.com/') + +driver.find_element(By.XPATH, "//span[@class='styles__LinkText-sc-1e1g60c-3 dZfgoT h-margin-r-x3']").click() + +driver.find_element(By.XPATH, "//*[@id='listaccountNav-signIn']/a/span").click() +sleep(6) +actual_text = driver.find_element(By.XPATH, "//*[@id='__next']/div/div/div/div[1]/div/h1/span").text +#Sign in button +driver.find_element(By.XPATH, "//button[@type='submit']") + +print('Test case passed') + +driver.quit() \ No newline at end of file diff --git a/features/__init__.py b/features/__init__.py index e69de29bb..57982fd8c 100755 --- a/features/__init__.py +++ b/features/__init__.py @@ -0,0 +1,25 @@ +from selenium import webdriver +from selenium.webdriver.common.by import By +from selenium.webdriver.chrome.service import Service +from webdriver_manager.chrome import ChromeDriverManager +from time import sleep + +# get the path to the ChromeDriver executable +driver_path = ChromeDriverManager().install() + +# create a new Chrome browser instance +service = Service(driver_path) +driver = webdriver.Chrome(service=service) +driver.maximize_window() + +driver.get('http://www.target.com/') + +driver.find_element(By.XPATH, "//span[@class='styles__LinkText-sc-1e1g60c-3 dZfgoT h-margin-r-x3']").click() + +driver.find_element(By.XPATH, "//*[@id='listaccountNav-signIn']/a/span").click() +sleep(6) +actual_text = driver.find_element(By.XPATH, "//*[@id='__next']/div/div/div/div[1]/div/h1/span").text +#Sign in button +driver.find_element(By.XPATH, "//button[@type='submit']") + +driver.quit() \ No newline at end of file diff --git a/features/tests/__init__.py b/features/tests/__init__.py index e69de29bb..4f7f0f253 100755 --- a/features/tests/__init__.py +++ b/features/tests/__init__.py @@ -0,0 +1,24 @@ +from selenium import webdriver +from selenium.webdriver.common.by import By +from selenium.webdriver.chrome.service import Service +from webdriver_manager.chrome import ChromeDriverManager +from time import sleep + +# get the path to the ChromeDriver executable +driver_path = ChromeDriverManager().install() + +# create a new Chrome browser instance +service = Service(driver_path) +driver = webdriver.Chrome(service=service) +driver.maximize_window() + +driver.get('http://www.target.com/') + +driver.find_element(By.XPATH, "//span[@class='styles__LinkText-sc-1e1g60c-3 dZfgoT h-margin-r-x3']").click() + +driver.find_element(By.XPATH, "//*[@id='listaccountNav-signIn']/a/span").click() +sleep(6) +actual_text = driver.find_element(By.XPATH, "//*[@id='__next']/div/div/div/div[1]/div/h1/span").text +#Sign in button +driver.find_element(By.XPATH, "//button[@type='submit']") +driver.quit() \ No newline at end of file diff --git a/locator.py b/locator.py new file mode 100644 index 000000000..ef228564a --- /dev/null +++ b/locator.py @@ -0,0 +1,34 @@ +from selenium import webdriver +from selenium.webdriver.common.by import By +from selenium.webdriver.chrome.service import Service +from webdriver_manager.chrome import ChromeDriverManager +from time import sleep + +# get the path to the ChromeDriver executable +driver_path = ChromeDriverManager().install() + +# create a new Chrome browser instance +service = Service(driver_path) +driver = webdriver.Chrome(service=service) +driver.maximize_window() + +# open the url +driver.get('https://www.amazon.com/') +#Amazon logo +driver.find_element(By.XPATH, "//i[@aria-label='Amazon']") + +#Email field +driver.find_element(By.XPATH, "//input[@id='ap_email']") + +# Continue button +driver.find_element(By.XPATH, "//input[@id='continue']") +#Conditions of use link and Privacy Notice link +driver.find_element(By.XPATH, "//*[@id='legalTextRow']/a[1]" and "//*[@id='legalTextRow']/a[2]") +#Need help link +driver.find_element(By.XPATH, "//span[@class='a-expander-prompt']") +#FYI I don't have "Forgot your password link and Other issue with Sign-in link" + +#Create your Amazon account button +driver.find_element(By.XPATH, "//a[@id='createAccountSubmit']") + + From d35850b7ce9b368d91540ef0632a9d405f70dcc2 Mon Sep 17 00:00:00 2001 From: Tuychi M Date: Thu, 28 Mar 2024 21:07:54 -0400 Subject: [PATCH 03/12] First commit --- sample_script.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sample_script.py b/sample_script.py index 3e276743f..f9d301e54 100755 --- a/sample_script.py +++ b/sample_script.py @@ -13,12 +13,12 @@ driver.maximize_window() # open the url -driver.get('https://www.google.com/') +driver.get('https://www.target.com/') # populate search field search = driver.find_element(By.NAME, 'q') search.clear() -search.send_keys('table') +search.send_keys('') # wait for 4 sec sleep(4) From 01c40f47a5d9c26a6e40e3d6a369810b84ef7636 Mon Sep 17 00:00:00 2001 From: Tuychi M Date: Mon, 1 Apr 2024 21:33:34 -0400 Subject: [PATCH 04/12] Add new test cases file --- features/steps/Sign_In_test_steps.py | 29 +++++++++++++++++++++++++ features/steps/target_cart_steps.py | 16 ++++++++++++++ features/tests/sign_in_test.feature | 9 ++++++++ features/tests/target_cart_test.feature | 9 ++++++++ 4 files changed, 63 insertions(+) create mode 100644 features/steps/Sign_In_test_steps.py create mode 100644 features/steps/target_cart_steps.py create mode 100644 features/tests/sign_in_test.feature create mode 100644 features/tests/target_cart_test.feature diff --git a/features/steps/Sign_In_test_steps.py b/features/steps/Sign_In_test_steps.py new file mode 100644 index 000000000..829ce5db8 --- /dev/null +++ b/features/steps/Sign_In_test_steps.py @@ -0,0 +1,29 @@ +from selenium.webdriver.common.by import By +from behave import given, when, then +from time import sleep + + +@given('Open Target.com') +def open_target(context): + context.driver.get("https://www.target.com/") + sleep(2) + + +@when('Click Sign In button') +def click_sign_in_button(context): + sign_in_button = context.driver.find_element(By.CSS_SELECTOR, "[data-test='@web/AccountLink']") + sign_in_button.click() + sleep(2) + + +@when('Click on the Sign In link from the right side navigation menu') +def click_sign_in_link(context): + sign_in_link = context.driver.find_element(By.CSS_SELECTOR, ".styles__ListItemText-sc-diphzn-1") + sign_in_link.click() + sleep(2) + + +@then('Verify Sign In form opened') +def verify_sign_in_form_opened(context): + sign_in_form = context.driver.find_element(By.CSS_SELECTOR, ".styles__StyledHeading-sc-1xmf98v-0") + assert sign_in_form.is_displayed(), "Sign In form is not displayed" \ No newline at end of file diff --git a/features/steps/target_cart_steps.py b/features/steps/target_cart_steps.py new file mode 100644 index 000000000..19b143dd6 --- /dev/null +++ b/features/steps/target_cart_steps.py @@ -0,0 +1,16 @@ +from selenium.webdriver.common.by import By +from behave import given, when, then +from time import sleep + +@given('Open Target main page') +def open_target(context): + context.driver.get('http://www.target.com/') + +@when('Click on the Cart icon') +def click_cart_icon(context): + context.driver.find_element(By.CSS_SELECTOR, ".styles__CartIconDiv-sc-jff2tp-1").click() + sleep(2) + +@then('Verify “Your cart is empty” message is shown') +def verify_cart_is_empty(context): + assert context.driver, f'The cart is not empty' diff --git a/features/tests/sign_in_test.feature b/features/tests/sign_in_test.feature new file mode 100644 index 000000000..df73621d0 --- /dev/null +++ b/features/tests/sign_in_test.feature @@ -0,0 +1,9 @@ +# Created by Aiza at 3/31/2024 +Feature: Test sign In navigation + + + Scenario: Sign In navigation + Given Open Target.com + When Click Sign In button + When Click on the Sign In link from the right side navigation menu + Then Verify Sign In form opened \ No newline at end of file diff --git a/features/tests/target_cart_test.feature b/features/tests/target_cart_test.feature new file mode 100644 index 000000000..6c13d272a --- /dev/null +++ b/features/tests/target_cart_test.feature @@ -0,0 +1,9 @@ +# Created by Aiza at 3/31/2024 +Feature: Verify empty cart message on Target.com + + + Scenario: Verify "Your cart is empty" message when clicking on the cart icon + Given Open Target main page + When Click on the Cart icon + Then Verify “Your cart is empty” message is shown + From f661c1286531c72addf158e2ccf081bedef645ca Mon Sep 17 00:00:00 2001 From: Tuychi M Date: Mon, 1 Apr 2024 22:10:45 -0400 Subject: [PATCH 05/12] Add test cases --- locator.py | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/locator.py b/locator.py index ef228564a..afdbdd07b 100644 --- a/locator.py +++ b/locator.py @@ -15,20 +15,23 @@ # open the url driver.get('https://www.amazon.com/') #Amazon logo -driver.find_element(By.XPATH, "//i[@aria-label='Amazon']") - -#Email field -driver.find_element(By.XPATH, "//input[@id='ap_email']") - -# Continue button -driver.find_element(By.XPATH, "//input[@id='continue']") -#Conditions of use link and Privacy Notice link -driver.find_element(By.XPATH, "//*[@id='legalTextRow']/a[1]" and "//*[@id='legalTextRow']/a[2]") -#Need help link -driver.find_element(By.XPATH, "//span[@class='a-expander-prompt']") +driver.find_element(By.CSS_SELECTOR, "i.a-icon-logo") +#Create account text +driver.find_element(By.CSS_SELECTOR, "h1.a-spacing-small") +# Your name section +driver.find_element(By.CSS_SELECTOR, "#ap_customer_name") +#Email section +driver.find_element(By.CSS_SELECTOR, "input#ap_email") +#Password +driver.find_element(By.CSS_SELECTOR, "#ap_password") #FYI I don't have "Forgot your password link and Other issue with Sign-in link" - -#Create your Amazon account button -driver.find_element(By.XPATH, "//a[@id='createAccountSubmit']") - - +#Re-enter password +driver.find_element(By.CSS_SELECTOR, "#ap_password_check") +#Continue button +driver.find_element(By.CSS_SELECTOR, "[type=submit]") +#Conditions of Use +driver.find_element(By.CSS_SELECTOR, "a[href*=ap_register_notification_condition_of_use]") +#Policy +driver.find_element(By.CSS_SELECTOR,"a[href*=ap_register_notification_privacy_notice]") +#Sing in +driver.find_element(By.CSS_SELECTOR,".a-link-emphasis") From 78715331c3167dbfa50dc59bda5724f631ed6f17 Mon Sep 17 00:00:00 2001 From: Tuychi M Date: Wed, 10 Apr 2024 22:28:32 -0400 Subject: [PATCH 06/12] add commit --- features/Images/__init__.py | 0 features/Images/alfredo_pasta.jpg | Bin 0 -> 55565 bytes features/{steps => Images}/product_search.py | 0 features/Index.html | 45 +++++++++++++++++++ features/steps/Sign_In_test_steps.py | 29 ------------ features/steps/cart_page_steps.py | 0 features/steps/main_page_steps.py | 0 features/steps/search_results_page_steps.py | 0 features/steps/target_cart_steps.py | 16 ------- features/tests/cart_tests.feature | 6 +++ features/tests/product_search.feature | 7 --- features/tests/sign_in_test.feature | 9 ---- features/tests/target_cart_test.feature | 9 ---- features/tests/target_search.feature | 6 +++ 14 files changed, 57 insertions(+), 70 deletions(-) create mode 100644 features/Images/__init__.py create mode 100644 features/Images/alfredo_pasta.jpg rename features/{steps => Images}/product_search.py (100%) mode change 100755 => 100644 create mode 100644 features/Index.html delete mode 100644 features/steps/Sign_In_test_steps.py create mode 100644 features/steps/cart_page_steps.py create mode 100644 features/steps/main_page_steps.py create mode 100644 features/steps/search_results_page_steps.py delete mode 100644 features/steps/target_cart_steps.py create mode 100644 features/tests/cart_tests.feature delete mode 100755 features/tests/product_search.feature delete mode 100644 features/tests/sign_in_test.feature delete mode 100644 features/tests/target_cart_test.feature create mode 100644 features/tests/target_search.feature diff --git a/features/Images/__init__.py b/features/Images/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/features/Images/alfredo_pasta.jpg b/features/Images/alfredo_pasta.jpg new file mode 100644 index 0000000000000000000000000000000000000000..163b3bd9b2d0b24627f7485fda0e0d4cf8dc2f09 GIT binary patch literal 55565 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 literal 0 HcmV?d00001 diff --git a/features/steps/product_search.py b/features/Images/product_search.py old mode 100755 new mode 100644 similarity index 100% rename from features/steps/product_search.py rename to features/Images/product_search.py diff --git a/features/Index.html b/features/Index.html new file mode 100644 index 000000000..444bfb052 --- /dev/null +++ b/features/Index.html @@ -0,0 +1,45 @@ + + + + + My Homepage + + +
+

How to cook Chicken Alfredo Pasta

+

Ingredients:

+ + alfredo_pasta + +
+
+
  • Fettuccine: This recipe calls for a half pound of pasta and serves four people. Fettuccine is the most classic, but you can use whichever pasta shape you prefer.
  • +
  • Heavy cream: Though some recipes exclude heavy cream, we think it makes for the most reliable and dreamy Alfredo sauce.
  • +
  • Chicken breasts: Sear the chicken in a skillet, then make the sauce. Any leftover browned bitson the bottom of the pan from the chicken will help to make the sauce more flavorful.
  • +
  • Butter: We call for European-style butter here for its slightly higher fat content, but if you’ve got the plain stuff on hand already, use it.
  • +
    + + + +
    +

    Instructions:

    +
    + + + +
    + + +
    +
  • Boil the pasta in a large pot of salted water. Get this going before you start cooking the chicken and you can add the dried pasta right around the same time you start cooking the chicken breast. Save a cup of the pasta water to thin the sauce if needed.
  • +
  • Cook the chicken breasts in a combination of oil and butter for golden crispness. This is our favorite golden, crispy chicken technique. You can cover the chicken breasts with foil while you finish the sauce to keep them warm.
  • +
  • Pasta is ready, chicken is ready, make your sauce. Once your pasta is cooked and drained, and your chicken is cooked and sliced, the actual Alfredo sauce takes just a few minutes to make in the same skillet you cooked the chicken in.
  • +
  • Toss it all in the sauce skillet. When the sauce is nice and thick, add the pasta and a splash of pasta water and toss to coat. You can add the chicken here as well, if desired. Serve immediately.
  • + +
    + + + + \ No newline at end of file diff --git a/features/steps/Sign_In_test_steps.py b/features/steps/Sign_In_test_steps.py deleted file mode 100644 index 829ce5db8..000000000 --- a/features/steps/Sign_In_test_steps.py +++ /dev/null @@ -1,29 +0,0 @@ -from selenium.webdriver.common.by import By -from behave import given, when, then -from time import sleep - - -@given('Open Target.com') -def open_target(context): - context.driver.get("https://www.target.com/") - sleep(2) - - -@when('Click Sign In button') -def click_sign_in_button(context): - sign_in_button = context.driver.find_element(By.CSS_SELECTOR, "[data-test='@web/AccountLink']") - sign_in_button.click() - sleep(2) - - -@when('Click on the Sign In link from the right side navigation menu') -def click_sign_in_link(context): - sign_in_link = context.driver.find_element(By.CSS_SELECTOR, ".styles__ListItemText-sc-diphzn-1") - sign_in_link.click() - sleep(2) - - -@then('Verify Sign In form opened') -def verify_sign_in_form_opened(context): - sign_in_form = context.driver.find_element(By.CSS_SELECTOR, ".styles__StyledHeading-sc-1xmf98v-0") - assert sign_in_form.is_displayed(), "Sign In form is not displayed" \ No newline at end of file diff --git a/features/steps/cart_page_steps.py b/features/steps/cart_page_steps.py new file mode 100644 index 000000000..e69de29bb diff --git a/features/steps/main_page_steps.py b/features/steps/main_page_steps.py new file mode 100644 index 000000000..e69de29bb diff --git a/features/steps/search_results_page_steps.py b/features/steps/search_results_page_steps.py new file mode 100644 index 000000000..e69de29bb diff --git a/features/steps/target_cart_steps.py b/features/steps/target_cart_steps.py deleted file mode 100644 index 19b143dd6..000000000 --- a/features/steps/target_cart_steps.py +++ /dev/null @@ -1,16 +0,0 @@ -from selenium.webdriver.common.by import By -from behave import given, when, then -from time import sleep - -@given('Open Target main page') -def open_target(context): - context.driver.get('http://www.target.com/') - -@when('Click on the Cart icon') -def click_cart_icon(context): - context.driver.find_element(By.CSS_SELECTOR, ".styles__CartIconDiv-sc-jff2tp-1").click() - sleep(2) - -@then('Verify “Your cart is empty” message is shown') -def verify_cart_is_empty(context): - assert context.driver, f'The cart is not empty' diff --git a/features/tests/cart_tests.feature b/features/tests/cart_tests.feature new file mode 100644 index 000000000..305d46b19 --- /dev/null +++ b/features/tests/cart_tests.feature @@ -0,0 +1,6 @@ +# Created by Aiza at 4/9/2024 +Feature: # Enter feature name here + # Enter feature description here + + Scenario: # Enter scenario name here + # Enter steps here \ No newline at end of file diff --git a/features/tests/product_search.feature b/features/tests/product_search.feature deleted file mode 100755 index 36d6913cf..000000000 --- a/features/tests/product_search.feature +++ /dev/null @@ -1,7 +0,0 @@ -Feature: Test Scenarios for Search functionality - - Scenario: User can search for a product - Given Open Google page - When Input Car into search field - And Click on search icon - Then Product results for Car are shown \ No newline at end of file diff --git a/features/tests/sign_in_test.feature b/features/tests/sign_in_test.feature deleted file mode 100644 index df73621d0..000000000 --- a/features/tests/sign_in_test.feature +++ /dev/null @@ -1,9 +0,0 @@ -# Created by Aiza at 3/31/2024 -Feature: Test sign In navigation - - - Scenario: Sign In navigation - Given Open Target.com - When Click Sign In button - When Click on the Sign In link from the right side navigation menu - Then Verify Sign In form opened \ No newline at end of file diff --git a/features/tests/target_cart_test.feature b/features/tests/target_cart_test.feature deleted file mode 100644 index 6c13d272a..000000000 --- a/features/tests/target_cart_test.feature +++ /dev/null @@ -1,9 +0,0 @@ -# Created by Aiza at 3/31/2024 -Feature: Verify empty cart message on Target.com - - - Scenario: Verify "Your cart is empty" message when clicking on the cart icon - Given Open Target main page - When Click on the Cart icon - Then Verify “Your cart is empty” message is shown - diff --git a/features/tests/target_search.feature b/features/tests/target_search.feature new file mode 100644 index 000000000..305d46b19 --- /dev/null +++ b/features/tests/target_search.feature @@ -0,0 +1,6 @@ +# Created by Aiza at 4/9/2024 +Feature: # Enter feature name here + # Enter feature description here + + Scenario: # Enter scenario name here + # Enter steps here \ No newline at end of file From 097ed8efd13ce4b19ce2b59f34b0d1752e924650 Mon Sep 17 00:00:00 2001 From: Tuychi M Date: Wed, 10 Apr 2024 23:05:49 -0400 Subject: [PATCH 07/12] updating file --- {features => html_test}/Index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename {features => html_test}/Index.html (94%) diff --git a/features/Index.html b/html_test/Index.html similarity index 94% rename from features/Index.html rename to html_test/Index.html index 444bfb052..96fa83813 100644 --- a/features/Index.html +++ b/html_test/Index.html @@ -9,7 +9,7 @@

    How to cook Chicken Alfredo Pasta

    Ingredients:

    - alfredo_pasta
    Date: Thu, 11 Apr 2024 19:55:01 -0400 Subject: [PATCH 08/12] updated Target product search --- features/Images/alfredo_pasta.jpg | Bin 55565 -> 34079 bytes features/steps/cart_page_steps.py | 12 +++++++++ features/steps/main_page_steps.py | 25 +++++++++++++++++ features/steps/search_results_page_steps.py | 11 ++++++++ features/tests/cart_tests.feature | 10 +++---- features/tests/target_search.feature | 28 ++++++++++++++++---- 6 files changed, 76 insertions(+), 10 deletions(-) diff --git a/features/Images/alfredo_pasta.jpg b/features/Images/alfredo_pasta.jpg index 163b3bd9b2d0b24627f7485fda0e0d4cf8dc2f09..6b7aa7dd34e5590ca77b8d45778df94f4963b989 100644 GIT binary patch delta 33735 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
      0W1g%|~+*nyc z42<%C6c9T86p3(GbdnWQ(~-@4GN#_=A3AEt@xKgc$)R5A7V@jD$zX0+ocV=@aK7C+ z>t2dp;!QT%IOEv}!Hti6cB)<})b!}4^9g}wVlqzzQNk*UbXdTp$*Y7v{1&O_rJ#a)O>*&(n%ASkJ+e^Iw-8`Gqrep66*gIGvqwp+GX zq&xx6&s=(Dy$3XE>b4nL!*ou--DWq3k8q?m!%Hnunm*!VIlx*jL=x{Sp zr;YqoeXMs*D7Tf}5Xy2?0(v*KKUCLsFAqlwS^%-j z6Dt>wCviE*Z^!hmR^`vhb3d%Y*RfN@`ktYyUzxQz+G$4^=%eTbU}_fY_D}%%Td1gR zwJGjyH_MH#Hn_(F)ra$~Xjjb(V+#4GxCr<=f1mKJlw}C>NtGN-CnXd|;TYa6X4#Zs zRN;yAH6D`<{nv^w5yownW2?aE{3wkG0B@19hl`VD);Mr23y?GY8#) z+pncI+HmAycP2>Bp%m#Q5hhLu#~@W0oA-At&9`~^RC-sU-lqahq1w%&-B`#Gwzff5 z10`Cxa~X*?9r8+}<_&<@2a$D!Vi{k4O402xDs)AP%1JHUlD~lOL z%_^}sp;1NhGlIAfHloXEa0iy*nNhi3`x?4^CVmBS@LO5Ll3Z!&3oXVBuMqppKZuds zbH!V+xOgWyB=MC@4s+6?ja4O~rAT%?Cr^}Q6N=ns6I+eHcyu+x==Y{*k)%dOe?P)& zrn9?H!ATpBYVM0tR%a_sJCrA$;@0G`EL*rVk@$(@Y)+XSjw^P1B)x|u{`0e9xy?er z!o%$gf$9eaybNv|6^CwAUWaWd)2OW_sjqFQn~QzXa;?Wbs{O-}YS6|>m5}lePkQDJ z{k5yckPO5|9fxYrwUozrvJ<#te;s&ci=m*4*Y40Tka98E50=-KDmKbbDBF5_l-L`1(pe+z;K8RD}1 zNd~KFdb7-4>d3zLP)e(PanRSRTxoW*C!1ztF`kVX1b&rwNs0%CTPdQA%LBK1@ZbG< z?xC3bO4du{&NqNm>07GmXM8c!<~9vvf6CZ@W1i5c2 zHaXz8bK1RnaQ1P$ADPKIn%bf6dasGC+Um?Kv3W&ZoSr}cXF2ratz&pQSkydE;kDH6 z{>>UqGYE`iji?D3B=Aoa;98fA?@o_IO56f7YLY{vlm|VZ)-| zJPL?BxMfAaTsMEOujgGJ+UuG|a9+|@f!%n5!W;cu+rxGvM>z$P?>0#5_*Z?Q_{| z+SZ8LU{(pnfHNPfrmvFk&s_WFK65;=Lvv4hs@4ubeXuQZGZ;n&o^=s9ZJHVJt(PqZ}_4+_4f? zQ{3f-3LM^@+(2MLh5BiE5ly)6=*`yTCWe>3ge!9JNiezj$=QA00N$WI*v;F@m#gmqPA88RJ*#8Xs)K+ ze+FY9#U3-X`wUmK-|2SRow!Su%VQ|rHn(H-t^)f{StORjRJDzkENu<*XVHh@UUgb7 zgXUW^uAN0uS?)i>+M--Wj~jxdaBH&D<TGjzyV^UMw;mh<<9tC%H{Jwxs4gsIwgY0FqoDMzvf6m=BUg=sDIKY|mg_8M zX!)y)6_wMgA8AW+;ftJKEY2bBp}K+WZ`E2C1#sT=<(@P6ad8Vg`ZzZ>F*DyxLKD|G65P`$aSoL|Dv4F3S6vD5^S zOwM9R91)%}Nfp)WnpFBF;?A~jbRD+sLI8|^eCP75i(e3;%92S7F5cjC`O@lo!fH%$ zCzsGJ{1fk8bk-hCPn+Jk6=zkue_KP%Zv1Uyqw2HAIwM_5zEkZubyMl|&TGy*RGL-x zykybZV-buiODcsfMtcl)!2B!Iyif4b(_XlHs3�m4Im%JfCnYp1Sy7tXi@gSs}UF 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 Hgn$3pT$2FG delta 55390 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 diff --git a/features/steps/cart_page_steps.py b/features/steps/cart_page_steps.py index e69de29bb..dba982c0b 100644 --- a/features/steps/cart_page_steps.py +++ b/features/steps/cart_page_steps.py @@ -0,0 +1,12 @@ +from selenium.webdriver.common.by import By +from behave import then + +CART_EMPTY_MSG = (By.CSS_SELECTOR, "h1[class*='StyledHeading']") + + +@then("Verify 'Your cart is empty' message is shown") +def verify_cart_empty_message(context): + actual_text = context.driver.find_element(*CART_EMPTY_MSG).text + expected_text = 'Your cart is empty' + assert expected_text == actual_text, f'Expected {expected_text}, but got {actual_text}' + # context.driver.find_element(By.XPATH, "//h1[text()='Your cart is empty']") \ No newline at end of file diff --git a/features/steps/main_page_steps.py b/features/steps/main_page_steps.py index e69de29bb..f184fb22c 100644 --- a/features/steps/main_page_steps.py +++ b/features/steps/main_page_steps.py @@ -0,0 +1,25 @@ +from selenium.webdriver.common.by import By +from behave import given, when +from time import sleep + + +SEARCH_INPUT = (By.ID, 'search') +SEARCH_BTN = (By.XPATH,"//button[@data-test='@web/Search/SearchButton']") +CART_ICON = (By.CSS_SELECTOR, "[data-test='@web/cartLink']") + + +@given('Open Target main page') +def open_target(context): + context.driver.get('https://www.target.com/') + + +@when("Search for '{item}'") +def search_product(context, item): + context.driver.find_element(*SEARCH_INPUT).send_keys(item) + context.driver.find_element(*SEARCH_BTN).click() + sleep(6) + + +@when('Click on Cart icon') +def click_cart(context): + context.driver.find_element(*CART_ICON).click() \ No newline at end of file diff --git a/features/steps/search_results_page_steps.py b/features/steps/search_results_page_steps.py index e69de29bb..7eb3c7315 100644 --- a/features/steps/search_results_page_steps.py +++ b/features/steps/search_results_page_steps.py @@ -0,0 +1,11 @@ +from selenium.webdriver.common.by import By +from behave import then + + +SEARCH_RESULTS_HEADER = (By.XPATH, "//div[@data-test='resultsHeading']") + + +@then('Verify search results are shown for {expected_item}') +def verify_search_results(context, expected_item): + actual_text = context.driver.find_element(*SEARCH_RESULTS_HEADER).text + assert expected_item in actual_text, f'Error! Text {expected_item} not in {actual_text}' \ No newline at end of file diff --git a/features/tests/cart_tests.feature b/features/tests/cart_tests.feature index 305d46b19..7fccff614 100644 --- a/features/tests/cart_tests.feature +++ b/features/tests/cart_tests.feature @@ -1,6 +1,6 @@ -# Created by Aiza at 4/9/2024 -Feature: # Enter feature name here - # Enter feature description here +Feature: Cart tests - Scenario: # Enter scenario name here - # Enter steps here \ No newline at end of file + Scenario: 'Your cart is empty' message is shown + Given Open Target main page + When Click on Cart icon + Then Verify 'Your cart is empty' message is shown \ No newline at end of file diff --git a/features/tests/target_search.feature b/features/tests/target_search.feature index 305d46b19..573b11740 100644 --- a/features/tests/target_search.feature +++ b/features/tests/target_search.feature @@ -1,6 +1,24 @@ -# Created by Aiza at 4/9/2024 -Feature: # Enter feature name here - # Enter feature description here +Feature: Search test - Scenario: # Enter scenario name here - # Enter steps here \ No newline at end of file + + Scenario: User can search for a product + Given Open Target main page + When Search for 'coffee' + Then Verify search results are shown for coffee + + Scenario: Scenario: User can search for tea + Given Open Target main page + When Search for 'tea' + Then Verify search results are shown for tea + + + Scenario Outline: User can search for a product + Given Open Target main page + When Search for '' + Then Verify search results are shown for + Examples: + | item | expected_item | + | mug | mug | + | tea | tea | + | spoon | spoon | + | sugar | sugar | \ No newline at end of file From d3193a8c16c29990c3beffcb8d7751842f68e5be Mon Sep 17 00:00:00 2001 From: Tuychi M Date: Wed, 17 Apr 2024 22:26:24 -0400 Subject: [PATCH 09/12] lesson 4 --- Target test case.py | 27 ---------- features/Images/alfredo_pasta.jpg | Bin 34079 -> 0 bytes features/steps/add_target_product_steps.py | 55 ++++++++++++++++++++ features/steps/cart_page_steps.py | 12 ----- features/steps/main_page_steps.py | 25 --------- features/steps/search_results_page_steps.py | 11 ---- features/steps/target_circle_steps.py | 17 ++++++ features/steps/target_search.py | 29 +++++++++++ features/tests/add_target_product.feature | 13 +++++ features/tests/cart_tests.feature | 6 --- features/tests/target_circle.feature | 7 +++ features/tests/target_search.feature | 24 --------- locator.py | 37 ------------- 13 files changed, 121 insertions(+), 142 deletions(-) delete mode 100644 Target test case.py delete mode 100644 features/Images/alfredo_pasta.jpg create mode 100644 features/steps/add_target_product_steps.py delete mode 100644 features/steps/cart_page_steps.py delete mode 100644 features/steps/main_page_steps.py delete mode 100644 features/steps/search_results_page_steps.py create mode 100644 features/steps/target_circle_steps.py create mode 100644 features/steps/target_search.py create mode 100644 features/tests/add_target_product.feature delete mode 100644 features/tests/cart_tests.feature create mode 100644 features/tests/target_circle.feature delete mode 100644 features/tests/target_search.feature delete mode 100644 locator.py diff --git a/Target test case.py b/Target test case.py deleted file mode 100644 index 571b4003a..000000000 --- a/Target test case.py +++ /dev/null @@ -1,27 +0,0 @@ -from selenium import webdriver -from selenium.webdriver.common.by import By -from selenium.webdriver.chrome.service import Service -from webdriver_manager.chrome import ChromeDriverManager -from time import sleep - -# get the path to the ChromeDriver executable -driver_path = ChromeDriverManager().install() - -# create a new Chrome browser instance -service = Service(driver_path) -driver = webdriver.Chrome(service=service) -driver.maximize_window() - -driver.get('http://www.target.com/') - -driver.find_element(By.XPATH, "//span[@class='styles__LinkText-sc-1e1g60c-3 dZfgoT h-margin-r-x3']").click() - -driver.find_element(By.XPATH, "//*[@id='listaccountNav-signIn']/a/span").click() -sleep(6) -actual_text = driver.find_element(By.XPATH, "//*[@id='__next']/div/div/div/div[1]/div/h1/span").text -#Sign in button -driver.find_element(By.XPATH, "//button[@type='submit']") - -print('Test case passed') - -driver.quit() \ No newline at end of file diff --git a/features/Images/alfredo_pasta.jpg b/features/Images/alfredo_pasta.jpg deleted file mode 100644 index 6b7aa7dd34e5590ca77b8d45778df94f4963b989..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34079 zcmbT7Wl$Ya)8{Y2-QAtw?(Py?F7EE`5JG~xlZyv;y|@H-2wdFV?LvT{dGqXUy<4@P zcK1xpr#Us%zd2{R>)+ky@5r;NTJ9;Sdnu5fBj( zkWjEtP>_*P@GvmZun6&phzRir2uR53DM?6a$p{FjSgB|k7(X(9B&KBJWMkr_XZpzW zpO?TOA|j$7q2QvR;4+aAkTCr}kH0?w*hnybFs!gJG=LA-FtFG#e}@2+000d9KWqPE z@c$YxA7KC4i-?4bg8FX)7z^+L1{U@M94tIM9NfRzA^)BO;IQFwsJWyNa5XIuX*}?_ zzoZl)(MmV=<7>^`(D7J$h9jd85E2oS&@(VHePrh4;};MV5|)vblUGnwQr6bd)dT7q z7+P7|*xK1UIC^>e`1<(=1b+P%5g8R76Pucro{^cA{T=k9xTLhKyrQzIsksH*+ScCD zIWRahJTf{qJ~0njSX^3OSzX)R+dnuwIzBl)gWlf#zJGZ9^Yr{5E*Jpp|HS%lvj2k% z`ybZ_I5=21#Q$)?eDM2s!(zk1Q*$BUNNFNkc;M1-e?h{NPAO{aN2cY`y1}>foI@d? z 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 0, "No cells are shown on the page" + sleep(6) diff --git a/features/steps/target_search.py b/features/steps/target_search.py new file mode 100644 index 000000000..7f5e6d96d --- /dev/null +++ b/features/steps/target_search.py @@ -0,0 +1,29 @@ +from selenium import webdriver +from selenium.webdriver.common.by import By +from selenium.webdriver.chrome.service import Service +from webdriver_manager.chrome import ChromeDriverManager +from time import sleep + + +driver_path = ChromeDriverManager().install() + + +service = Service(driver_path) +driver = webdriver.Chrome(service=service) +driver.maximize_window() + + +driver.get('https://www.target.com/') + + +driver.find_element(By.ID, 'search').send_keys('bicycle') + +driver.find_element(By.XPATH, "//button[@data-test='@web/Search/SearchButton']").click() + +sleep(6) + + +actual_text = driver.find_element(By.XPATH, "//div[@data-test='resultsHeading']").text +assert 'coffee' in actual_text, f'Error! Text coffee not in {actual_text}' + +driver.quit() diff --git a/features/tests/add_target_product.feature b/features/tests/add_target_product.feature new file mode 100644 index 000000000..767dfdaf1 --- /dev/null +++ b/features/tests/add_target_product.feature @@ -0,0 +1,13 @@ +Feature: Add Product + + Scenario: User can add a product to cart + Given Open Target main page + When Search for mug + And Click on Add to Cart button + And Confirm Add to Cart button from side navigation + And Open cart page + Then Verify cart has 1 item(s) + And Verify cart has correct product + + + diff --git a/features/tests/cart_tests.feature b/features/tests/cart_tests.feature deleted file mode 100644 index 7fccff614..000000000 --- a/features/tests/cart_tests.feature +++ /dev/null @@ -1,6 +0,0 @@ -Feature: Cart tests - - Scenario: 'Your cart is empty' message is shown - Given Open Target main page - When Click on Cart icon - Then Verify 'Your cart is empty' message is shown \ No newline at end of file diff --git a/features/tests/target_circle.feature b/features/tests/target_circle.feature new file mode 100644 index 000000000..2ef5384d0 --- /dev/null +++ b/features/tests/target_circle.feature @@ -0,0 +1,7 @@ +Feature: Target Circle Page Verification + + + Scenario: Verify the benefits cells are shown + Given Open Target Circle page + Then Verify there are cells shown + diff --git a/features/tests/target_search.feature b/features/tests/target_search.feature deleted file mode 100644 index 573b11740..000000000 --- a/features/tests/target_search.feature +++ /dev/null @@ -1,24 +0,0 @@ -Feature: Search test - - - Scenario: User can search for a product - Given Open Target main page - When Search for 'coffee' - Then Verify search results are shown for coffee - - Scenario: Scenario: User can search for tea - Given Open Target main page - When Search for 'tea' - Then Verify search results are shown for tea - - - Scenario Outline: User can search for a product - Given Open Target main page - When Search for '' - Then Verify search results are shown for - Examples: - | item | expected_item | - | mug | mug | - | tea | tea | - | spoon | spoon | - | sugar | sugar | \ No newline at end of file diff --git a/locator.py b/locator.py deleted file mode 100644 index afdbdd07b..000000000 --- a/locator.py +++ /dev/null @@ -1,37 +0,0 @@ -from selenium import webdriver -from selenium.webdriver.common.by import By -from selenium.webdriver.chrome.service import Service -from webdriver_manager.chrome import ChromeDriverManager -from time import sleep - -# get the path to the ChromeDriver executable -driver_path = ChromeDriverManager().install() - -# create a new Chrome browser instance -service = Service(driver_path) -driver = webdriver.Chrome(service=service) -driver.maximize_window() - -# open the url -driver.get('https://www.amazon.com/') -#Amazon logo -driver.find_element(By.CSS_SELECTOR, "i.a-icon-logo") -#Create account text -driver.find_element(By.CSS_SELECTOR, "h1.a-spacing-small") -# Your name section -driver.find_element(By.CSS_SELECTOR, "#ap_customer_name") -#Email section -driver.find_element(By.CSS_SELECTOR, "input#ap_email") -#Password -driver.find_element(By.CSS_SELECTOR, "#ap_password") -#FYI I don't have "Forgot your password link and Other issue with Sign-in link" -#Re-enter password -driver.find_element(By.CSS_SELECTOR, "#ap_password_check") -#Continue button -driver.find_element(By.CSS_SELECTOR, "[type=submit]") -#Conditions of Use -driver.find_element(By.CSS_SELECTOR, "a[href*=ap_register_notification_condition_of_use]") -#Policy -driver.find_element(By.CSS_SELECTOR,"a[href*=ap_register_notification_privacy_notice]") -#Sing in -driver.find_element(By.CSS_SELECTOR,".a-link-emphasis") From 36b37c769d678d5f5018e3cef17e936ac0c87f67 Mon Sep 17 00:00:00 2001 From: Tuychi M Date: Wed, 24 Apr 2024 19:58:16 -0400 Subject: [PATCH 10/12] Updated files --- {features/Images => app}/__init__.py | 0 app/application.py | 10 +++++ features/Images/product_search.py | 32 --------------- features/environment.py | 1 + features/steps/add_target_product_steps.py | 2 +- features/steps/main_page_steps.py | 40 ++++++++++++++++++ features/steps/product_details_page.py | 32 +++++++++++++++ features/steps/search_results_page_steps.py | 0 features/steps/target_search.py | 2 +- features/tests/cart_tests.feature | 30 ++++++++++++++ features/tests/product_details.feature | 5 +++ features/tests/target_search.feature | 20 +++++++++ html_test/Index.html | 45 --------------------- pages/__init__.py | 0 pages/base_page.py | 16 ++++++++ pages/header.py | 11 +++++ pages/main_page.py | 8 ++++ pages/search_results_page.py | 11 +++++ sample_script.py | 23 +++++++---- 19 files changed, 202 insertions(+), 86 deletions(-) rename {features/Images => app}/__init__.py (100%) create mode 100644 app/application.py delete mode 100644 features/Images/product_search.py create mode 100644 features/steps/main_page_steps.py create mode 100644 features/steps/product_details_page.py create mode 100644 features/steps/search_results_page_steps.py create mode 100644 features/tests/cart_tests.feature create mode 100644 features/tests/product_details.feature create mode 100644 features/tests/target_search.feature delete mode 100644 html_test/Index.html create mode 100644 pages/__init__.py create mode 100644 pages/base_page.py create mode 100644 pages/header.py create mode 100644 pages/main_page.py create mode 100644 pages/search_results_page.py diff --git a/features/Images/__init__.py b/app/__init__.py similarity index 100% rename from features/Images/__init__.py rename to app/__init__.py diff --git a/app/application.py b/app/application.py new file mode 100644 index 000000000..9ab67407c --- /dev/null +++ b/app/application.py @@ -0,0 +1,10 @@ +from pages.main_page import MainPage +from pages.header import Header +from pages.search_results_page import SearchResultsPage + + +class Application: + def __init__(self, driver): + self.main = MainPage(driver) + self.header = Header(driver) + self.search_results = SearchResultsPage(driver) \ No newline at end of file diff --git a/features/Images/product_search.py b/features/Images/product_search.py deleted file mode 100644 index 4e142cb40..000000000 --- a/features/Images/product_search.py +++ /dev/null @@ -1,32 +0,0 @@ -from selenium.webdriver.common.by import By -from behave import given, when, then -from time import sleep - - -SEARCH_INPUT = (By.NAME, 'q') -SEARCH_SUBMIT = (By.NAME, 'btnK') - - -@given('Open Google page') -def open_google(context): - context.driver.get('https://www.google.com/') - - -@when('Input {search_word} into search field') -def input_search(context, search_word): - search = context.driver.find_element(*SEARCH_INPUT) - search.clear() - search.send_keys(search_word) - sleep(4) - - -@when('Click on search icon') -def click_search_icon(context): - context.driver.find_element(*SEARCH_SUBMIT).click() - sleep(1) - - -@then('Product results for {search_word} are shown') -def verify_found_results_text(context, search_word): - assert search_word.lower() in context.driver.current_url.lower(), \ - f'Expected query not in {context.driver.current_url.lower()}' diff --git a/features/environment.py b/features/environment.py index 0930bc703..a51e48211 100755 --- a/features/environment.py +++ b/features/environment.py @@ -15,6 +15,7 @@ def browser_init(context): context.driver.maximize_window() context.driver.implicitly_wait(4) + context.wait = Application def before_scenario(context, scenario): diff --git a/features/steps/add_target_product_steps.py b/features/steps/add_target_product_steps.py index 0811cd723..195829b10 100644 --- a/features/steps/add_target_product_steps.py +++ b/features/steps/add_target_product_steps.py @@ -15,7 +15,7 @@ @given('Open Target main page') def open_target(context): - context.driver.get('https://www.target.com/') + context.driver.get('https://www.target.') @when("Search for {item}") diff --git a/features/steps/main_page_steps.py b/features/steps/main_page_steps.py new file mode 100644 index 000000000..bb1428598 --- /dev/null +++ b/features/steps/main_page_steps.py @@ -0,0 +1,40 @@ +from selenium.webdriver.common.by import By +from behave import given, when, then +from time import sleep + +SEARCH_FIELD = (By.ID, 'search') +SEARCH_ICON = (By.XPATH, "//button[@data-test='@web/Search/SearchButton']") +CART_ICON = (By.CSS_SELECTOR, "[data-test='@web/CartLink']") +HEADER = (By.CSS_SELECTOR, "[class*='UtilityHeaderWrapper']") +HEADER_LINKS = (By.CSS_SELECTOR, "[data-test*='@web/GlobalHeader/UtilityHeader']") + + +@given('Open Target main page') +def open_target_main(context): + context.driver.get('https://www.target.com/') + + +@when('Search for {product}') +def search_product(context, product): + context.driver.find_element(*SEARCH_FIELD).send_keys(product) + context.driver.find_element(*SEARCH_ICON).click() + sleep(6) + + +@when('Click on Cart icon') +def click_cart(context): + context.driver.find_element(*CART_ICON).click() + + +@then('Verify header in shown') +def verify_header(context): + # header = context.driver.find_element(*HEADER) + # print(header) + context.driver.find_element(*HEADER) + + +@then('Verify header has {expected_amount} links') +def verify_header_links(context, expected_amount): + expected_amount = int(expected_amount) + header_links = context.driver.find_elements(*HEADER_LINKS) + assert len(header_links) == expected_amount, f'Expected {expected_amount} links, but got {len(header_links)}' diff --git a/features/steps/product_details_page.py b/features/steps/product_details_page.py new file mode 100644 index 000000000..a0b14bf9d --- /dev/null +++ b/features/steps/product_details_page.py @@ -0,0 +1,32 @@ +from selenium.webdriver.common.by import By +from behave import given, then +from time import sleep + + +COLOR_OPTIONS = (By.CSS_SELECTOR, "[class*='ButtonWrapper'] img") +SELECTED_COLOR = (By.CSS_SELECTOR, "[class*='StyledVariationSelectorImage'] [class*='StyledHeaderWrapperDiv']") + + +@given('Open target product {product_id} page') +def open_target(context, product_id): + context.driver.get(f'https://www.target.com/p/{product_id}') + sleep(8) + + +@then('Verify user can click through colors') +def click_and_verify_colors(context): + expected_colors = ['Blue Tint', 'Denim Blue', 'Marine', 'Raven'] + actual_colors = [] + + colors = context.driver.find_elements(*COLOR_OPTIONS) # [webelement1, webelement2, webelement3] + for color in colors: + color.click() + + selected_color = context.driver.find_element(*SELECTED_COLOR).text # 'Color\nBlack' + print('Current color', selected_color) + + selected_color = selected_color.split('\n')[1] # remove 'Color\n' part, keep Black' + actual_colors.append(selected_color) + print(actual_colors) + + assert expected_colors == actual_colors, f'Expected {expected_colors} did not match actual {actual_colors}' \ No newline at end of file diff --git a/features/steps/search_results_page_steps.py b/features/steps/search_results_page_steps.py new file mode 100644 index 000000000..e69de29bb diff --git a/features/steps/target_search.py b/features/steps/target_search.py index 7f5e6d96d..466866e1e 100644 --- a/features/steps/target_search.py +++ b/features/steps/target_search.py @@ -24,6 +24,6 @@ actual_text = driver.find_element(By.XPATH, "//div[@data-test='resultsHeading']").text -assert 'coffee' in actual_text, f'Error! Text coffee not in {actual_text}' +assert 'bicycle' in actual_text, f'Error! Text coffee not in {actual_text}' driver.quit() diff --git a/features/tests/cart_tests.feature b/features/tests/cart_tests.feature new file mode 100644 index 000000000..9e32de2db --- /dev/null +++ b/features/tests/cart_tests.feature @@ -0,0 +1,30 @@ +Feature: Cart tests + + Scenario: 'Your cart is empty' message is shown for empty cart + Given Open target main page + When Click on Cart icon + Then Verify 'Your cart is empty' message is shown + + Scenario: User can add a product to cart + Given Open target main page + When Search for Lunar New Year M&M's + And Click on Add to Cart button + And Store product name + And Confirm Add to Cart button from side navigation + And Open cart page + Then Verify cart has 1 item(s) + And Verify cart has correct product + + Scenario: User can add different products to cart + Given Open target main page + When Search for Lunar New Year M&M's + And Click on Add to Cart button for product 1 + And Store product name to a list + And Confirm Add to Cart button from side navigation + And Close side navigation + And Click on Add to Cart button for product 2 + And Store product name to a list + And Confirm Add to Cart button from side navigation + And Open cart page + Then Verify cart has 2 item(s) + And Verify cart has correct multiple products \ No newline at end of file diff --git a/features/tests/product_details.feature b/features/tests/product_details.feature new file mode 100644 index 000000000..708c7a0e4 --- /dev/null +++ b/features/tests/product_details.feature @@ -0,0 +1,5 @@ +Feature: Tests for product page + + Scenario: User can select colors + Given Open target product A-54551690 page + Then Verify user can click through colors \ No newline at end of file diff --git a/features/tests/target_search.feature b/features/tests/target_search.feature new file mode 100644 index 000000000..b585110e1 --- /dev/null +++ b/features/tests/target_search.feature @@ -0,0 +1,20 @@ +Feature: Search tests + +Scenario: User can search for tea + Given Open Target main page + When Search for 'tea' + Then Verify search results are shown for tea + + + Scenario Outline: User can search for a product# Given Open Target main page + Given Open Target main page + When Search for '' + Then Verify search results are shown for + Examples: + | item | expected_item | + | mug | mug | + | tea | tea | + | spoon | spoon | + | sugar | sugar | + + Scenario Verify that user can see product \ No newline at end of file diff --git a/html_test/Index.html b/html_test/Index.html deleted file mode 100644 index 96fa83813..000000000 --- a/html_test/Index.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - My Homepage - - -
      -

      How to cook Chicken Alfredo Pasta

      -

      Ingredients:

      - - alfredo_pasta - -
      -
      -
    1. Fettuccine: This recipe calls for a half pound of pasta and serves four people. Fettuccine is the most classic, but you can use whichever pasta shape you prefer.
    2. -
    3. Heavy cream: Though some recipes exclude heavy cream, we think it makes for the most reliable and dreamy Alfredo sauce.
    4. -
    5. Chicken breasts: Sear the chicken in a skillet, then make the sauce. Any leftover browned bitson the bottom of the pan from the chicken will help to make the sauce more flavorful.
    6. -
    7. Butter: We call for European-style butter here for its slightly higher fat content, but if you’ve got the plain stuff on hand already, use it.
    8. -
      - - - -
      -

      Instructions:

      -
      - - - -
      - - -
      -
    9. Boil the pasta in a large pot of salted water. Get this going before you start cooking the chicken and you can add the dried pasta right around the same time you start cooking the chicken breast. Save a cup of the pasta water to thin the sauce if needed.
    10. -
    11. Cook the chicken breasts in a combination of oil and butter for golden crispness. This is our favorite golden, crispy chicken technique. You can cover the chicken breasts with foil while you finish the sauce to keep them warm.
    12. -
    13. Pasta is ready, chicken is ready, make your sauce. Once your pasta is cooked and drained, and your chicken is cooked and sliced, the actual Alfredo sauce takes just a few minutes to make in the same skillet you cooked the chicken in.
    14. -
    15. Toss it all in the sauce skillet. When the sauce is nice and thick, add the pasta and a splash of pasta water and toss to coat. You can add the chicken here as well, if desired. Serve immediately.
    16. - -
      - - - - \ No newline at end of file diff --git a/pages/__init__.py b/pages/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/pages/base_page.py b/pages/base_page.py new file mode 100644 index 000000000..9dfea2962 --- /dev/null +++ b/pages/base_page.py @@ -0,0 +1,16 @@ +class Page: + + def __init__(self, driver): + self.driver = driver + + def find_element(self, *locator): + self.driver.find_element(*locator) + + def find_elements(self, *locator): + self.driver.find_element(*locator) + + def click(self, *locator): + self.find_element(*locator).click() + + def input_text(self, text, *locator): + self.find_element(*locator).send_keys(text) \ No newline at end of file diff --git a/pages/header.py b/pages/header.py new file mode 100644 index 000000000..13189b184 --- /dev/null +++ b/pages/header.py @@ -0,0 +1,11 @@ +from selenium.webdriver.common.by import By +from pages.base_page import Page + + +class Header(Page): + SEARCH_INPUT = (By.ID, 'search') + SEARCH_BTN = (By.XPATH, "//button[@data-test='@web/Search/SearchButton']") + + def search_product(self): + self.input_text('tea', *self.SEARCH_INPUT) + self.click(*self.SEARCH_BTN) diff --git a/pages/main_page.py b/pages/main_page.py new file mode 100644 index 000000000..30090a6d3 --- /dev/null +++ b/pages/main_page.py @@ -0,0 +1,8 @@ +from pages.base_page import BasePage + +class MainPage(Page): + def open_main(self): + self.driver.get('https://www.target.com/') + context.app.main_page.open_main_page() + + diff --git a/pages/search_results_page.py b/pages/search_results_page.py new file mode 100644 index 000000000..265111150 --- /dev/null +++ b/pages/search_results_page.py @@ -0,0 +1,11 @@ +from selenium.webdriver.common.by import By + +from pages.base_page import Page + + +class SearchResultsPage(Page): + SEARCH_RESULTS_HEADER = (By.XPATH, '//*[@id="', "") + + def verify_search_result(self, expected_item): + actual_text = self.find_element(*self.SEARCH_RESULTS_HEADER) + assert expected_item == actual_text, f'Error: {expected_item} != {actual_text}' \ No newline at end of file diff --git a/sample_script.py b/sample_script.py index f9d301e54..b4e3a368d 100755 --- a/sample_script.py +++ b/sample_script.py @@ -2,6 +2,9 @@ from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager +from selenium.webdriver.support.wait import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC + from time import sleep # get the path to the ChromeDriver executable @@ -11,23 +14,29 @@ service = Service(driver_path) driver = webdriver.Chrome(service=service) driver.maximize_window() +# Implicit +# driver.implicitly_wait(5) # up to 5 sec / applied to find_element, checks for element ever 100ms + +# Explicit +driver.wait = WebDriverWait(driver, timeout=10) # up to 10 sec / checks for element ever 500ms # open the url -driver.get('https://www.target.com/') +driver.get('https://www.google.com/') # populate search field search = driver.find_element(By.NAME, 'q') search.clear() -search.send_keys('') +search.send_keys('Car') -# wait for 4 sec -sleep(4) +search_btn = (By.NAME, 'btnK') +# Make sure not to use * for locators when working with EC: +driver.wait.until(EC.element_to_be_clickable(search_btn), message='Search btn not clickable').click() # click search button -driver.find_element(By.NAME, 'btnK').click() +# driver.find_element(By.NAME, 'btnK').click() # verify search results -assert 'table' in driver.current_url.lower(), f"Expected query not in {driver.current_url.lower()}" +assert 'car' in driver.current_url.lower(), f"Expected query not in {driver.current_url.lower()}" print('Test Passed') -driver.quit() +driver.quit() \ No newline at end of file From b201ddeac6b7d75493c3b9839a703c1d11c4b789 Mon Sep 17 00:00:00 2001 From: Tuychi M Date: Sat, 27 Apr 2024 19:50:36 -0400 Subject: [PATCH 11/12] Updated code for Page Objects --- app/application.py | 13 +++-- features/environment.py | 14 +++-- features/steps/add_target_product_steps.py | 55 ------------------ features/steps/main_page_steps.py | 63 +++++++++++++++------ features/steps/search_results_page_steps.py | 29 ++++++++++ features/steps/target_circle_steps.py | 17 ------ features/steps/target_search.py | 29 ---------- features/tests/add_target_product.feature | 13 ----- features/tests/cart_tests.feature | 18 +----- features/tests/main_page_ui_tests.feature | 9 +++ features/tests/target_circle.feature | 7 --- features/tests/target_search.feature | 26 +++++---- pages/base_page.py | 5 +- pages/header.py | 7 ++- pages/main_page.py | 9 ++- pages/search_result_page.py | 11 ++++ pages/search_results_page.py | 11 ---- 17 files changed, 142 insertions(+), 194 deletions(-) delete mode 100644 features/steps/add_target_product_steps.py delete mode 100644 features/steps/target_circle_steps.py delete mode 100644 features/steps/target_search.py delete mode 100644 features/tests/add_target_product.feature create mode 100644 features/tests/main_page_ui_tests.feature delete mode 100644 features/tests/target_circle.feature create mode 100644 pages/search_result_page.py delete mode 100644 pages/search_results_page.py diff --git a/app/application.py b/app/application.py index 9ab67407c..ddb59d031 100644 --- a/app/application.py +++ b/app/application.py @@ -1,10 +1,15 @@ -from pages.main_page import MainPage +from pages.main_page import MainPage from pages.header import Header -from pages.search_results_page import SearchResultsPage +from pages.search_result_page import SearchResultsPage class Application: + def __init__(self, driver): - self.main = MainPage(driver) + self.main_page = MainPage(driver) self.header = Header(driver) - self.search_results = SearchResultsPage(driver) \ No newline at end of file + self.search_result_page = SearchResultsPage(driver) + + + + diff --git a/features/environment.py b/features/environment.py index a51e48211..39b1a50ba 100755 --- a/features/environment.py +++ b/features/environment.py @@ -1,6 +1,9 @@ from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager +from selenium.webdriver.support.wait import WebDriverWait + +from app.application import Application def browser_init(context): @@ -11,11 +14,14 @@ def browser_init(context): service = Service(driver_path) context.driver = webdriver.Chrome(service=service) - context.driver.maximize_window() - context.driver.maximize_window() context.driver.implicitly_wait(4) - context.wait = Application + context.wait = WebDriverWait(context.driver, timeout=15) + + context.app = Application(context.driver) + + # context.app.header #to work with login + # context.app.main_page def before_scenario(context, scenario): @@ -34,4 +40,4 @@ def after_step(context, step): def after_scenario(context, feature): context.driver.delete_all_cookies() - context.driver.quit() + context.driver.quit() \ No newline at end of file diff --git a/features/steps/add_target_product_steps.py b/features/steps/add_target_product_steps.py deleted file mode 100644 index 195829b10..000000000 --- a/features/steps/add_target_product_steps.py +++ /dev/null @@ -1,55 +0,0 @@ -from selenium.webdriver.common.by import By -from behave import given, when, then -from time import sleep - - -SEARCH_INPUT = (By.ID, 'search') -SEARCH_BTN = (By.XPATH, "//button[@data-test='@web/Search/SearchButton']") -HEADER_LINKS = (By.CSS_SELECTOR, "a[id*='utilityNav']") -ADD_TO_CART_BTN = (By.CSS_SELECTOR, "[id*='addToCartButton']") -SIDE_NAV_ADD_TO_CART_BTN = (By.CSS_SELECTOR, "[aria-label*='Add to cart']") -OPEN_CART_PAGE = (By.CSS_SELECTOR, "a[class*='ButtonSecondary']") -CART_SUMMARY = (By.CSS_SELECTOR, "span[class*='CartSummary']") -CART_ITEM_TITLE = (By.CSS_SELECTOR, "[data-test*='cartItem-title']") - - -@given('Open Target main page') -def open_target(context): - context.driver.get('https://www.target.') - - -@when("Search for {item}") -def search_product(context, item): - context.driver.find_element(*SEARCH_INPUT).send_keys(item) - context.driver.find_element(*SEARCH_BTN).click() - sleep(6) - - -@when('Click on Add to Cart button') -def click_add_cart(context): - context.driver.find_element(*ADD_TO_CART_BTN).click() - - -@when('Confirm Add to Cart button from side navigation') -def side_nav_click_add_to_cart(context): - context.driver.find_element(*SIDE_NAV_ADD_TO_CART_BTN).click() - sleep(2) - - -@when('Open cart page') -def open_cart(context): - context.driver.get('https://www.target.com/cart') - sleep(3) - - -@then('Verify cart has correct product') -def verify_product_name(context): - actual_name = context.driver.find_element(*CART_ITEM_TITLE).text - expected_product_name = 'cups' - assert expected_product_name in actual_name.lower(), f'Expected {expected_product_name} but got {actual_name}' - - -@then('Verify cart has {amount} item(s)') -def verify_cart_items(context,amount): - cart_summary = context.driver.find_element(*CART_SUMMARY).text - assert amount in cart_summary, f'Expected {amount} items but got {cart_summary}' \ No newline at end of file diff --git a/features/steps/main_page_steps.py b/features/steps/main_page_steps.py index bb1428598..a335fc9f5 100644 --- a/features/steps/main_page_steps.py +++ b/features/steps/main_page_steps.py @@ -1,24 +1,27 @@ from selenium.webdriver.common.by import By +from selenium.webdriver.support import expected_conditions as EC from behave import given, when, then from time import sleep -SEARCH_FIELD = (By.ID, 'search') -SEARCH_ICON = (By.XPATH, "//button[@data-test='@web/Search/SearchButton']") + +SEARCH_INPUT = (By.ID, 'search') +SEARCH_BTN = (By.XPATH, "//button[@data-test='@web/Search/SearchButton']") CART_ICON = (By.CSS_SELECTOR, "[data-test='@web/CartLink']") HEADER = (By.CSS_SELECTOR, "[class*='UtilityHeaderWrapper']") -HEADER_LINKS = (By.CSS_SELECTOR, "[data-test*='@web/GlobalHeader/UtilityHeader']") +HEADER_LINKS = (By.CSS_SELECTOR, "a[id*='utilityNav']") +ADD_TO_CART_BTN = (By.CSS_SELECTOR, "[id*='addToCartButton']") +SIDE_NAV_PRODUCT_NAME = (By.CSS_SELECTOR, "h4[class*='StyledHeading']") +SIDE_NAV_ADD_TO_CART_BTN = (By.CSS_SELECTOR, "[data-test='orderPickupButton']") @given('Open Target main page') -def open_target_main(context): - context.driver.get('https://www.target.com/') +def open_target(context): + context.app.main_page.open_main() -@when('Search for {product}') -def search_product(context, product): - context.driver.find_element(*SEARCH_FIELD).send_keys(product) - context.driver.find_element(*SEARCH_ICON).click() - sleep(6) +@when("Search for {item}") +def search_product(context, item): + context.app.header.search_product(item) @when('Click on Cart icon') @@ -26,15 +29,41 @@ def click_cart(context): context.driver.find_element(*CART_ICON).click() +@when('Click on Add to Cart button') +def click_add_to_cart(context): + context.driver.find_element(*ADD_TO_CART_BTN).click() + # Add multiple: + # add_cart_btns = context.driver.find_elements(*ADD_TO_CART_BTN) + # for btn in add_cart_btns[:5]: + # btn.click() # => will click on the first 5 buttons 1 by 1 + # add_cart_btns[4].click() # => will only click on the 5th Add to cart btn + + +@when('Store product name') +def store_product_name(context): + context.wait.until( + EC.presence_of_element_located(SIDE_NAV_PRODUCT_NAME), + message='Product name not present on the page' + ) + context.product_name = context.driver.find_element(*SIDE_NAV_PRODUCT_NAME).text + + +@when('Confirm Add to Cart button from side navigation') +def side_nav_click_add_to_cart(context): + context.driver.find_element(*SIDE_NAV_ADD_TO_CART_BTN).click() + context.wait.until( + EC.invisibility_of_element_located(SIDE_NAV_ADD_TO_CART_BTN), + message='Side nav, Add to Cart button did not disappear' + ) + + @then('Verify header in shown') -def verify_header(context): - # header = context.driver.find_element(*HEADER) - # print(header) +def verify_header_shown(context): context.driver.find_element(*HEADER) @then('Verify header has {expected_amount} links') -def verify_header_links(context, expected_amount): - expected_amount = int(expected_amount) - header_links = context.driver.find_elements(*HEADER_LINKS) - assert len(header_links) == expected_amount, f'Expected {expected_amount} links, but got {len(header_links)}' +def verify_header_links(context, expected_amount): # expected_amount = '5' + expected_amount = int(expected_amount) # '5' (str) => 5 (int) + links = context.driver.find_elements(*HEADER_LINKS) + assert len(links) == expected_amount, f'Expected {expected_amount} links but got {len(links)}' \ No newline at end of file diff --git a/features/steps/search_results_page_steps.py b/features/steps/search_results_page_steps.py index e69de29bb..8fb2cfe23 100644 --- a/features/steps/search_results_page_steps.py +++ b/features/steps/search_results_page_steps.py @@ -0,0 +1,29 @@ +from selenium.webdriver.common.by import By +from behave import then +from time import sleep + + +SEARCH_RESULT_HEADER = (By.XPATH, "//div[@data-test='resultsHeading']") +LISTINGS = (By.CSS_SELECTOR, "[data-test='@web/site-top-of-funnel/ProductCardWrapper']") +PRODUCT_TITLE = (By.CSS_SELECTOR, "[data-test='product-title']") +PRODUCT_IMG = (By.CSS_SELECTOR, "[class*='ProductCardImage']") + + +@then('Verify search results are shown for {expected_item}') +def verify_search_results(context, expected_item): + context.app.search_result_page.verify_search_results(expected_item) + + +@then('Verify that every product has a name and an image') +def verify_products_name_img(context): + # To see ALL listings (comment out if you only check top ones): + context.driver.execute_script("window.scrollBy(0,2000)", "") + sleep(4) + context.driver.execute_script("window.scrollBy(0,2000)", "") + + all_products = context.driver.find_elements(*LISTINGS) # [WebEl1, WebEl2, WebEl3, WebEl4] + + for product in all_products: + title = product.find_element(*PRODUCT_TITLE).text + assert title, 'Product title not shown' + product.find_element(*PRODUCT_IMG) \ No newline at end of file diff --git a/features/steps/target_circle_steps.py b/features/steps/target_circle_steps.py deleted file mode 100644 index 9af83fa74..000000000 --- a/features/steps/target_circle_steps.py +++ /dev/null @@ -1,17 +0,0 @@ -from selenium.webdriver.common.by import By -from behave import given, then -from time import sleep - -VERIFY_CELLS_SHOWN = (By.CSS_SELECTOR, "[data-component-title*='BaseDrivers'] div.cell-item-content") - - -@given('Open Target Circle page') -def open_target(context): - context.driver.get('https://www.target.com/circle') - - -@then('Verify there are cells shown') -def verify_cells_shown(context): - cells = context.driver.find_elements(*VERIFY_CELLS_SHOWN) - assert len(cells) > 0, "No cells are shown on the page" - sleep(6) diff --git a/features/steps/target_search.py b/features/steps/target_search.py deleted file mode 100644 index 466866e1e..000000000 --- a/features/steps/target_search.py +++ /dev/null @@ -1,29 +0,0 @@ -from selenium import webdriver -from selenium.webdriver.common.by import By -from selenium.webdriver.chrome.service import Service -from webdriver_manager.chrome import ChromeDriverManager -from time import sleep - - -driver_path = ChromeDriverManager().install() - - -service = Service(driver_path) -driver = webdriver.Chrome(service=service) -driver.maximize_window() - - -driver.get('https://www.target.com/') - - -driver.find_element(By.ID, 'search').send_keys('bicycle') - -driver.find_element(By.XPATH, "//button[@data-test='@web/Search/SearchButton']").click() - -sleep(6) - - -actual_text = driver.find_element(By.XPATH, "//div[@data-test='resultsHeading']").text -assert 'bicycle' in actual_text, f'Error! Text coffee not in {actual_text}' - -driver.quit() diff --git a/features/tests/add_target_product.feature b/features/tests/add_target_product.feature deleted file mode 100644 index 767dfdaf1..000000000 --- a/features/tests/add_target_product.feature +++ /dev/null @@ -1,13 +0,0 @@ -Feature: Add Product - - Scenario: User can add a product to cart - Given Open Target main page - When Search for mug - And Click on Add to Cart button - And Confirm Add to Cart button from side navigation - And Open cart page - Then Verify cart has 1 item(s) - And Verify cart has correct product - - - diff --git a/features/tests/cart_tests.feature b/features/tests/cart_tests.feature index 9e32de2db..76a292c01 100644 --- a/features/tests/cart_tests.feature +++ b/features/tests/cart_tests.feature @@ -7,24 +7,10 @@ Feature: Cart tests Scenario: User can add a product to cart Given Open target main page - When Search for Lunar New Year M&M's + When Search for Ice Tea And Click on Add to Cart button And Store product name And Confirm Add to Cart button from side navigation And Open cart page Then Verify cart has 1 item(s) - And Verify cart has correct product - - Scenario: User can add different products to cart - Given Open target main page - When Search for Lunar New Year M&M's - And Click on Add to Cart button for product 1 - And Store product name to a list - And Confirm Add to Cart button from side navigation - And Close side navigation - And Click on Add to Cart button for product 2 - And Store product name to a list - And Confirm Add to Cart button from side navigation - And Open cart page - Then Verify cart has 2 item(s) - And Verify cart has correct multiple products \ No newline at end of file + And Verify cart has correct product \ No newline at end of file diff --git a/features/tests/main_page_ui_tests.feature b/features/tests/main_page_ui_tests.feature new file mode 100644 index 000000000..9bbe4dd3d --- /dev/null +++ b/features/tests/main_page_ui_tests.feature @@ -0,0 +1,9 @@ +Feature: Tests for main page UI + + Scenario: Verify header in shown + Given Open Target main page + Then Verify header in shown + + Scenario: Verify header has correct amount links + Given Open Target main page + Then Verify header has 5 links \ No newline at end of file diff --git a/features/tests/target_circle.feature b/features/tests/target_circle.feature deleted file mode 100644 index 2ef5384d0..000000000 --- a/features/tests/target_circle.feature +++ /dev/null @@ -1,7 +0,0 @@ -Feature: Target Circle Page Verification - - - Scenario: Verify the benefits cells are shown - Given Open Target Circle page - Then Verify there are cells shown - diff --git a/features/tests/target_search.feature b/features/tests/target_search.feature index b585110e1..baf5eea1b 100644 --- a/features/tests/target_search.feature +++ b/features/tests/target_search.feature @@ -1,20 +1,22 @@ Feature: Search tests -Scenario: User can search for tea - Given Open Target main page - When Search for 'tea' - Then Verify search results are shown for tea + Scenario: User can search for a tea + Given Open Target main page + When Search for ice tea + Then Verify search results are shown for ice tea - Scenario Outline: User can search for a product# Given Open Target main page + Scenario Outline: User can search for a product Given Open Target main page - When Search for '' + When Search for Then Verify search results are shown for Examples: - | item | expected_item | - | mug | mug | - | tea | tea | - | spoon | spoon | - | sugar | sugar | + |item |expected_item | + |mug |mug | + |tea |tea | + |white mug |white mug | - Scenario Verify that user can see product \ No newline at end of file + Scenario: Verify that user can see product names and images + Given Open target main page + When Search for AirPods (3rd Generation) + Then Verify that every product has a name and an image \ No newline at end of file diff --git a/pages/base_page.py b/pages/base_page.py index 9dfea2962..cef01271b 100644 --- a/pages/base_page.py +++ b/pages/base_page.py @@ -1,13 +1,14 @@ + class Page: def __init__(self, driver): self.driver = driver def find_element(self, *locator): - self.driver.find_element(*locator) + return self.driver.find_element(*locator) def find_elements(self, *locator): - self.driver.find_element(*locator) + return self.driver.find_elements(*locator) def click(self, *locator): self.find_element(*locator).click() diff --git a/pages/header.py b/pages/header.py index 13189b184..0ea5e45fb 100644 --- a/pages/header.py +++ b/pages/header.py @@ -1,4 +1,6 @@ from selenium.webdriver.common.by import By +from time import sleep + from pages.base_page import Page @@ -6,6 +8,7 @@ class Header(Page): SEARCH_INPUT = (By.ID, 'search') SEARCH_BTN = (By.XPATH, "//button[@data-test='@web/Search/SearchButton']") - def search_product(self): - self.input_text('tea', *self.SEARCH_INPUT) + def search_product(self, item): + self.input_text(item, *self.SEARCH_INPUT) self.click(*self.SEARCH_BTN) + sleep(6) \ No newline at end of file diff --git a/pages/main_page.py b/pages/main_page.py index 30090a6d3..90dce9dfb 100644 --- a/pages/main_page.py +++ b/pages/main_page.py @@ -1,8 +1,7 @@ -from pages.base_page import BasePage +from pages.base_page import Page -class MainPage(Page): - def open_main(self): - self.driver.get('https://www.target.com/') - context.app.main_page.open_main_page() +class MainPage(Page): + def open_main(self): + self.driver.get('https://www.target.com/') \ No newline at end of file diff --git a/pages/search_result_page.py b/pages/search_result_page.py new file mode 100644 index 000000000..98f491d13 --- /dev/null +++ b/pages/search_result_page.py @@ -0,0 +1,11 @@ +from selenium.webdriver.common.by import By + +from pages.base_page import Page + + +class SearchResultsPage(Page): + SEARCH_RESULT_HEADER = (By.XPATH, "//div[@data-test='resultsHeading']") + + def verify_search_results(self, expected_item): + actual_text = self.find_element(*self.SEARCH_RESULT_HEADER).text + assert expected_item in actual_text, f'Error! Text {expected_item} not in {actual_text}' \ No newline at end of file diff --git a/pages/search_results_page.py b/pages/search_results_page.py deleted file mode 100644 index 265111150..000000000 --- a/pages/search_results_page.py +++ /dev/null @@ -1,11 +0,0 @@ -from selenium.webdriver.common.by import By - -from pages.base_page import Page - - -class SearchResultsPage(Page): - SEARCH_RESULTS_HEADER = (By.XPATH, '//*[@id="', "") - - def verify_search_result(self, expected_item): - actual_text = self.find_element(*self.SEARCH_RESULTS_HEADER) - assert expected_item == actual_text, f'Error: {expected_item} != {actual_text}' \ No newline at end of file From 58a6b0a37bfec5ca4933ef9457a1420cf9727bf4 Mon Sep 17 00:00:00 2001 From: Tuychi M Date: Wed, 8 May 2024 23:05:56 -0400 Subject: [PATCH 12/12] updated test scenerio --- app/application.py | 13 +++- features/environment.py | 2 +- features/steps/cart_page_steps.py | 27 ++++++++ features/steps/main_page_steps.py | 66 ++++---------------- features/steps/search_results_page_steps.py | 8 +++ features/tests/cart_tests.feature | 2 +- features/tests/sign_in_test.feature | 7 +++ features/tests/target_search.feature | 10 +-- pages/base_page.py | 68 ++++++++++++++++++++- pages/cart_page.py | 10 +++ pages/header.py | 7 ++- pages/main_page.py | 3 +- pages/sign_in_page.py | 19 ++++++ pages/target_app_page_steps.py | 36 +++++++++++ 14 files changed, 209 insertions(+), 69 deletions(-) create mode 100644 features/steps/cart_page_steps.py create mode 100644 features/tests/sign_in_test.feature create mode 100644 pages/cart_page.py create mode 100644 pages/sign_in_page.py create mode 100644 pages/target_app_page_steps.py diff --git a/app/application.py b/app/application.py index ddb59d031..d56fdcaf2 100644 --- a/app/application.py +++ b/app/application.py @@ -1,14 +1,23 @@ -from pages.main_page import MainPage +from pages.base_page import Page +from pages.cart_page import CartPage from pages.header import Header +from pages.main_page import MainPage from pages.search_result_page import SearchResultsPage +from pages.cart_page import CartPage +from pages.sign_in_page import SignIn class Application: def __init__(self, driver): - self.main_page = MainPage(driver) + self.base_page = Page(driver) + self.cart_page = CartPage(driver) self.header = Header(driver) + self.main_page = MainPage(driver) self.search_result_page = SearchResultsPage(driver) + self.sign_in_page = SignIn(driver) + self.pages = Page(driver) + diff --git a/features/environment.py b/features/environment.py index 39b1a50ba..3b0f05f41 100755 --- a/features/environment.py +++ b/features/environment.py @@ -36,8 +36,8 @@ def before_step(context, step): def after_step(context, step): if step.status == 'failed': print('\nStep failed: ', step) + context.app.base_page.save_screenshot('step') def after_scenario(context, feature): - context.driver.delete_all_cookies() context.driver.quit() \ No newline at end of file diff --git a/features/steps/cart_page_steps.py b/features/steps/cart_page_steps.py new file mode 100644 index 000000000..fe4317d66 --- /dev/null +++ b/features/steps/cart_page_steps.py @@ -0,0 +1,27 @@ +from selenium.webdriver.common.by import By +from behave import when, then + +CART_SUMMARY = (By.CSS_SELECTOR, "[class*='CartSummarySpan']") +CART_ITEM_TITLE = (By.CSS_SELECTOR, "[data-test='cartItem-title']") + + +@when('Open cart page') +def open_cart(context): + context.driver.get('https://www.target.com/cart') + + +@then('Verify cart has correct product') +def verify_product_name(context): + actual_name = context.driver.find_element(*CART_ITEM_TITLE).text + assert context.product_name in actual_name, f"Expected {context.product_name} but got {actual_name}" + + +@then('Verify cart has {amount} item(s)') +def verify_cart_items(context, amount): + cart_summary = context.driver.find_element(*CART_SUMMARY).text + assert amount in cart_summary, f"Expected {amount} items but got {cart_summary}" + + +@then("Verify 'Your cart is empty' message is shown") +def verify_cart_empty_message(context): + context.app.cart_page.verify_cart_empty_message() \ No newline at end of file diff --git a/features/steps/main_page_steps.py b/features/steps/main_page_steps.py index a335fc9f5..2dcbd5bf1 100644 --- a/features/steps/main_page_steps.py +++ b/features/steps/main_page_steps.py @@ -1,17 +1,7 @@ from selenium.webdriver.common.by import By -from selenium.webdriver.support import expected_conditions as EC from behave import given, when, then from time import sleep - - -SEARCH_INPUT = (By.ID, 'search') -SEARCH_BTN = (By.XPATH, "//button[@data-test='@web/Search/SearchButton']") -CART_ICON = (By.CSS_SELECTOR, "[data-test='@web/CartLink']") -HEADER = (By.CSS_SELECTOR, "[class*='UtilityHeaderWrapper']") -HEADER_LINKS = (By.CSS_SELECTOR, "a[id*='utilityNav']") -ADD_TO_CART_BTN = (By.CSS_SELECTOR, "[id*='addToCartButton']") -SIDE_NAV_PRODUCT_NAME = (By.CSS_SELECTOR, "h4[class*='StyledHeading']") -SIDE_NAV_ADD_TO_CART_BTN = (By.CSS_SELECTOR, "[data-test='orderPickupButton']") +from pages import sign_in_page @given('Open Target main page') @@ -19,51 +9,17 @@ def open_target(context): context.app.main_page.open_main() -@when("Search for {item}") -def search_product(context, item): - context.app.header.search_product(item) - - -@when('Click on Cart icon') -def click_cart(context): - context.driver.find_element(*CART_ICON).click() - - -@when('Click on Add to Cart button') -def click_add_to_cart(context): - context.driver.find_element(*ADD_TO_CART_BTN).click() - # Add multiple: - # add_cart_btns = context.driver.find_elements(*ADD_TO_CART_BTN) - # for btn in add_cart_btns[:5]: - # btn.click() # => will click on the first 5 buttons 1 by 1 - # add_cart_btns[4].click() # => will only click on the 5th Add to cart btn - - -@when('Store product name') -def store_product_name(context): - context.wait.until( - EC.presence_of_element_located(SIDE_NAV_PRODUCT_NAME), - message='Product name not present on the page' - ) - context.product_name = context.driver.find_element(*SIDE_NAV_PRODUCT_NAME).text - - -@when('Confirm Add to Cart button from side navigation') -def side_nav_click_add_to_cart(context): - context.driver.find_element(*SIDE_NAV_ADD_TO_CART_BTN).click() - context.wait.until( - EC.invisibility_of_element_located(SIDE_NAV_ADD_TO_CART_BTN), - message='Side nav, Add to Cart button did not disappear' - ) +@when("Click Sign in") +def click_sign_in(context): + context.app.sign_in_page.click_sign_in() -@then('Verify header in shown') -def verify_header_shown(context): - context.driver.find_element(*HEADER) +@then('From side nav menu, click Sign in') +def side_nav_sign_in_btn(context): + context.app.sign_in_page.side_nav_sign_in_btn() -@then('Verify header has {expected_amount} links') -def verify_header_links(context, expected_amount): # expected_amount = '5' - expected_amount = int(expected_amount) # '5' (str) => 5 (int) - links = context.driver.find_elements(*HEADER_LINKS) - assert len(links) == expected_amount, f'Expected {expected_amount} links but got {len(links)}' \ No newline at end of file +@then('Verify Sign in form opened') +def verify_sign_in_shown(context): + context.app.base_page.verify_sign_in_shown('Sign into your Target account') + sleep(8) diff --git a/features/steps/search_results_page_steps.py b/features/steps/search_results_page_steps.py index 8fb2cfe23..888950791 100644 --- a/features/steps/search_results_page_steps.py +++ b/features/steps/search_results_page_steps.py @@ -1,8 +1,11 @@ from selenium.webdriver.common.by import By +from selenium.webdriver.support import expected_conditions as EC + from behave import then from time import sleep + SEARCH_RESULT_HEADER = (By.XPATH, "//div[@data-test='resultsHeading']") LISTINGS = (By.CSS_SELECTOR, "[data-test='@web/site-top-of-funnel/ProductCardWrapper']") PRODUCT_TITLE = (By.CSS_SELECTOR, "[data-test='product-title']") @@ -14,6 +17,11 @@ def verify_search_results(context, expected_item): context.app.search_result_page.verify_search_results(expected_item) +@then('Verify that URL has {partial_url}') +def verify_search_page_url(context, partial_url): + context.app.search_result_page.verify_partial_url(partial_url) + + @then('Verify that every product has a name and an image') def verify_products_name_img(context): # To see ALL listings (comment out if you only check top ones): diff --git a/features/tests/cart_tests.feature b/features/tests/cart_tests.feature index 76a292c01..0ce2aef27 100644 --- a/features/tests/cart_tests.feature +++ b/features/tests/cart_tests.feature @@ -13,4 +13,4 @@ Feature: Cart tests And Confirm Add to Cart button from side navigation And Open cart page Then Verify cart has 1 item(s) - And Verify cart has correct product \ No newline at end of file + And Verify cart has correct product diff --git a/features/tests/sign_in_test.feature b/features/tests/sign_in_test.feature new file mode 100644 index 000000000..a740f5446 --- /dev/null +++ b/features/tests/sign_in_test.feature @@ -0,0 +1,7 @@ +Feature: Target Sign In + + Scenario: Logged out user can Sign in + Given Open Target main page + When Click Sign in + Then From side nav menu, click Sign in + And Verify Sign in form opened \ No newline at end of file diff --git a/features/tests/target_search.feature b/features/tests/target_search.feature index baf5eea1b..c8868bb12 100644 --- a/features/tests/target_search.feature +++ b/features/tests/target_search.feature @@ -3,8 +3,9 @@ Feature: Search tests Scenario: User can search for a tea Given Open Target main page - When Search for ice tea - Then Verify search results are shown for ice tea + When Search for icetea + Then Verify search results are shown for icetea + Then Verify that URL has icetea Scenario Outline: User can search for a product Given Open Target main page @@ -15,8 +16,3 @@ Feature: Search tests |mug |mug | |tea |tea | |white mug |white mug | - - Scenario: Verify that user can see product names and images - Given Open target main page - When Search for AirPods (3rd Generation) - Then Verify that every product has a name and an image \ No newline at end of file diff --git a/pages/base_page.py b/pages/base_page.py index cef01271b..a22033995 100644 --- a/pages/base_page.py +++ b/pages/base_page.py @@ -1,8 +1,13 @@ +from selenium.webdriver.common.by import By +from selenium.webdriver.support.wait import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC + class Page: def __init__(self, driver): self.driver = driver + self.wait = WebDriverWait(self.driver, 10) def find_element(self, *locator): return self.driver.find_element(*locator) @@ -14,4 +19,65 @@ def click(self, *locator): self.find_element(*locator).click() def input_text(self, text, *locator): - self.find_element(*locator).send_keys(text) \ No newline at end of file + self.find_element(*locator).send_keys(text) + + def wait_until_clickable(self, *locator): + self.wait.until( + EC.element_to_be_clickable(locator), + message=f'Element not clickable by {locator}' + ).click() + + def wait_until_visible(self, *locator): + self.wait.until( + EC.visibility_of_element_located(locator), + f'Element not visible by {locator}' + ) + + def wait_until_disappears(self, *locator): + self.wait.until( + EC.invisibility_of_element_located(locator), + f'Element still visible by {locator}' + ) + + def get_current_window(self): + current_window = self.driver.current_window_handle + print('Current:', current_window) + print('ALL windows:', self.driver.window_handles) + return current_window + + def switch_to_new_window(self): + self.wait.until(EC.new_window_is_opened) + all_windows = self.driver.window_handles # [Win1, Win2, ...] + print('ALL windows:', self.driver.window_handles) + print('Switching to... ', all_windows[1]) + self.driver.switch_to.window(all_windows[1]) + + def switch_window_by_id(self, window_id): + print('Switching to... ', window_id) + self.driver.switch_to.window(window_id) + + def verify_partial_text(self, expected_text, *locator): + actual_text = self.find_element(*locator).text + assert expected_text in actual_text, f'Expected {expected_text}, not in {actual_text}' + + def verify_partial_url(self, expected_partial_url): + self.wait.until(EC.url_contains(expected_partial_url), message=f'Url doest not contain {expected_partial_url}') + + def verify_url(self, expected_url): + self.wait.until(EC.url_matches(expected_url), message=f'Url does not contain {expected_url}') + + def save_screenshot(self, name): + self.driver.save_screenshot(f'{name}.png') + + def close(self): + self.driver.close() + + def click_sign_in(self, *locator): + self.find_element(*locator).click() + + def side_nav_sign_in_btn(self, *locator): + self.find_element(*locator).click() + + def verify_sign_in_shown(self, expected_text, *locator): + actual_text = self.find_element(*locator).text + assert expected_text == expected_text, f'Expected {expected_text} but got {actual_text}' diff --git a/pages/cart_page.py b/pages/cart_page.py new file mode 100644 index 000000000..958f9313d --- /dev/null +++ b/pages/cart_page.py @@ -0,0 +1,10 @@ +from selenium.webdriver.common.by import By + +from pages.base_page import Page + + +class CartPage(Page): + CART_EMPTY_MSG = (By.CSS_SELECTOR, "h1[class*='StyledHeading']") + + def verify_cart_empty_message(self): + self.verify_text('Your cart is empty', *self.CART_EMPTY_MSG) \ No newline at end of file diff --git a/pages/header.py b/pages/header.py index 0ea5e45fb..c0f8a7637 100644 --- a/pages/header.py +++ b/pages/header.py @@ -7,8 +7,13 @@ class Header(Page): SEARCH_INPUT = (By.ID, 'search') SEARCH_BTN = (By.XPATH, "//button[@data-test='@web/Search/SearchButton']") + CART_ICON = (By.CSS_SELECTOR, "[data-test='@web/CartLink']") def search_product(self, item): self.input_text(item, *self.SEARCH_INPUT) self.click(*self.SEARCH_BTN) - sleep(6) \ No newline at end of file + sleep(6) + + def click_cart(self): + self.wait_until_clickable(*self.CART_ICON) + self.save_screenshot('cart.png') \ No newline at end of file diff --git a/pages/main_page.py b/pages/main_page.py index 90dce9dfb..a7187c3f9 100644 --- a/pages/main_page.py +++ b/pages/main_page.py @@ -4,4 +4,5 @@ class MainPage(Page): def open_main(self): - self.driver.get('https://www.target.com/') \ No newline at end of file + self.driver.get('https://www.target.com/') + diff --git a/pages/sign_in_page.py b/pages/sign_in_page.py new file mode 100644 index 000000000..60a5ca4d4 --- /dev/null +++ b/pages/sign_in_page.py @@ -0,0 +1,19 @@ +from selenium.webdriver.common.by import By + +from pages.base_page import Page +from behave import when, then + + +class SignIn(Page): + SIGNIN_BTN = (By.CSS_SELECTOR, "a[data-test='@web/AccountLink']") + SIDE_NAV_BTN = (By.CSS_SELECTOR, "a[data-test='accountNav-signIn']") + VERIFY_SIGNIN_OPEN = (By.CSS_SELECTOR, "h1[class*='StyledHeading']") + + def click_sign_in(self): + self.click(*self.SIGNIN_BTN) + + def side_nav_sign_in_btn(self): + self.wait_until_clickable(*self.SIDE_NAV_BTN) + + def verify_sign_in_shown(self, expected_text, *locator): + self.verify_sign_in_shown(*self.VERIFY_SIGNIN_OPEN) diff --git a/pages/target_app_page_steps.py b/pages/target_app_page_steps.py new file mode 100644 index 000000000..7af10e8ea --- /dev/null +++ b/pages/target_app_page_steps.py @@ -0,0 +1,36 @@ +from behave import given, when, then + + +@given('Open Target App page') +def open_target_app(context): + context.app.target_app_page.open_target_app() + + +@given('Store original window') +def store_original_window(context): + context.original_window = context.app.target_app_page.get_current_window() + + +@when('Click Privacy Policy link') +def click_pp_link(context): + context.app.target_app_page.click_pp_link() + + +@when('Switch to new window') +def switch_window(context): + context.app.target_app_page.switch_to_new_window() + + +@then('Verify Privacy Policy page opened') +def verify_pp_opened(context): + context.app.target_app_page.verify_pp_opened() + + +@then('Close current page') +def close(context): + context.app.target_app_page.close() + + +@then('Return to original window') +def return_to_original_window(context): + context.app.target_app_page.switch_window_by_id(context.original_window) \ No newline at end of file