class BasePage(object): locators = basic_locators.BasePageLocators() def __init__(self, driver): self.driver = driver def find(self, locator, timeout=10): return self.wait(timeout).until( EC.presence_of_element_located(locator)) def click(self, locator, timeout=10): for i in range(RETRY_COUNT): try: self.find(locator) element = self.wait(timeout).until( EC.element_to_be_clickable(locator)) element.click() return except StaleElementReferenceException: if i < RETRY_COUNT: pass raise def wait(self, timeout=10): return WebDriverWait(driver=self.driver, timeout=timeout)
class BasePage(object): locators = basic_locators.BasePageLocators() def __init__(self, driver): self.driver = driver def find(self, locator, timeout=None) -> WebElement: return self.wait(timeout).until(EC.presence_of_element_located( locator)) # поиск элемента с ожиданием def click(self, locator, timeout=None): # попытки чтобы кликнуть for i in range(RETRY_COUNT): try: self.find(locator) element = self.wait(timeout).until( EC.element_to_be_clickable(locator)) element.click() return except StaleElementReferenceException: if i < RETRY_COUNT - 1: pass raise def wait(self, timeout=None): if timeout is None: timeout = 5 return WebDriverWait(self.driver, timeout=timeout) def fill_field(self, locator, key_value): field = self.find(locator) field.clear() field.send_keys(key_value)
def auth(driver, config): page_object = BasePage(driver, config) login = config['email'] paswd = config['password'] locator = basic_locators.BasePageLocators() page_object.click(locator.AUTH_BUTTON) page_object.find(locator.EMAIL).send_keys(login) page_object.find(locator.PASSWORD).send_keys(paswd) page_object.click(locator.ACCEPT) return MainPage(driver, config)
class BasePage(object): locators = basic_locators.BasePageLocators() def __init__(self, driver): self.driver = driver def find(self, locator, timeout=None) -> WebElement: # нотация WebElement удобна тем, что у метода find становятся доступны методы WebElement # а это очень удобно return self.wait(timeout).until(EC.presence_of_element_located( locator)) # поиск элемента с ожиданием def click(self, locator, timeout=None): # попытки чтобы кликнуть for i in range(RETRY_COUNT): try: self.find(locator) element = self.wait(timeout).until( EC.element_to_be_clickable(locator)) element.click() return except StaleElementReferenceException: if i < RETRY_COUNT - 1: pass raise def scroll_to_element(self, element): # нигде не используется, потому что click сам скролит # просто пример возможной реализации self.driver.execute_script('arguments[0].scrollIntoView(true);', element) def wait(self, timeout=None): if timeout is None: timeout = 5 return WebDriverWait(self.driver, timeout=timeout) def count_elements(self, locator, count, timeout=1): # этот метод считает количество элементов на странице # until принимает функцию, а значит мы можем написать и использовать свою, в нашем случае это lambda функция # в этом методе мы ожидаем пока не появится нужное нам количество элементов на странице self.wait(timeout).until( lambda browser: len(browser.find_elements(*locator)) == count) def search(self, query): search_field = self.find(self.locators.QUERY_LOCATOR) search_field.clear() search_field.send_keys(query) self.find(self.locators.GO_BUTTON).click()
def incorrect_input(driver, config): page_object = BasePage(driver, config) login = '******' paswd = 'Incorrect_user_password' config['fake_email'] = login locator = basic_locators.BasePageLocators() page_object.click(locator.AUTH_BUTTON) page_object.find(locator.EMAIL).send_keys(login) page_object.find(locator.PASSWORD).send_keys(paswd) page_object.click(locator.ACCEPT) return MainPage(driver, config)
class BasePage(object): locators = basic_locators.BasePageLocators() def __init__(self, driver): self.driver = driver def check_if_exists(self, locator, value): by, locator = locator try: self.find((by, locator.format(value)), timeout=5) return True except TimeoutException: return False def find(self, locator, timeout=None) -> WebElement: # нотация WebElement удобна тем, что у метода find становятся доступны методы WebElement # а это очень удобно return self.wait(timeout).until(EC.presence_of_element_located( locator)) # поиск элемента с ожиданием def click(self, locator, timeout=None): # попытки чтобы кликнуть for i in range(RETRY_COUNT): try: element = self.find( locator, timeout ) #self.wait(timeout).until(EC.element_to_be_clickable(locator)) element.click() return except StaleElementReferenceException: if i < RETRY_COUNT - 1: pass raise def upload_file(self, locator, file_path, submit=None): upload_field = self.find(locator) upload_field.send_keys(file_path) if submit: self.click(locator=submit, timeout=4) def fill_field(self, locator, field_value): field = self.find(locator=locator) field.clear() field.send_keys(field_value) def wait(self, timeout=None): if timeout is None: timeout = 5 return WebDriverWait(self.driver, timeout=timeout)
class BasePage(object): locators = basic_locators.BasePageLocators() def __init__(self, driver): self.driver = driver def find(self, locator, timeout=None) -> WebElement: # нотация WebElement удобна тем, что у метода find становятся доступны методы WebElement # а это очень удобно return self.wait(timeout).until(EC.presence_of_element_located( locator)) # поиск элемента с ожиданием def click(self, locator, timeout=None): # попытки чтобы кликнуть for i in range(RETRY_COUNT): try: self.find(locator) element = self.wait(timeout).until( EC.element_to_be_clickable(locator)) element.click() return except StaleElementReferenceException: if i < RETRY_COUNT - 1: pass raise def drag_and_drop(self, item, target): item_drag = self.find(item) target_drop = self.find(target) ActionChains(self.driver).drag_and_drop( item_drag, target_drop ).perform( ) # Почему это не работает? Не могу придумать другой способ поместить баннер def count_elements(self, locator, count, timeout=1): # этот метод считает количество элементов на странице # until принимает функцию, а значит мы можем написать и использовать свою, в нашем случае это lambda функция # в этом методе мы ожидаем пока не появится нужное нам количество элементов на странице self.wait(timeout).until( lambda browser: len(browser.find_elements(*locator)) == count) def wait(self, timeout=None): if timeout is None: timeout = 5 return WebDriverWait(self.driver, timeout=timeout)
class BasePage(object): locators = basic_locators.BasePageLocators() def __init__(self, driver): self.driver = driver def wait(self, timeout=None): if timeout is None: timeout = 6 return WebDriverWait(self.driver, timeout=timeout) def find(self, locator, timeout=None): return self.wait(timeout).until( EC.presence_of_element_located(locator)) def click(self, locator, timeout=None): for i in range(RETRY_COUNT): try: self.find(locator) element = self.wait(timeout).until( EC.element_to_be_clickable(locator)) #self.scroll_to_element(element) element.click() return except StaleElementReferenceException: if i < RETRY_COUNT - 1: pass raise def scroll_to_element(self, element): self.driver.execute_script('arguments[0].scrollIntoView(true);', element) def move_to_element(self, locator): mv_to = self.find(locator) ActionChains(self.driver).move_to_element(mv_to).perform()