class RoyalQueenSeedsCategory: """RoyalQueenSeedsCategory is selecting one random product from category page.""" PRODUCTS_LIST = (By.CSS_SELECTOR, '.product-image-link.product_img_link') COOKIE_BUTTON = (By.CSS_SELECTOR, '.cookie-popup__accept') def __init__(self, driver): self.driver = driver self.methods = BaseClass(self.driver) def accept_cookies(self): """ Clicks accept cookies button """ self.methods.wait_for_element(self.COOKIE_BUTTON).click() def click_random_product(self): """ Clicks random product from the category page """ products = self.methods.presence_of_all_elements_located( self.PRODUCTS_LIST) try: choice(products).click() except: self.click_random_product()
class DecathlonsgCartPage: """Navigating to checkout page and delete items from cart""" CHECKOUT_BUTTON = (By.CSS_SELECTOR, '.btn.btn-primary.btn-lg.btn-block') DELETE_ITEM = (By.CSS_SELECTOR, '.remove-from-cart') EMPTY_CART = (By.CSS_SELECTOR, '.alert.alert-warning') def __init__(self, driver): self.driver = driver self.methods = BaseClass(self.driver) def navigate_to_checkout_page(self): """ Navigates the checkout page then come back to the cart page """ self.methods.wait_for_element(self.CHECKOUT_BUTTON).click() self.driver.back() def delete_items_from_cart(self): """ Delete all products from cart page """ self.methods.wait_for_element(self.DELETE_ITEM).click() try: assert self.methods.wait_for_element( self.EMPTY_CART).is_displayed, True except TimeoutException: self.delete_items_from_cart()
def setUp(self): self.driver = webdriver.Chrome("C:/Users/enes.yenidogan/Desktop/chromedriver.exe") self.driver.maximize_window() self.methods = BaseClass(self.driver) self.decathlonsg_main = DecathlonsgMain(self.driver) self.decathlonsg_login = DecathlonsgLogin(self.driver) self.decathlonsg_category = DecathlonsgCategoryPage(self.driver) self.decathlonsg_product = DecathlonsgProductPage(self.driver) self.decathlonsg_cart = DecathlonsgCartPage(self.driver)
def setUp(self): self.chrome_options = webdriver.ChromeOptions() self.chrome_options.add_argument('--disable-notifications') self.driver = webdriver.Chrome(options=self.chrome_options) self.driver.maximize_window() self.methods = BaseClass(self.driver) self.royalqueenseeds_main_page = RoyalQueenSeedsMain(self.driver) self.royalqueenseeds_login_page = RoyalQueenSeedsLogin(self.driver) self.royalqueenseeds_category_page = RoyalQueenSeedsCategory( self.driver) self.royalqueenseeds_product_page = RoyalQueenSeedsProduct(self.driver) self.royalqueenseeds_cart_page = RoyalQueenSeedsCart(self.driver)
class DecathlonsgCategoryPage: """DecathlonsgCategory is selecting random product from category page .""" PRODUCT_CONTAINER = (By.ID, 'products') PRODUCT_LIST = (By.CSS_SELECTOR, '.thumbnail.product-thumbnail') def __init__(self, driver): self.driver = driver self.methods = BaseClass(self.driver) def selects_random_product(self): """ Select random products from product list. """ sleep(2) self.methods.wait_for_element(self.PRODUCT_CONTAINER) self.methods.exist_element(self.PRODUCT_LIST, multiple=True) products = self.driver.find_elements(*self.PRODUCT_LIST) if len(products) > 7: random_int = self.methods.random_number(1, 6) random_product_url = products[random_int].get_attribute('href') random_product_url = random_product_url.split('html') random_product_url = random_product_url[0] + 'html' self.driver.get(random_product_url) else: random_int = self.methods.random_number(1, len(products) - 1) random_product_url = products[random_int].get_attribute('href') random_product_url = random_product_url.split('html') random_product_url = random_product_url[0] + 'html' self.driver.get(random_product_url)
class RoyalQueenSeedsProduct: """Product page to select size and add to cart.""" NUMBER_SEEDS_CONTAINER = (By.CSS_SELECTOR, '.attributes-block') ADD_TO_CART = (By.CSS_SELECTOR, '#add_to_cart') ADDED_TO_CART = (By.ID, 'cart_block_total') PRODUCT_STOCK = (By.ID, 'availability_value') POPUP_CLOSE_BUTTON = (By.XPATH, '') OUT_OF_STOCK = (By.CSS_SELECTOR, '#availability_value') def __init__(self, driver): self.driver = driver self.methods = BaseClass(self.driver) # def select_size(self): # """ # Selects product size # # """ # if self.methods.element_exists(self.NONE_SIZE): # self.methods.wait_for_element(self.AVAILABLE_SIZE).click() def check_stock_info(self): """ Search for stock info if the product is not in stock returns False """ availability = self.methods.presence_of_element_located(self.OUT_OF_STOCK).text if availability.lower() != 'no stock': return True else: return False def add_product_to_cart(self): """ Adds product to the cart page and check is it added successfully """ sleep(1) cart_total = self.methods.presence_of_element_located(self.ADDED_TO_CART).text self.methods.wait_for_element(self.ADD_TO_CART).click() if self.methods.element_exists(self.ADDED_TO_CART): try: sleep(1) successfully_added = self.methods.presence_of_element_located(self.ADDED_TO_CART).text assert cart_total != successfully_added # change assertion if any bug appears except AssertionError: self.add_product_to_cart() else: self.add_product_to_cart()
class RoyalQueenSeedsLogin: """Website login page to user logged in.""" email = '*****@*****.**' password = '******' EMAIL = (By.NAME, 'email') PASSWORD = (By.NAME, 'passwd') LOGIN_BUTTON = (By.ID, "SubmitLogin") def __init__(self, driver): self.driver = driver self.methods = BaseClass(self.driver) def login(self): """ Fills login informations """ self.methods.wait_for_element(self.EMAIL).send_keys(self.email) self.methods.wait_for_element(self.PASSWORD).send_keys(self.password) self.methods.wait_for_element(self.LOGIN_BUTTON).click()
def __init__(self, driver): self.driver = driver self.methods = BaseClass(self.driver)
class DecathlonsgLogin: """Website login page to user logged in.""" email = '*****@*****.**' password = '******' EMAIL = (By.ID, 'input-email-or-mobile') PASSWORD = (By.ID, 'input-password') NEXT_BUTTON = (By.CLASS_NAME, "sb-button.blue") CONFRIM_BTN = (By.ID, "signin-button") def __init__(self, driver): self.driver = driver self.methods = BaseClass(self.driver) def login(self): """ Fills login informations """ sleep(2) self.methods.wait_for_element(self.EMAIL).click() self.methods.wait_for_element(self.EMAIL).send_keys(self.email) self.methods.wait_for_element(self.NEXT_BUTTON).click() self.methods.wait_for_element(self.PASSWORD).click() self.methods.wait_for_element(self.PASSWORD).send_keys(self.password) self.methods.wait_for_element(self.CONFRIM_BTN).click()
class DecathlonsgMain: """DecathlonsgMain class lands in the website and it has all the navigation functions.""" website = 'https://www.decathlon.sg/' HOMEPAGE_CONTROL = (By.CSS_SELECTOR, '.elementor-container.elementor-column-gap-default') LOGIN_HEADER = (By.CSS_SELECTOR, '#header-user-btn') LOGIN_BUTTON = (By.CSS_SELECTOR, '.elementor-button-text') SECOND_LOGIN_BUTTON = (By.CSS_SELECTOR, 'elementor-button-content-wrapper') MAIN_CATS_CONTAINER_HEADER = (By.XPATH, '//*[contains(@class, "cbp-has-submeu")]') SUB_CATS_CONTAINER_HEADER = (By.XPATH, '//*[contains(@class, "cbp-category-title")]') CART_HEADER = (By.ID, 'button_cart_cart') def __init__(self, driver): self.driver = driver self.methods = BaseClass(self.driver) def navigate_to_home_page(self): """ Navigates to the homepage and checks it """ self.driver.get(self.website) home_page_loaded = self.methods.exist_element(self.HOMEPAGE_CONTROL) assert home_page_loaded, True def navigate_to_login_page(self): """ Navigates to the login page """ sleep(3) try: self.methods.hover_element(self.LOGIN_HEADER) self.methods.wait_for_element(self.LOGIN_BUTTON).click() except (TimeoutException, ElementClickInterceptedException): self.navigate_to_login_page() def navigate_to_random_category_page(self): """ Navigates to a random category page """ self.methods.exist_element(self.SUB_CATS_CONTAINER_HEADER, multiple=True) main_categories = self.driver.find_elements(*self.MAIN_CATS_CONTAINER_HEADER) sub_categories = self.driver.find_elements(*self.SUB_CATS_CONTAINER_HEADER) self.methods.select_random_category(sub_categories, main_categories) def navigate_to_cart_page(self): """ Navigates to the cart page. if self.methods.exist_element(DecathlonsgProductPage.IFRAME_IS_OPENED): iframe_name = self.methods.presence_of_element_located(self.IFRAME).get_attribute('name') self.driver.switch_to.frame(iframe_name) self.methods.wait_for_element(DecathlonsgProductPage.CLOSE_POPUP_BTN).click() self.driver.switch_to.default_content() self.methods.wait_for_element(self.CART_HEADER).click() else: self.methods.wait_for_element(self.CART_HEADER).click() """ self.driver.get("https://www.decathlon.sg/cart")
class RoyalQueenSeedsMain: """RoyalQueenSeedsMain class lands in the website and it has all the navigation functions.""" website = 'https://www.royalqueenseeds.com/' AGE_CONTROL = (By.CSS_SELECTOR, '.button.enter-btn') HEADER_LOGIN = (By.XPATH, '//a[@title="Your Account"]') LOGIN_BUTTON = (By.XPATH, '//a[@title="Log in"]') HOMEPAGE_CONTROL = (By.ID, 'slide-holder') HEADER_CATS_CONTAINER = (By.XPATH, '//a[contains(@class, "cat_")]') CART_PAGE = (By.XPATH, '//a[contains(@class, "top-cart-checkout")]' ) # '//*[@title="Check out"]' def __init__(self, driver): self.driver = driver self.methods = BaseClass(self.driver) def navigate_to_home_page(self): """ Navigates to the homepage and checks it """ self.driver.get(self.website) self.methods.wait_for_element(self.AGE_CONTROL).click() home_page_loaded = self.methods.element_exists(self.HOMEPAGE_CONTROL) assert home_page_loaded, True def navigate_to_login_page(self): """ Navigates to the login page """ try: self.methods.wait_for_element(self.HEADER_LOGIN) self.methods.hover(self.HEADER_LOGIN) self.methods.wait_for_element(self.LOGIN_BUTTON).click() except TimeoutException: self.methods.hover(self.HEADER_LOGIN) self.methods.wait_for_element(self.LOGIN_BUTTON).click() sleep(2) def navigate_to_random_category_page(self): """ Navigates to a random category page """ sleep(2) categories = self.driver.find_elements(*self.HEADER_CATS_CONTAINER) random_value = self.methods.random_number(0, len(categories) - 1) random_category = categories[random_value] random_category.click() def navigate_to_cart_page(self): """ Navigates to the cart page """ self.methods.wait_for_element(self.CART_PAGE).click()
class DecathlonsgProductPage: """DecathlonsgProduct is select exits size, check stock info and add product to cart.""" ADD_TO_CART_EXISTS = (By.CLASS_NAME, "add") NONE_SIZE = (By.CSS_SELECTOR, '//*[@style="display:none"]') AVAILABLE_SIZE = (By.CLASS_NAME, 'radio-label') ADD_TO_CART = (By.CSS_SELECTOR, '.btn.btn-primary.btn-lg') ADD_TO_CART_ICON = (By.CSS_SELECTOR, '.bag-icon') CLOSE_POPUP_BTN = (By.ID, 'logo') MINIFY_POPUP_BTN = (By.CSS_SELECTOR, '[aria-label="close"]') ADDED_TO_CART = (By.CSS_SELECTOR, '.sc-cart-summary-line') OUT_OF_STOCK = (By.XPATH, './/*[text()=" There are not enough products in stock "]') IFRAME_IS_OPENED = (By.CSS_SELECTOR, '.anchor_right.fb_customer_chat_bounce_in_v2') IFRAME = (By.CSS_SELECTOR, '[data-testid="dialog_iframe"]') def __init__(self, driver): self.driver = driver self.methods = BaseClass(self.driver) def select_size(self): """ Selects product size """ if self.methods.exist_element(self.NONE_SIZE): self.methods.wait_for_element(self.AVAILABLE_SIZE).click() def check_stock_info(self): """ Search for stock info if the product is not in stock returns False """ if self.methods.exist_element(self.OUT_OF_STOCK): return False else: return True def add_product_to_cart(self): """ Adds product to the cart page and check is it added successfully. """ if self.methods.exist_element(self.ADD_TO_CART_EXISTS): try: if self.methods.exist_element(self.IFRAME_IS_OPENED): iframe_name = self.methods.presence_of_element_located( self.IFRAME).get_attribute('name') self.driver.switch_to.frame(iframe_name) self.methods.wait_for_element( DecathlonsgProductPage.MINIFY_POPUP_BTN).click() self.driver.switch_to.default_content() self.methods.wait_for_element( self.ADD_TO_CART_ICON).click() self.methods.wait_for_element(self.ADD_TO_CART_ICON).click() assert self.methods.exist_element( self.ADDED_TO_CART), "ADD_TO_CART is not clickable" except: self.driver.execute_script("window.scrollTo(0, 400)") self.methods.wait_for_element(self.ADD_TO_CART_ICON).click() else: assert self.methods.wait_for_element( self.ADD_TO_CART_EXISTS).is_displayed( ), "No add to cart button"
class RoyalQueenSeedsCart: """Navigating to checkout page and delete items from cart""" CHECKOUT_BUTTON = (By.CSS_SELECTOR, '#shoppingCartCheckout') DELETE_ITEM = (By.XPATH, '//img[@class= "icon"]') EMPTY_CART = (By.ID, 'emptyCartWarning') BACK_TO_CART = (By.ID, 'cart-buttons') BELOW_MINIMUM_ORDER_AMOUNT = (By.XPATH, '//a[@class="back"][@title= "Previous"]') SCROLL_TO_TOP = (By.TAG_NAME, 'body') def __init__(self, driver): self.driver = driver self.methods = BaseClass(self.driver) def navigate_to_checkout_page(self): """ Navigates the checkout page then come back to the cart page """ self.driver.execute_script("window.scrollTo(0,document.body.scrollHeight);") self.methods.wait_for_element(self.CHECKOUT_BUTTON).click() if self.methods.element_exists(self.BELOW_MINIMUM_ORDER_AMOUNT): try: self.methods.wait_for_element(self.BACK_TO_CART).click() except TimeoutException: self.driver.execute_script("window.history.go(-1)") else: self.driver.execute_script("window.history.go(-1)") def delete_items_from_cart(self): """ Deletes product from the cart page and check if it is any left. If it is exist, deletes that one too """ self.methods.wait_for_element(self.SCROLL_TO_TOP).send_keys(Keys.CONTROL + Keys.HOME) if self.methods.element_exists(self.DELETE_ITEM): try: self.methods.wait_for_element(self.DELETE_ITEM).click() assert self.methods.wait_for_element(self.EMPTY_CART).is_displayed, True except TimeoutException or AssertionError: self.delete_items_from_cart() else: assert self.methods.wait_for_element(self.EMPTY_CART).is_displayed