def __init__(self): self.title = s('.sub-header') self.organizationField = s( by.xpath("//*[text()='Наименование организации']" "/ancestor::div[contains(@class, 'ErrorNotificator')]")) self.userNameField = s( by.xpath("//*[text()='Ф.И.О. пользователя полностью']" "/ancestor::div[contains(@class, 'ErrorNotificator')]")) self.emailField = s( by.xpath("//*[text()='Рабочая электронная почта']" "/ancestor::div[contains(@class, 'ErrorNotificator')]")) self.phoneField = s( by.xpath("//*[text()='Номер телефона для связи с пользователем']" "/ancestor::div[contains(@class, 'ErrorNotificator')]")) self.mobileOsField = s( by.xpath("//*[text()='Операционная система мобильного устройства']" "/ancestor::div[contains(@class, 'ErrorNotificator')]")) self.googlePlayField = s( by.xpath("//*[text()='Учётная запись в Google Play']" "/ancestor::div[contains(@class, 'ErrorNotificator')]")) self.loginCheckBox = s(by.xpath("//input[@type='checkbox']")) self.loginField = s( by.xpath("//*[text()='Логин пользователя']" "/ancestor::div[contains(@class, 'ErrorNotificator')]")) self.scanUpload = s( by.xpath("//input[@type='file' and @class='upload-input']")) self.loginButton = s( by.xpath("//*[text()='Отправить']/ancestor::button")) self.formErrors = ss('.error')
def search_organization(self, input_text, hint_list): self.BranchName.set_value(input_text) #Вводим значение для поля self.ShowButton.click() self.ClearButton.click() a = hint_list for i, ii in enumerate(a): self.BranchName.set_value(a[i]) self.ShowButton.click() field_info = a[i] element_to_select = s(by.xpath(f".//*[text()='{field_info}']")) b = element_to_select.text print(a[i]) print(b) #self.ClearButton.click() element_to_select.click() self.ShowSessions.click() self.TimeSelection.click() self.SelectDate.click() self.DateChoose.click() self.DateChoose.click() self.ShowButton.click() element_of_time = s( by.xpath( "//*[@class='mui-date-picker']/descendant-or-self::*[text()='Выберите начало промежутка']/following-sibling::input" )) c = element_of_time.get_attribute('value') print(c) self.ClearButton.click() #value_to_select = organization_list.s(by.xpath("//*[text()='1']/ancestor::*[@role='gridcell']")) assert field_info == b self.FirstElementSessionTable.click() self.open3()
def select_mobile_os(self, value): self.mobileOsField.s('button').click() mobile_os_list = s(by.xpath("//*[@role='menu']")) mobile_os_list.should(visible) value_to_select = mobile_os_list.s( by.xpath(f"//*[text()='{value}']/ancestor::*[@role='menuitem']")) value_to_select.click() mobile_os_list.should_not(visible) assert value in self.mobileOsField.text, f'Мобильная ОС: {value} не выбрана'
def __init__(self, element: SeleneElement): self.element = element self.title = element.s(by.css("h6")) self.description = element.s(by.css("div.card-body p")) self.like_button = \ element.s(by.xpath(".//button[*[name()='svg' and contains(@class,'fa-thumbs-up')]]")) self.delete_button = \ element.s(by.xpath(".//button[*[name()='svg' and contains(@class,'fa-times-circle')]]")) self.loading_circle = element.s(by.css("svg.fa-circle-notch"))
def select_District(self, value): self.District.click() organization_list = s(by.xpath("//*[@role='menu']")) organization_list.should(visible) value_to_select = organization_list.s( by.xpath("//*[text()='ТАО']/ancestor::*[@role='menuitem']")) value_to_select.click() organization_list.should_not(visible) self.ShowButton.click() self.ClearButton.click()
def open_bar(self, bar_xpath: str, opener_xpath: str) -> None: """ Открыть выдвигающуюся панель :param bar_xpath: Xpath панели :param opener_xpath: Xpath элемента открывания панели """ self.log.debug(f"Work '{self.get_method_name()}'") # Если панель закрыта, то открыть if "width: 0px;" in s(by.xpath(bar_xpath)).get_attribute("style"): self.shading_disappearing() # Затемнение self.highlight(s(by.xpath(opener_xpath))) s(by.xpath(opener_xpath)).click() # Проверить, что панель открылась assert "width: 0px;" not in s( by.xpath(bar_xpath)).get_attribute("style")
def select_workstation(self): self.WorkstationField.click() workstation_list = s(by.xpath("//*[@role='menu']")) workstation_list.should(visible) value_to_select = workstation_list.s( by.xpath( "//*[text()='Рабочая станция 02']/ancestor::*[@role='menuitem']" )) value_to_select.click() workstation_list.should_not(visible) self.ShowButton.click() self.TimeSelection.click() self.SelectDate.click() self.DateChoose.click() self.DateChoose.click()
def __init__(self): # header section self.header_wrap = s('.navigation-menu') self.header_logo = self.header_wrap.s('.logo') self.header_setting_icon = self.header_wrap.s('.settings') # table with online devices self.sync_device_table = s("#sync-devices") self.all_add_link = ss('#sync-devices-button') self.add_link = s('#sync-devices-button') self.setting_icon = s('.edit-device-menu-item.edit-item') # add online drive drop-down self.add_online_drive_link = s('.open').s(by.text('Online Drive')) self.all_add_dropdown_open = ss('.dropdown-menu .drive-device') # modal window 'create new item' self.modal_wrap = s('.modal.in') self.modal_name_input = self.modal_wrap.s('#name') self.modal_save_button = self.modal_wrap.s('.btn-success') self.modal_delete_icon = self.modal_wrap.s('.delete-item') # modal alert for confirm delete item self.confirm_delete_yes_button = s( by.xpath("//a[contains(@id, 'yes-button')]")) # error message popup self.error_alert_popup = s('.message.alert.alert-error') # header logout alert self.logout_alert = self.header_setting_icon.s('.open .dropdown-menu') self.logout_alert_sign_out_button = self.logout_alert.s('#logout')
def get_label_list(self, tag_xpath: str) -> list: """ Возвращает список лейблов в заданном теге. :param tag_xpath: Xpath тега :return label_list: Список лейблов в тегах """ self.log.debug( f"Work '{self.get_method_name()}' with tag_xpath '{tag_xpath}'") label_list = [] tag_elements = ss(by.xpath(tag_xpath)) self.log.debug(f"Size tag_elements: {tag_elements.size()}") for label in tag_elements: try: if label.is_displayed(): label_text = label.text if label_text != "": label_list.append(label_text) except TimeoutException as ex: # self.log.debug(f"Exception: Label with xpath '{tag_xpath}' not found") self.log.debug(f"Exception: '{ex}'") self.log.debug(f"Size label_list: {len(label_list)}") return label_list
def __init__(self): self.organization2Field = s( by.xpath("//*[text()='Поиск']" "/ancestor::div[contains(@class, 'ErrorNotificator')]")) self.loginField = s('[name="login"]') self.passwordField = s('[name="password"]') self.loginButton = s('button')
def select_organization(self, value): organization_input = self.organizationField.s('input') organization_errors = self.organizationField.ss('.error') organization_input.click() organization_list = s(by.xpath("//*[@role='menu']")) organization_list.should(visible) try: value_to_select = organization_list.s( by.xpath( f"//*[text()='{value}']/ancestor::*[@role='menuitem']")) value_to_select.click() organization_list.should_not(visible) except (TimeoutException, NoSuchElementException): return False return organization_input.get_attribute('value') == value and len( organization_errors) == 0
def get_user_language(self, profile_page) -> str: """ Возвращает язык пользователя из профиля """ self.log.debug(f"Work '{self.get_method_name()}'") # Переключиться на фрейм profile_page.switch_to_page_frame() language_label_xpath = "//label[@for='language']" self.flash(s(by.xpath(language_label_xpath))) language_xpath = language_label_xpath + "/following-sibling::select/option[@selected='selected']" user_language = s(by.xpath(language_xpath)).text self.log.debug(f"User language: '{user_language}'") allure.attach(f"{user_language}", f"User language: {user_language}") return user_language
def __init__(self): self.sign_link = s(by.xpath("//a[text()='Войти']")) self.email_field = s('[name="mail"]') self.password_field = s('[name="password"]') self.login_button = s('#login_form_submit') self.user_settings_link = s('#js-usermenu-dropdown') self.cookie_accept_button = s('a.js-cookie-consent-accept') self.create_new_event_button = s('#publishEvent1')
def remove_all_jobs(self): time.sleep(1) jobs = ss(by.xpath('//button[starts-with(@id,"jobsListJobDeleteButton")]')) count = len(jobs) while count >= 1: jobs[count - 1].click() time.sleep(0.1) count -= 1 return self
def __init__(self): super().__init__() self.url = "https://sprintboards.io/boards" self.green_plus = s(by.css("button.text-success>svg[data-icon=plus-circle]")) self.red_plus = s(by.css("button.text-danger>svg[data-icon=plus-circle]")) self.add_card_modal = s(by.css("#add-card-modal")) self.add_card_title = s(by.xpath("//div[h5[text()=\"Title\"]]//input")) self.add_card_description = s(by.xpath("//div[h5[text()=\"Description\"]]//textarea")) self.add_card_button = s(by.css("div.modal-footer button")) self.red_cards = ss(by.css("div.card.border-danger")) self.green_cards = ss(by.css("div.card.border-success")) self.modal_title = s(by.css("div.modal-title")) self.modal_body = s(by.css("div.modal-body")) self.modal_confirm_button = s(by.css("div.modal-footer button.btn-danger"))
def select_category(self, category): self.event_category.scroll_to() self.event_category.click() element_to_select = self.event_category.s( by.xpath(f".//option[text()='{category}']")) element_to_select.should(visible) element_to_select.click() self.event_category.click() assert element_to_select.get_attribute('value') == self.event_category.get_attribute("value"), \ f'Ошибки при заполнении поля: Категория события. Данные: {category}'
def __init__(self): self.event_title = s('#title') self.event_description = s('#shortdescription') self.event_date_start = s('#datestart') self.event_time_start = s('#timestart') self.event_date_end = s('#dateend') self.event_time_end = s('#timeend') self.event_city = s('#token-input-city') self.event_category = s('[name="category[]"]') self.event_submit_button = s('#submit_send') self.addition_settings_link = s( by.xpath("//a[text()='Дополнительные настройки']")) self.event_settings_block = s('#event-settings') self.add_partner_link = s('#add-partner')
def get_inputs_attr_list(self, attr: str) -> list: """ Возвращает список значений заданных атрибутов в тегах "input" :return attr_value_list: Список значений атрибутов """ self.log.debug(f"Work '{self.get_method_name()}'. Attribute: '{attr}'") attr_value_list = [] input_xpath = f"//input[@{attr} and @name!='csrfmiddlewaretoken']" input_elements = ss(by.xpath(input_xpath)) for element in input_elements: attr_value_list.append(element.get_attribute(f"{attr}")) return attr_value_list
def get_button_attr_list(self, attr: str) -> list: """ Возвращает список значений заданных атрибутов в тегах "button" :return attr_value_list: Список значений атрибутов """ self.log.debug(f"Work '{self.get_method_name()}'. Attribute: '{attr}'") attr_value_list = [] button_xpath = f"//button[@{attr}]" button_elements = ss(by.xpath(button_xpath)) for element in button_elements: attr_value_list.append(element.get_attribute(f"{attr}")) return attr_value_list
def __init__(self): self._header = s('app-lbl[ng-reflect-key="Header_Toolbar_WelcomeTo"]') self.pl = s(by.xpath('//div[text()="PL"]')) self.en = s(by.xpath('//div[text()="EN"]')) ############################################################ self._new_job_mane = s('#jobsListNewJobNameInput') self._add_button = s('#jobsListNewJobNameButton') self.jobs_list = ss(by.xpath(' //*[starts-with(@id,"jobsListJob")]//h3')) self.first_job = browser.element(by.xpath(' (//*[starts-with(@id,"jobsListJob")]//h3)[1]')) self.removes = browser.elements(by.xpath('//h3[@class="mat-line"]/../../button')) self._body = s('mat-toolbar.mat-primary > span:nth-child(1)') self.job = 'h3.mat-line' self.work_plate = '#canvasPanel' ############################################################ self.allert = s(by.xpath('//snack-bar-container//span')) ############################################################ self.work_tab = s(by.xpath('//app-lbl[text()="Work"]'))
def get_div_label_list(self, tag_xpath: str) -> list: """ Возвращает список лейблов (текст) в теге "div" :param tag_xpath: Xpath тега :return label_list: Список лейблов """ self.log.debug( f"Work '{self.get_method_name()}' with tag_xpath '{tag_xpath}'") label_list = [] tag_div_elements = ss(by.xpath(tag_xpath)) self.log.debug(f"Tag_div_elements: {tag_div_elements}") for label in tag_div_elements: # label.text self.log.debug(f"Div label element: {label}") return label_list
def alert_accept(self, page) -> None: """ Подтверждение в небраузерном алерт-е :param page: Page Object """ self.log.debug(f"Work '{self.get_method_name()}'") ok_button_xpath = "//button[@id='alertify-ok']" # Иначе всплывающего окна не видно self.drv.switch_to.default_content() # Вернуться из фреймов page.switch_to_page_frame() # Снова переключиться на фрейм # Дождаться ПОЯВЛЕНИЯ всплывшего окна wait.WebDriverWait(self.drv, config_file.IMPLICITLY_WAIT_TIMEOUT) \ .until(ec.element_to_be_clickable((By.XPATH, ok_button_xpath))) self.highlight(s(by.xpath(ok_button_xpath))).click() # Дождаться ПРОПАДАНИЯ всплывшего окна wait.WebDriverWait(self.drv, config_file.IMPLICITLY_WAIT_TIMEOUT) \ .until_not(ec.element_to_be_clickable((By.XPATH, ok_button_xpath)))
def close_frames(self, wait_time: int = 60) -> None: """ Закрыть все 'iframes' путём нажатия крестика в закладке :param wait_time: Время ожидания в секундах """ self.log.debug( f"Work '{self.get_method_name()}'. Wait time: {wait_time} seconds." ) close_frame_xpath = "//div[@id='mainTabs']//div[@class='close-button']" frames_count_for_close = 10 # Бывали зацикливания какие-то в Webdriver while frames_count_for_close > 0: crosses_closing_frames = ss(by.xpath(close_frame_xpath)) frames_count = crosses_closing_frames.size() self.log.debug(f"Opened frames: {frames_count} ") if frames_count > 0: # Обработка долгого автоматического обновления фрейма self.check_show_control_with_adaptive_waiting( close_frame_xpath, wait_time) self.highlight(crosses_closing_frames[0]) try: crosses_closing_frames[0].click() except WebDriverException: self.log.debug( f"Cross click error - wait {config_file.WAIT_TIMEOUT} second" ) time.sleep(config_file.WAIT_TIMEOUT) crosses_closing_frames[0].click() frames_count_for_close -= 1 else: break
def remove_job(self, job_name): s(by.xpath('//h3[contains(text(), "{}")]/../..//button[starts-with(@id,"jobsListJobDeleteButton")]' .format(job_name))).click() return self
def press_enter_button(self): element(by.xpath(LoginPage.login_button)).click() return MainPage()
def __init__(self): self.text_center = s(by.css(".text-center")) self.account_dropdown = s(by.css("#account-dropdown")) self.create_board = s(by.xpath("//li[a/text()=\"Create Board\"]"))
def click_by_xpath(self, xpath, value): browser.element(by.xpath(xpath.format(value))).click() return self
def __init__(self): self.loginField = s('[name="Username"]') self.passwordField = s('[name="Password"]') self.loginButton = s('[name="button"]') self.BranchName = s('#branchTitle') self.SelectMenu_Branches = s( by.xpath( u"(.//*[normalize-space(text()) and normalize-space(.)='Статистика'])[1]/following::div[4]" )) self.SelectBranch = s('[name="branchTitle"]') self.ShowBranch = s( by.xpath( u"(.//*[normalize-space(text()) and normalize-space(.)='Avilex test v.2.0'])[1]/following::div[4]" )) self.ShowSessions = s(by.xpath("//a[text()='Сессии обслуживания']")) self.WorkstationField = s( by.xpath("//*[text()='Рабочее место']" "/ancestor::div[contains(@class, 'col-3-middle')]")) self.District = s('#ao') self.List = s(by.xpath("//*[@role='menu']")) self.ShowButton = s( by.xpath("//*[text()='Показать']/ancestor::button")) self.ClearButton = s( by.xpath("//*[text()='Очистить']/ancestor::button")) self.TimeSelection = s( by.xpath("//*[text()='Выберите начало промежутка']" "/ancestor::div[contains(@class, 'col-3-middle')]")) self.SelectDate = s(by.xpath("//*[text()='2']/ancestor::button")) self.DateChoose = s(by.xpath("//*[text()='Выбрать']/ancestor::button")) self.OrganizationList = s( by.xpath( "//*@role='gridcell'']/ancestor::div[contains(@class, 'rt-tbody')]" )) self.FirstElementSessionTable = s( by.xpath( "//*[@id='app']/div/div/div/article/div/div[2]/div/div[2]/div/div[1]/div[2]/div[1]" ))
def __call__(self, *args, **kwargs): return [s(self._locator), s(by.xpath(self._locator))][self._locator.startswith('(')]
def get_rows_order_part(): return ss(by.xpath('//tr [@class=" "]')).should_be( have.size_at_least(1))