Testing_Unioil_Web/station_locator_test.py

262 lines
9.5 KiB
Python
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import sys
try:
from login import login_to_cms
except ImportError as e:
print(f"❌ Failed to import login_to_cms: {e}")
sys.exit(1)
def test_station_locator():
driver = None
try:
driver = login_to_cms()
wait = WebDriverWait(driver, 10)
actions = ActionChains(driver)
print("✅ Logged in")
# Wait for the menu to load
time.sleep(3)
# Find the Station Locator menu item by its visible text
station_locator = wait.until(
EC.presence_of_element_located(
(By.XPATH, '//span[normalize-space()="Station Locator"]/ancestor::div[contains(@class,"ant-menu-submenu-title")]')
)
)
# Hover over the menu item to reveal submenu
actions.move_to_element(station_locator).perform()
time.sleep(1)
# Click Station Locator (fallback to JS if necessary)
try:
station_locator.click()
print("✅ Clicked Station Locator (regular click)")
except:
driver.execute_script("arguments[0].click();", station_locator)
print("✅ Clicked Station Locator (JS fallback)")
# Wait for Branches to appear
branches_link = wait.until(
EC.element_to_be_clickable((By.XPATH, '//a[normalize-space()="Branches"]'))
)
branches_link.click()
print("✅ Clicked on Branches")
# 3. Click Add Branch
add_branch_button = wait.until(
EC.element_to_be_clickable((By.XPATH, '//button[.//span[text()="Add branch"]]'))
)
add_branch_button.click()
print("✅ Clicked on 'Add branch'")
# 4. Enter branch code
branch_code_input = wait.until(
EC.presence_of_element_located((By.XPATH, '//input[@name="code"]'))
)
branch_code_input.send_keys("Marjorie Branch Code")
print("✅ Entered branch code")
# 5. Enter branch name
branch_name_input = driver.find_element(By.XPATH, '//input[@name="name"]')
branch_name_input.send_keys("Marjorie Branch Name")
print("✅ Entered branch name")
# 6. Enter details
details_input = driver.find_element(By.XPATH, '//input[@name="details"]')
details_input.send_keys("Marjorie Details")
print("✅ Entered branch details")
# 7. Click Save button
save_button = wait.until(
EC.element_to_be_clickable((By.XPATH, '//button[.//span[text()="Save"]]'))
)
save_button.click()
print("✅ Clicked on 'Save'")
# 8. Handle error modal if branch already exists
try:
error_icon = WebDriverWait(driver, 5).until(
EC.presence_of_element_located((By.XPATH, '//i[@aria-label="icon: close" and contains(@class, "ant-notification-close-icon")]'))
)
driver.execute_script("arguments[0].click();", error_icon)
print("✅ Closed the error notification")
except:
print(" No error modal appeared")
# 9. Click Cancel button
cancel_button = wait.until(
EC.element_to_be_clickable((By.XPATH, '//button[.//span[text()="Cancel"]]'))
)
cancel_button.click()
print("✅ Clicked on 'Cancel'")
# 10. Click Yes on confirmation dialog
confirmation_button = wait.until(
EC.element_to_be_clickable((By.XPATH, '//button[.//span[text()="Yes"]]'))
)
confirmation_button.click()
print("✅ Clicked on 'Yes' in confirmation")
# Re-open "Station Locator" submenu if collapsed (after navigating to Branches)
station_locator = WebDriverWait(driver, 10).until(
EC.presence_of_element_located(
(By.XPATH, '//span[normalize-space()="Station Locator"]/ancestor::div[contains(@class,"ant-menu-submenu-title")]')
)
)
actions.move_to_element(station_locator).perform()
time.sleep(1)
try:
station_locator.click()
print("🔄 Re-clicked Station Locator (regular click)")
except:
driver.execute_script("arguments[0].click();", station_locator)
print("🔄 Re-clicked Station Locator (JS fallback)")
# Now click "Stations"
stations_link = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.XPATH, '//a[@href="/stations" and contains(text(), "Stations")]'))
)
stations_link.click()
print("✅ Clicked on 'Stations'")
# Click "Upload Prices"
upload_prices_btn = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.XPATH, '//button[.//span[text()="Upload Prices"]]'))
)
upload_prices_btn.click()
print("✅ Clicked 'Upload Prices'")
# Click "Close" on the modal
close_button = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.XPATH, '//button[.//span[text()="Close"]]'))
)
close_button.click()
print("✅ Closed the upload modal")
# Click "Next Page"
next_page = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.XPATH, '//li[@title="Next Page" and @aria-disabled="false"]'))
)
next_page.click()
print("➡️ Moved to next page")
# Wait a bit for content to update
time.sleep(2)
# Click "Previous Page"
prev_page = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.XPATH, '//li[@title="Previous Page" and @aria-disabled="false"]'))
)
prev_page.click()
print("⬅️ Moved back to previous page")
# Wait and click the green plus-circle icon (add station)
plus_icon = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.XPATH, '//span[@role="img" and @aria-label="plus-circle"]'))
)
plus_icon.click()
print("✅ Clicked the green plus-circle icon")
# Wait and click Cancel button in the modal/form
cancel_button = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.XPATH, '//button[.//span[text()="Cancel"]]'))
)
cancel_button.click()
print("✅ Clicked 'Cancel'")
# Wait and click Yes on confirmation
yes_button = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.XPATH, '//button[.//span[text()="Yes"]]'))
)
yes_button.click()
print("✅ Clicked 'Yes' on confirmation")
# Re-open Station Locator dropdown (if collapsed)
station_locator_menu = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, '//span[normalize-space()="Station Locator"]/ancestor::div[contains(@class,"ant-menu-submenu-title")]'))
)
driver.execute_script("arguments[0].scrollIntoView(true);", station_locator_menu)
station_locator_menu.click()
print("✅ Re-opened Station Locator dropdown")
# Click Fuels
fuels_link = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.XPATH, '//a[normalize-space()="Fuels"]'))
)
fuels_link.click()
print("✅ Clicked 'Fuels'")
# Click Add Fuel
add_fuel_button = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.XPATH, '//button[.//span[text()="Add fuel"]]'))
)
add_fuel_button.click()
print("✅ Clicked 'Add fuel'")
# Enter fuel name
fuel_name_input = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, '//input[@placeholder="Enter" and @name="name"]'))
)
fuel_name_input.send_keys("FUEL MARJORIE")
print("✅ Entered fuel name")
# Click Save
save_button = driver.find_element(By.XPATH, '//button[.//span[text()="Save"]]')
save_button.click()
print("✅ Clicked 'Save'")
# Handle duplicate name error modal (optional)
try:
close_icon = WebDriverWait(driver, 5).until(
EC.element_to_be_clickable((By.XPATH, '//i[contains(@class,"ant-notification-close-icon")]'))
)
close_icon.click()
print("⚠️ Fuel name already exists. Closed error notification.")
except:
print("✅ Fuel created successfully or no error appeared.")
# Click Cancel
cancel_button = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.XPATH, '//button[.//span[text()="Cancel"]]'))
)
cancel_button.click()
print("✅ Clicked 'Cancel'")
# Confirm Cancel with Yes
yes_button = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.XPATH, '//button[.//span[text()="Yes"]]'))
)
yes_button.click()
print("✅ Confirmed cancel with 'Yes'")
# 11. Wait before closing
print("⏳ Waiting 10 seconds before closing browser...")
time.sleep(10)
except Exception as e:
print(f"❌ Test failed: {e}")
finally:
if driver:
driver.quit()
print("🧹 Browser closed")
if __name__ == "__main__":
test_station_locator()