Initial commit - Selenium automation framework
This commit is contained in:
@@ -0,0 +1 @@
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
from selenium.webdriver.common.by import By
|
||||
from selenium.webdriver.support.ui import WebDriverWait
|
||||
import pytest
|
||||
|
||||
from tests.step_actions import StepActions
|
||||
from tests.helpers import login, select_ui_dropdown
|
||||
from tests.config_reader import is_combined_setup_enabled, is_setup_session_enabled, load_config
|
||||
from tests.locators import Locator
|
||||
|
||||
|
||||
pytestmark = pytest.mark.skipif(
|
||||
is_combined_setup_enabled() or not is_setup_session_enabled(),
|
||||
reason="Standalone session setup is disabled or runs inside combined setup",
|
||||
)
|
||||
|
||||
|
||||
def get_session_window(config):
|
||||
|
||||
session_config = config.get("setup", {}).get("session", {})
|
||||
start_offset_minutes = session_config.get("start_offset_minutes", 7)
|
||||
end_time = session_config.get("end_time", "20:30")
|
||||
|
||||
start_datetime = datetime.now() + timedelta(minutes=start_offset_minutes)
|
||||
today = datetime.now().strftime("%d/%m/%Y")
|
||||
|
||||
return start_datetime.strftime("%d/%m/%Y %H:%M"), f"{today} {end_time}"
|
||||
|
||||
|
||||
def create_session(driver, step, config):
|
||||
|
||||
step.click((By.XPATH, Locator.tradingmaintenance), "trading_maintenance")
|
||||
|
||||
step.click((By.XPATH, Locator.tradingsession), "trading_session")
|
||||
|
||||
step.click((By.XPATH, Locator.addsessionbtn), "add_session")
|
||||
|
||||
select_ui_dropdown(driver, "meInstanceId", config["product"]["me_instance"])
|
||||
|
||||
step.capture("select_product")
|
||||
|
||||
start_date_time, end_date_time = get_session_window(config)
|
||||
|
||||
step.type((By.XPATH, Locator.inputstartdate), start_date_time, "start_date")
|
||||
|
||||
step.type((By.XPATH, Locator.inputenddate), end_date_time, "end_date")
|
||||
|
||||
step.click((By.XPATH, Locator.sessionsavebtn), "save_session")
|
||||
|
||||
|
||||
@pytest.mark.session
|
||||
def test_session(driver, test_context):
|
||||
|
||||
config = load_config()
|
||||
|
||||
wait = WebDriverWait(driver, 20)
|
||||
|
||||
step = StepActions(driver, wait, test_context)
|
||||
|
||||
driver.get(config["url"])
|
||||
step.capture("open_application")
|
||||
|
||||
login(
|
||||
driver,
|
||||
config["login"]["username"],
|
||||
config["login"]["password"]
|
||||
)
|
||||
|
||||
step.capture("login")
|
||||
|
||||
create_session(driver, step, config)
|
||||
@@ -0,0 +1,46 @@
|
||||
import pytest
|
||||
from selenium.webdriver.support.ui import WebDriverWait
|
||||
|
||||
from tests.config_reader import is_combined_setup_enabled, load_config
|
||||
from tests.helpers import login, logout, save_session_backup
|
||||
from tests.setup.sessions.test_session import create_session
|
||||
from tests.setup.tokens.test_trading_token import create_and_activate_token, get_product_codes
|
||||
from tests.step_actions import StepActions
|
||||
|
||||
|
||||
pytestmark = pytest.mark.skipif(
|
||||
not is_combined_setup_enabled(),
|
||||
reason="Combined setup requires setup.run_session and setup.run_token to both be true",
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.session
|
||||
@pytest.mark.trading_token
|
||||
def test_session_and_token_setup(driver, test_context):
|
||||
|
||||
config = load_config()
|
||||
token = config.get("trading_token_idas")
|
||||
assert token, "Add trading_token_idas in config.json before running token setup."
|
||||
|
||||
wait = WebDriverWait(driver, 20)
|
||||
step = StepActions(driver, wait, test_context)
|
||||
|
||||
driver.get(config["url"])
|
||||
step.capture("open_application")
|
||||
|
||||
login(
|
||||
driver,
|
||||
config["login"]["username"],
|
||||
config["login"]["password"]
|
||||
)
|
||||
step.capture("login")
|
||||
save_session_backup(driver, test_context, "login_session_backup")
|
||||
|
||||
create_session(driver, step, config)
|
||||
|
||||
for product_code in get_product_codes(token):
|
||||
product_token = dict(token)
|
||||
product_token["product_code"] = product_code
|
||||
create_and_activate_token(driver, step, product_token)
|
||||
|
||||
logout(driver)
|
||||
@@ -0,0 +1 @@
|
||||
|
||||
@@ -0,0 +1,249 @@
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
import pytest
|
||||
from selenium.webdriver.common.by import By
|
||||
from selenium.webdriver.support.ui import WebDriverWait
|
||||
|
||||
from tests.config_reader import is_combined_setup_enabled, is_setup_token_enabled, load_config, parse_product_codes
|
||||
from tests.helpers import (
|
||||
click_visible_menu_item,
|
||||
click_first_grid_button,
|
||||
click_grid_button_for_row_text,
|
||||
handle_transient_popups,
|
||||
login,
|
||||
logout,
|
||||
open_trading_maintenance_page,
|
||||
pause_after_step,
|
||||
save_session_backup,
|
||||
select_bootstrap_dropdown_by_id,
|
||||
select_labeled_ui_dropdown,
|
||||
type_first_visible_input,
|
||||
)
|
||||
from tests.locators import Locator
|
||||
from tests.step_actions import StepActions
|
||||
|
||||
|
||||
pytestmark = pytest.mark.skipif(
|
||||
is_combined_setup_enabled() or not is_setup_token_enabled(),
|
||||
reason="Standalone token setup is disabled or runs inside combined setup",
|
||||
)
|
||||
|
||||
|
||||
def get_token_context(driver, test_context):
|
||||
|
||||
config = load_config()
|
||||
wait = WebDriverWait(driver, 20)
|
||||
step = StepActions(driver, wait, test_context)
|
||||
token = config.get("trading_token_idas")
|
||||
|
||||
assert token, "Add trading_token_idas in config.json before running this test."
|
||||
|
||||
return config, step, token
|
||||
|
||||
|
||||
def open_app_and_login(driver, step, config):
|
||||
|
||||
driver.get(config["url"])
|
||||
step.capture("open_application")
|
||||
|
||||
login(
|
||||
driver,
|
||||
config["login"]["username"],
|
||||
config["login"]["password"]
|
||||
)
|
||||
step.capture("login")
|
||||
|
||||
|
||||
def get_delivery_date_and_expiry(token):
|
||||
|
||||
delivery_offset_days = token.get("delivery_offset_days", 1)
|
||||
expiry_time = token.get("expiry_time", "20:30")
|
||||
|
||||
delivery_date = (datetime.now() + timedelta(days=delivery_offset_days)).strftime("%d/%m/%Y")
|
||||
token_expiry = f"{datetime.now().strftime('%d/%m/%Y')} {expiry_time}"
|
||||
|
||||
return delivery_date, token_expiry
|
||||
|
||||
|
||||
def get_time_session_times(token, row_text, default_start_time, default_end_time):
|
||||
|
||||
time_session_config = token.get("time_sessions", {}).get(row_text, {})
|
||||
start_time = time_session_config.get("start_time")
|
||||
|
||||
if start_time is None:
|
||||
start_offset_minutes = time_session_config.get("start_offset_minutes")
|
||||
if start_offset_minutes is not None:
|
||||
start_time = (datetime.now() + timedelta(minutes=start_offset_minutes)).strftime("%H:%M")
|
||||
|
||||
return (
|
||||
start_time or default_start_time,
|
||||
time_session_config.get("end_time", default_end_time)
|
||||
)
|
||||
|
||||
|
||||
def get_product_codes(token):
|
||||
|
||||
product_codes = parse_product_codes(token.get("product_codes"))
|
||||
if product_codes:
|
||||
return product_codes
|
||||
|
||||
product_code = token.get("product_code")
|
||||
assert product_code, "Add product_code or product_codes in config.json trading_token_idas."
|
||||
return parse_product_codes(product_code)
|
||||
|
||||
|
||||
def edit_time_session_row(driver, step, row_text, start_time, end_time):
|
||||
|
||||
today = datetime.now().strftime("%d/%m/%Y")
|
||||
|
||||
click_grid_button_for_row_text(driver, row_text, "Details")
|
||||
step.capture(f"open_{row_text.lower()}_details")
|
||||
|
||||
step.click((By.XPATH, Locator.edittimesessionbtn), f"edit_{row_text.lower()}_time_session")
|
||||
|
||||
step.type((By.XPATH, Locator.timesessionstartdate), today, f"enter_{row_text.lower()}_start_date")
|
||||
step.type((By.XPATH, Locator.timesessionenddate), today, f"enter_{row_text.lower()}_end_date")
|
||||
type_first_visible_input(driver, Locator.timesessionstarttime, start_time)
|
||||
step.capture(f"enter_{row_text.lower()}_start_time")
|
||||
type_first_visible_input(driver, Locator.timesessionendtime, end_time)
|
||||
step.capture(f"enter_{row_text.lower()}_end_time")
|
||||
|
||||
step.click((By.XPATH, Locator.savetimesessionbtn), f"save_{row_text.lower()}_time_session")
|
||||
handle_transient_popups(driver)
|
||||
|
||||
|
||||
def complete_time_session_edits(driver, step, token, next_day):
|
||||
|
||||
open_trading_maintenance_page(driver, Locator.tokenandtimesessionview)
|
||||
step.capture("open_token_and_time_session_view")
|
||||
|
||||
select_bootstrap_dropdown_by_id(driver, Locator.viewproducttype, token["product_type"])
|
||||
step.capture("select_view_product_type")
|
||||
|
||||
select_bootstrap_dropdown_by_id(driver, Locator.viewproductcode, token["product_code"])
|
||||
step.capture("select_view_product_code")
|
||||
|
||||
step.type((By.XPATH, Locator.viewdeliveryfromdate), next_day, "enter_view_delivery_from_date")
|
||||
step.type((By.XPATH, Locator.viewdeliverytodate), next_day, "enter_view_delivery_to_date")
|
||||
|
||||
step.click((By.XPATH, Locator.viewsearchbtn), "search_token_and_time_session")
|
||||
click_grid_button_for_row_text(driver, "12-Mar-2026", "Time Session Details")
|
||||
step.capture("open_time_session_details")
|
||||
step.capture("before_edit_order_normal")
|
||||
|
||||
order_nor_start_time, order_nor_end_time = get_time_session_times(
|
||||
token,
|
||||
"ORDER_NOR",
|
||||
(datetime.now() + timedelta(minutes=10)).strftime("%H:%M"),
|
||||
"18:30"
|
||||
)
|
||||
order_exch_start_time, order_exch_end_time = get_time_session_times(token, "ORDER_EXCH", "18:30", "19:00")
|
||||
trade_start_time, trade_end_time = get_time_session_times(token, "TRADE", "19:00", "20:00")
|
||||
|
||||
edit_time_session_row(
|
||||
driver,
|
||||
step,
|
||||
"ORDER_NOR",
|
||||
order_nor_start_time,
|
||||
order_nor_end_time
|
||||
)
|
||||
edit_time_session_row(driver, step, "ORDER_EXCH", order_exch_start_time, order_exch_end_time)
|
||||
edit_time_session_row(driver, step, "TRADE", trade_start_time, trade_end_time)
|
||||
|
||||
click_first_grid_button(driver, "Token Details")
|
||||
step.capture("open_token_details")
|
||||
step.click((By.XPATH, Locator.savetokenandactivatebtn), "save_and_activate_token")
|
||||
handle_transient_popups(driver)
|
||||
pause_after_step()
|
||||
|
||||
|
||||
def complete_time_session_edits_from_saved_token(driver, step, token):
|
||||
|
||||
step.click((By.XPATH, Locator.tokentimesessionbtn), "open_time_session")
|
||||
click_first_grid_button(driver, "Time Session Details")
|
||||
step.capture("open_time_session_details")
|
||||
step.capture("before_edit_order_normal")
|
||||
|
||||
order_nor_start_time, order_nor_end_time = get_time_session_times(
|
||||
token,
|
||||
"ORDER_NOR",
|
||||
(datetime.now() + timedelta(minutes=10)).strftime("%H:%M"),
|
||||
"18:30"
|
||||
)
|
||||
order_exch_start_time, order_exch_end_time = get_time_session_times(token, "ORDER_EXCH", "18:30", "19:00")
|
||||
trade_start_time, trade_end_time = get_time_session_times(token, "TRADE", "19:00", "20:00")
|
||||
|
||||
edit_time_session_row(
|
||||
driver,
|
||||
step,
|
||||
"ORDER_NOR",
|
||||
order_nor_start_time,
|
||||
order_nor_end_time
|
||||
)
|
||||
edit_time_session_row(driver, step, "ORDER_EXCH", order_exch_start_time, order_exch_end_time)
|
||||
edit_time_session_row(driver, step, "TRADE", trade_start_time, trade_end_time)
|
||||
|
||||
click_first_grid_button(driver, "Token Details")
|
||||
step.capture("open_token_details")
|
||||
step.click((By.XPATH, Locator.savetokenandactivatebtn), "save_and_activate_token")
|
||||
handle_transient_popups(driver)
|
||||
pause_after_step()
|
||||
|
||||
|
||||
def create_and_activate_token(driver, step, token):
|
||||
|
||||
product_code = token["product_code"]
|
||||
|
||||
token_menu_items = driver.find_elements(By.XPATH, Locator.tokengeneration)
|
||||
if any(item.is_displayed() for item in token_menu_items):
|
||||
click_visible_menu_item(driver, Locator.tokengeneration)
|
||||
else:
|
||||
open_trading_maintenance_page(driver, Locator.tokengeneration)
|
||||
|
||||
handle_transient_popups(driver)
|
||||
step.capture(f"open_token_generation_{product_code.lower()}")
|
||||
|
||||
select_bootstrap_dropdown_by_id(driver, Locator.tokenmarketcode, token["market_code"])
|
||||
step.capture(f"select_market_code_{product_code.lower()}")
|
||||
|
||||
select_labeled_ui_dropdown(driver, "PRODUCT CODE", product_code)
|
||||
step.capture(f"select_product_code_{product_code.lower()}")
|
||||
|
||||
step.click((By.XPATH, Locator.addnewtokenbtn), f"click_add_new_token_{product_code.lower()}")
|
||||
|
||||
next_day, token_expiry = get_delivery_date_and_expiry(token)
|
||||
|
||||
step.type((By.XPATH, Locator.tokendeliverystartdate), next_day, f"enter_delivery_start_date_{product_code.lower()}")
|
||||
step.type((By.XPATH, Locator.tokendeliveryenddate), next_day, f"enter_delivery_end_date_{product_code.lower()}")
|
||||
step.type((By.XPATH, Locator.tokenexpirydate), token_expiry, f"enter_token_expiry_date_{product_code.lower()}")
|
||||
|
||||
step.click((By.XPATH, Locator.savetokenbtn), f"save_token_{product_code.lower()}")
|
||||
handle_transient_popups(driver)
|
||||
|
||||
complete_time_session_edits_from_saved_token(driver, step, token)
|
||||
|
||||
|
||||
@pytest.mark.trading_token
|
||||
def test_trading_token_creation_idas(driver, test_context):
|
||||
|
||||
config, step, token = get_token_context(driver, test_context)
|
||||
open_app_and_login(driver, step, config)
|
||||
save_session_backup(driver, test_context, "login_session_backup")
|
||||
|
||||
for product_code in get_product_codes(token):
|
||||
product_token = dict(token)
|
||||
product_token["product_code"] = product_code
|
||||
create_and_activate_token(driver, step, product_token)
|
||||
|
||||
logout(driver)
|
||||
|
||||
|
||||
# @pytest.mark.trading_token
|
||||
# def test_trading_token_time_session_edit_idas(driver, test_context):
|
||||
#
|
||||
# config, step, token = get_token_context(driver, test_context)
|
||||
# open_app_and_login(driver, step, config)
|
||||
#
|
||||
# next_day, _ = get_delivery_date_and_expiry(token)
|
||||
#
|
||||
# complete_time_session_edits(driver, step, token, next_day)
|
||||
Reference in New Issue
Block a user