class Day(WebElement): date = Find(by=By.XPATH, value="./div[@class='cal_month_day_date ng-binding']") events_list = Finds(Event, by=By.XPATH, value=".//div[@class='cal_week_event ng-scope']") view_all = Find(by=By.XPATH, value=".//a[text()='[View All]']")
class ChannelPayrollPage(BasePage): url = 'https://ci004.godo.io/channel_payroll.aspx' channel_payment_due = Find(by=By.XPATH, value="//a[@id='payrolldetailplus_']") channel_paid = Find(by=By.XPATH, value="//a[@id='paymentPaidChannel']") channel_entries = Finds(by=By.XPATH, value="//tbody[@ng-repeat='payment in vm.channelPaymentDue track by $index']") channel_names = Finds(by=By.XPATH, value="//tbody[@ng-repeat='payment in vm.channelPaymentDue track by $index']") channel_paid_entries = Finds(by=By.XPATH, value="//tr[@ng-repeat='payment in vm.channelPaid track by $index']") channel_paid_amounts = Finds(by=By.XPATH, value="//*[@id='dtChannelPaid']/tbody/tr/td[4]") channel_detail = Finds(by=By.XPATH, value="//a[@ng-click='vm.showDetails(payment.channelId)']") direct_deposit = Finds(by=By.XPATH, value="//input[@value='directdeposit']") cash = Finds(by=By.XPATH, value="//input[@value='cash']") check = Finds(by=By.XPATH, value="//input[@value='check']") check_number = Finds(by=By.XPATH, value="//input[@type='text']") pay_button = Finds(by=By.XPATH, value="//button[@ng-click='vm.commitChannelPayment(payment)']") OK_button = Find(by=By.XPATH, value="//button[@ng-click='vm.cancel()']") guide_list = Find(by=By.XPATH, value="//select[@id='selectGuides']") event_due = Finds(by=By.XPATH, value ="//*[contains(@id,'guidePayroll')]/tbody/tr[1]/td[6]") activity_timedate = Finds(by=By.XPATH, value ="//a[contains(@ng-click,'vm.openManifest')]") show_entries = Find(by=By.XPATH, value="//select[@name='guidePayrollAll_length']") payment_entry = Finds(by=By.XPATH, value="//tr[@class='row']|//tr[@class='odd']|//tr[@class='even']")
class SearchForm(BasePage): min_price_input = Find(by=By.XPATH, value="//input[@name='price_before']") max_price_input = Find(by=By.XPATH, value="//input[@name='price_after']") show_results = Find( by=By.XPATH, value="//div[contains(@class, 'ModelFilter__ParamListBtnSel')]//span") def select_brand(self, brand): Find(by=By.XPATH, value="//div[@id='Attr_prof_1000']//label[text()='{}']".format( brand), context=self).click() LOGGER.info("Brand has been set to '%s'", brand) def select_min_price(self, min_price): self.min_price_input.send_keys(min_price) LOGGER.info("Min price has been set to '%s'", min_price) def select_max_price(self, max_price): self.max_price_input.send_keys(max_price) LOGGER.info("Max price has been set to '%s'", max_price) def click_show_results(self): self.show_results.click() LOGGER.info("Click show results button")
class ResultItem(WebElement): title = Find(by=By.XPATH, value=".//span[@itemprop='name']") min_price = Find(by=By.XPATH, value=".//span[@class='PriceBlock__PriceValue']/span") max_price = Find( by=By.XPATH, value=".//span[contains(@class, 'PriceBlock__PriceLastValue')]/span")
class CartPage(BasePage): order = Find( by=By.CSS_SELECTOR, value= "a[class='button-style button-style_primary button-style_small cart-form__button']" ) order_form = Find(by=By.CSS_SELECTOR, value="div[class='cart-form__flex']") remove = Find( by=By.XPATH, value= "//div[@class='cart-form__offers-part cart-form__offers-part_remove']/div/a" ) remove_field = Find(by=By.XPATH, value="//div[@class='cart-form__control']//input") def click_order_link(self): wait(self.order.is_displayed) self.order.click() def click_remove_field(self): wait(self.remove_field.is_displayed) self.remove_field.click() def click_remove(self): wait(self.remove.is_displayed) self.remove.click()
class LoginPage(BasePage): def __init__(self, domain, *args, **kwargs): super().__init__(url=domain, *args, **kwargs) # Base login page. login_input = Find(by=By.NAME, value="username") password_input = Find(by=By.NAME, value="password") login_button = Find(by=By.CSS_SELECTOR, value="input[type=submit]") # Page to select company for call center user. ccu_companyList.aspx logout_button = Find(by=By.XPATH, value="//a[@href='/login.aspx?command=logout']") company_list = Finds(CompanyList, by=By.XPATH, value="//tbody/tr") def choose_company(self, company): for item in self.company_list: title = item.company_name.text if title == company: item.login_button.click() break def get_url(self): return self._driver.current_url
class PackagesCreatePage(AbstractBasePage): createPackageHeader = Find(by=By.XPATH, value='.//*[text()="Create a Package"]') packageNameField = Find(by=By.XPATH, value='.//*[@name="description"]') templateDropdown = Find(by=By.XPATH, value='.//*[text()="Select template"]/parent::*') atLeastOneAccount = Find(by=By.XPATH, value='.//td[text()="1"]') firstStrategy = Find(by=By.XPATH, value='.//*[text()="StratiFi RE RR"]') def __init__(self): AbstractBasePage.__init__( self, "http://operations.stratifi.com/packages/create") # ------------Clicks------------------------------ def select_the_first_strategy(self): self.firstStrategy.click() # ------------Send Keys------------------------------ def enter_package_name(self, package_name): self.packageNameField.send_keys(package_name) # ---------------Asserts------------------------------- def check_if_there_is_at_least_one_account(self): assert self.is_element_present( "atLeastOneAccount", timeout=60), "There are no accounts for selected strategy" def check_if_create_a_package_page_is_loaded(self): assert self.is_element_present( "createPackageHeader", timeout=10), "Create package page was not loaded"
class GrouponPage(BasePage): import_codes = Find(by=By.XPATH, value="//div[@name='inputCodeForm']//button") groupon_list = Finds(GrouponList, by=By.XPATH, value="//tbody/tr") details = Find(by=By.XPATH, value="//a[text()='Details']") view_redemptions = Find(by=By.XPATH, value="//a[text()='View Redemptions']") view_codes = Find(by=By.XPATH, value="//a[text()='View Codes']") code_list_not_redeemed = Finds(CodeList, by=By.XPATH, value="//td[text()=0]/..") code_list_redeemed = Finds(CodeList, by=By.XPATH, value="//td[text()=1]/..") def select_groupon(self, name): for item in self.groupon_list: if item.groupon_name.text == name: item.edit_button.click() break def copy_code(self, order): for item in self.code_list_not_redeemed: if item.redeemed.text == "0": order.promo_code = item.code.text break def copy_redeemed_code(self, order): for item in self.code_list_redeemed: if item.redeemed.text == "1": order.promo_code = item.code.text break
class ModelsPage(AbstractBasePage, unittest.TestCase): createdModelsHeader = Find(by=By.XPATH, value='.//*[text()="Created Models"]') targetModel = Find(by=By.XPATH, value='.//*[text()="Model for autotest"]') archiveButtonForTargetModel = Find( by=By.XPATH, value='.//*[text()="Model for autotest"]/following::*[text()="Archive"]' ) def __init__(self): AbstractBasePage.__init__( self, "https://advisors.stratifi.com/advisor/models") # --------------Clicks----------------------- def press_archive_button_for_target_model(self): self.archiveButtonForTargetModel.click() # ---------------Asserts------------------------------- def check_models_page_loaded(self): assert self.is_element_present( "createdModelsHeader", timeout=10), "Models page was not loaded" def check_if_created_model_is_in_the_list(self): assert self.is_element_present( "targetModel", timeout=10), "Unable to find a target model" def check_if_target_model_was_deleted(self): self.assertFalse(self.is_element_present("targetModel", timeout=10), "Target model was not deleted")
class CatalogPage(BasePage): subsections = Finds(by=By.XPATH, value="//ul[@class='catalog-bar__list']/li/a") subsection_page_header = Find(by=By.CSS_SELECTOR, value="h1[class='schema-header__title']") products = Finds(by=By.XPATH, value="//a[@data-bind='attr: {href: product.html_url}']/span/..") compare_button = Find(by=By.CSS_SELECTOR, value="a[class ='compare-button__sub compare-button__sub_main']") remove_compare_icon = Find(by=By.CSS_SELECTOR, value="a[title='Очистить список сравнения']") remove_compare_button = Find(by=By.CSS_SELECTOR, value="a[class='compare-button__sub']") def click_subsection_link(self, index): self.subsections[index].click() def click_product_link(self, index): wait(self.subsection_page_header.is_displayed) self.products[index].click() def click_compare(self): wait(self.compare_button.is_displayed) self.compare_button.click() def click_remove_compare_icon(self): wait(self.remove_compare_icon.is_displayed) self.remove_compare_icon.click() def click_remove_compare_button(self): wait(self.remove_compare_button.is_displayed) self.remove_compare_button.click()
class LoginPage(KibanaBasePage): ''' Kibana Login Page ''' username_field = Find(**data_test_subj('loginUsername')) password_field = Find(**data_test_subj('loginPassword')) login_button = Find(**data_test_subj('loginSubmit')) def __init__(self, **kwargs): super().__init__(**kwargs) def loaded(self): wait(lambda: self.is_element_present('username_field') is True) def enter_username(self, name): self.username_field.clear() self.username_field.send_keys(name) def enter_password(self, password): self.password_field.clear() self.password_field.send_keys(password) def click_submit(self): self.login_button.click() def login(self, username, password): self.open() self.loaded() self.enter_username(username) self.enter_password(password) self.click_submit()
class PaymentsPage(BasePage): '''Объект страницы платежи search_input {WebElemnt} - Поле для поиска по названию или ИНН communal_payment {WebElemnt} - ссылка на выбор категории "ЖКХ" proposal_list {WebElemnt} - список совпадений, при вводе значений в search_input ''' search_input = Find( by=By.CSS_SELECTOR, value="input[placeholder*='Название или ИНН получателя']" ) communal_payment = Find(by=By.CSS_SELECTOR, value="div[aria-label='ЖКХ'") proposal_list = Finds(by=By.CSS_SELECTOR, value="div[data-qa-file='GridColumn']") def proposal_list_text(self): """Возвращает текст элементов из списка совпадений Returns: [List] """ return [provider.text for provider in self.proposal_list] def stateless_input(self, name): """Поиск по названию/ИНН. После ввода в поискову строку, ожидает появление списка совпадений Arguments: name {str} -- [Название/ИНН] """ self.search_input.send_keys(name) wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div[data-qa-file='GridColumn']")))
class DocumentsPage(AbstractBasePage, unittest.TestCase): reviewDocumentsHeader = Find( by=By.XPATH, value='.//*[@class="container"]/child::*[text()="Review Documents"]') markAsSubmittedFirst = Find(by=By.XPATH, value='(.//*[text()="Mark as submitted"])[1]') markAsSubmittedSecond = Find(by=By.XPATH, value='(.//*[text()="Mark as submitted"])[2]') markAsSubmittedThird = Find(by=By.XPATH, value='(.//*[text()="Mark as submitted"])[3]') sendButton = Find(by=By.XPATH, value='.//*[text()="Send"]') almostThereHeader = Find(by=By.XPATH, value='.//*[text()="Almost there!"]') sendButtonOnAlmostThereScreen = Find( by=By.XPATH, value='.//*[text()="Almost there!"]/following::*[text()="Send"]') congrats = Find(by=By.XPATH, value='.//*[text()="Congratulations!"]') okButton = Find(by=By.XPATH, value='.//*[text()="OK"]') linkAccBreadCrumb = Find(by=By.XPATH, value='.//*[text()="Link Accounts"]') def __init__(self): AbstractBasePage.__init__( self, "https://advisors.stratifi.com/advisor/investors/17/documents") # --------------Clicks----------------------- def mark_all_documents_as_signed(self): self.markAsSubmittedFirst.click() self.markAsSubmittedSecond.click() self.markAsSubmittedThird.click() def press_send_button(self): self.sendButton.click() def press_ok_button(self): self.okButton.click() def press_send_button_on_almost_there_screen(self): self.sendButtonOnAlmostThereScreen.click() def press_link_acc_breadcrumb(self): self.linkAccBreadCrumb.click() # ---------------Asserts------------------------------- def check_if_documents_page_is_loaded(self): assert self.is_element_present( "reviewDocumentsHeader", timeout=20), "Unable to load Review Documents Page" def check_if_almost_there_shown(self): assert self.is_element_present( "almostThereHeader", timeout=20), "Almost there! screen was not shown" def check_if_congrats_massage_was_shown(self): assert self.is_element_present( "congrats", timeout=20), "Congratulations! message was not shown"
class MainPage(BasePage): ver_label = Find(by=By.XPATH, value='//*[@id="verNo"]/div') reboot_link_btn = Find(by=By.LINK_TEXT, value="Reboot") reboot_ok_btn = Find(by=By.XPATH, value="//button[@class='button green']") label_list = Finds( by=By.XPATH, value= '//div[@class="ant-col ant-form-item-control-wrapper"]/div/span/div/div[@class="ant-row"]/div[1]' )
def __init__(self, product_entry): self.a_link = Find(by=By.CSS_SELECTOR, value="a.s-access-detail-page", context=product_entry) self.name = Find(by=By.CSS_SELECTOR, value="h2.s-access-title", context=product_entry).get_attribute('data-attribute') self.dash_name = '-'.join(self.name.split(' ')) self.url = self.a_link.get_attribute('href')
class CalendarPage(BasePage): days_list = Finds(Day, by=By.XPATH, value="//div[@class='cal_month_day ng-scope']") without_booking = Find(by=By.XPATH, value="//label[@for='hide-without-booking']") preloader_image = Find(by=By.XPATH, value="//img[@src='/assets/images/preloader.gif']") view_all_links = Finds(by=By.XPATH, value=".//a[text()='[View All]']")
class Price(BasePage): min = Find(Textfield, By.XPATH, value='//*[@id="price[min]"]') max = Find(Textfield, By.XPATH, value='//*[@id="price[max]"]') ok = Find(by=By.ID, value='submitprice') def price(self, min, max): self.min.send_keys(min) self.min.send_keys(Keys.TAB) self.max.send_keys(max) self.ok.click()
class JakDojadePage(BasePage): url = 'https://jakdojade.pl/wroclaw/trasa/' from_field = Find(by=By.CSS_SELECTOR, value='.cn-direction-a input') to_field = Find(by=By.CSS_SELECTOR, value='.cn-direction-b input') find_routes = Find(by=By.CSS_SELECTOR, value='#cn-planner button.cn-planner-action-button') header = Find(by=By.CSS_SELECTOR, value='header') routes = Finds(RoutePropositionWidget, By.CSS_SELECTOR, value='.cn-planner-routes-results')
class LoginPage(BasePage): username_input = Find(by=By.CSS_SELECTOR, value="input[type='text'][placeholder='Ник или e-mail']") password_input = Find(by=By.CSS_SELECTOR, value="input[type='password']") submit_button = Find(by=By.XPATH, value="//div/button") def type_username(self, username): self.username_input.send_keys(username) def type_password(self, password): self.password_input.send_keys(password) def click_submit(self): self.submit_button.click()
class GooglePage(BasePage): url = "https://www.google.com" search_field = Find(by=By.NAME, value="q") search_button = Find(by=By.NAME, value="btnK") def open(self): BasePage.open(self) assert "Google" in get_driver_no_init().title def search(self, text_to_search): self.search_field.send_keys(text_to_search) self.search_field.submit() return ResultPage()
class RequestOFFPage(BasePage): url = 'https://ci004.godo.io/guide_requestOff.aspx' request_off_entry = Finds( by=By.XPATH, value="//tr[@class='row']|//tr[@class='odd']|//tr[@class='even']") approval_dropdown = Finds( by=By.XPATH, value="//select[contains(@id, 'requestoff_status_')]") not_approved_button = Find(by=By.XPATH, value="//label[@class ='btn btn-danger']") approved_button = Find(by=By.XPATH, value="//label[@class ='btn btn-success']") tables = Finds(by=By.XPATH, value="//table[@id = 'dtRequestOff']") rows = Finds(by=By.XPATH, value="//*[@id='dtRequestOff']/tbody/tr")
def __init__(self, asin): super(DetailsPage, self).__init__(driver=Driver.get()) self.list_asin = asin self.asin = Find(by=By.XPATH, value="//li[b[contains(text(), 'ASIN:')]]", context=self).text.split(':')[1].strip() self.string_date_first = Find( by=By.XPATH, value= "//li[b[contains(text(), 'Date first available at Amazon.com.au:')]]", context=self).text.split(':')[1].strip() self.date_first = datetime.strptime(self.string_date_first, "%d %B %Y") self.body = Find(by=By.TAG_NAME, value="body", context=self)
class LaptopsPageLocators(BasePage): laptops_name = Finds(by=By.XPATH, value='.//*[@class="ModelFilter__CheckboxLink"]/a') laptops_price_min_input = Find(by=By.CSS_SELECTOR, value="#minnum_45") laptops_price_max_input = Find(by=By.CSS_SELECTOR, value="#maxnum_45") show_laptops_diagonal_results = Find( by=By.XPATH, value=".//*[@id='Attr_prof_5828']/div/div[2]/span[1]") show_laptops_name_results = Find( by=By.XPATH, value=".//*[@id='Attr_prof_1000']/div/div[2]/span[1]") diagonal_checkbox = Finds(by=By.XPATH, value='.//*[@class="ModelFilter__CheckboxLink"]')
class MainPage(BasePage): account_button = Find(by=By.XPATH, value="//*[@id='gb']/div[1]/div[1]/div[2]/div[5]/div[1]/a") logout_button = Find(by=By.XPATH, value="//*/a[contains(text(), 'Выйти')]") def __init__(self, driver): self.driver = driver self.wait = WebDriverWait(driver, 10) super(MainPage, self).__init__(url="https://mail.google.com/mail/#inbox", driver=driver) def logout(self): self.account_button.click() self.wait.until(expected_conditions.visibility_of(self.logout_button)) self.logout_button.click()
class FlightResultsPage(BasePage): flightList = Find(by=By.XPATH, value='.//div[@id="flight-listings"]') flightPrice = Find(by=By.XPATH, value='(.//article[contains(@class,"contract-block")]/descendant::strong[contains(@id,' '"TOTALFARE")]/span)[1]') def validate_flight_results_page_is_displayed(self): self.is_element_present("flightList", timeout=30), "flightList was not displayed" assert "air/Listing/" in self._driver.current_url, "Flights list url is not right" def validate_price_from_first_result_is_more_than_zero(self): self.is_element_present("flightPrice", timeout=10), "Can't find flightPrice" # Get price value from first result price = self.flightPrice.get_attribute('defaultvalue') assert price > 0, "Price value should be positive"
class SitePage(BasePage): new_page_link = Find(Link, by=By.XPATH, value='//a[@href="/new/"]') cart_link = Find(Link, by=By.XPATH, value='//a[@class="trigger" and @href="/cart/"]') def open_cart_page(self): self.cart_link.click() return CartPage(self._driver) def open_new_products_page(self): self.new_page_link.click() return NewPage(self._driver)
def open_page_number( self, number ): #TODO make smart pagination navigation that doesn't depend on current state current_page = Find(by=By.CSS_SELECTOR, value="span.pagnCur", context=self) logging.info(' '.join([current_page.text, str(number)])) if current_page.text == str(number): pass else: xpath_page_link = '//span[contains(@class, "pagnLink")]/a[contains(text(), "%d")]' % number logging.info(xpath_page_link) page_link = Find(by=By.XPATH, value=xpath_page_link, context=self) page_link.click() self.update_product_list()
class Headers(BasePage): button_zapis = Find(by=By.XPATH, value=".//a[@class='zapisatsya']") def __init__(self): self.url = 'http://old.qalight.com/' self.__driver = webdriver.Chrome() #BasePage.__init__(self, url='http://oldqalight.com') BasePage._driver = self.__driver self._driver.maximize_window() def open_home_page(self): if not self.url: raise WebiumException('Can\'t open page without url') self.__driver.get(self.url) logger.info('open home page') def open_zapisatsya(self): try: window_before = self.__driver.window_handles[:] #print(window_before) self.button_zapis.click() window_after = self.__driver.window_handles[-1] #print(window_after) self.__driver.switch_to_window(window_after) self.close_page() self.__driver.switch_to_window(window_before[0]) except Exception as exc: logger.error('open_zapisatsya: {0}'.format(exc)) raise exc else: logger.info('open_zapisatsya') def close_page(self): self.__driver.close()
class Sidebar(KibanaBasePage): ''' Kibana Login Page ''' DISCOVER = 'Discover' VISUALIZE = 'Visualize' DASHBOARD = 'Dashboard' TIMELION = 'Timelion' MACHINE_LEARNING = 'Machine Learning' GRAPH = 'Graph' DEV_TOOLS = 'Dev Tools' MONITORING = 'Monitoring' MANAGEMENT = 'Management' COLLAPSE = 'Collapse' EXPAND = 'Expand' LOGOUT = 'Logout' sidebar_main = Find(by=By.CLASS_NAME, value='global-nav__links') sidebar_links = Finds(Link, **data_test_subj('global-nav-link appLink')) def __init__(self, **kwargs): super().__init__(**kwargs) def loaded(self): wait(lambda: self.is_element_present('sidebar_main') is True) def click_link_text(self, text): for link in self.sidebar_links: if link.text == text: link.click() break def is_link_visible(self, text): return text in self.sidebar_main.text.split('\n')
class LoginPage(BasePage): email_field = Find(by=By.ID, value="login-email") password_field = Find(by=By.ID, value="login-password") submit_button = Find(by=By.XPATH, value="//form/button[.='Log In']") def type_email(self, value): wait(self.email_field.is_displayed) self.email_field.send_keys(value) def type_password(self, value): wait(self.password_field.is_displayed) self.password_field.send_keys(value) def click_submit_button(self): wait(self.submit_button.is_displayed) self.submit_button.click()