import logging import time from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support.ui import Select from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.action_chains import ActionChains as AC from Common import dir_config from Common import logger ''' 需要引入logger,才能使用自己定义好的日志 封装操作页面时候用的常用操作 ''' class BasePage: def __init__(self, driver): # 必须外部传入driver 同一个driver经历多个页面 self.driver = driver # 等待元素可见 def wait_eleVisible(self, loc, timeout=20, poll_frequency=0.5, model=None): ''' :param loc: 元素定位表达式。元素类型,表达方式(元素定位类型,元素定位方法) :param timeout: 等待超时时间上限 :param poll_frequency: 轮询周期 :param model:等待失败时,截图操作,图片文件中需要显示的功能模块标注 :return: None ''' logging.info("{1}:等待元素可见:{0}".format(loc, model)) try: start = time.time() WebDriverWait(self.driver, timeout, poll_frequency).until(EC.visibility_of_element_located(loc)) end = time.time() logging.info("等待时长{0}:以秒为单位".format(round(end - start, 2))) except: logging.error("等待元素可见失败。") # 截图 self.save_webImgs(model) raise # 查找一个元素 def get_Element(self, loc, model=None): logging.info("{1}:查找元素:{0}".format(loc, model)) try: return self.driver.find_element(*loc) except: logging.error("查找元素失败。") # 截图 self.save_webImgs(model) raise # 输入操作 def input_text(self, loc, text, model=None): # 查找元素 ele = self.get_Element(loc, model) # 输入元素 logging.info("{0}:在元素{1}中输入文本:{2}".format(model, loc, text)) try: ele.clear() ele.send_keys(text) except: logging.error("输入操作失败。") self.save_webImgs(model) raise # 点击操作 def click_element(self, loc, model=None): # 找元素再点击 ele = self.get_Element(loc, model) # 点击操作 logging.info("{0}:元素:{1}点击事件".format(model, loc)) try: ele.click() except: logging.error("元素:{0}点击事件失败".format(loc)) self.save_webImgs(model) raise # finally: # ele.click # logging.info("{0}:元素:{1}第二次点击事件".format(model, loc)) # 鼠标悬浮 def hover_element(self, loc, model=None): # 查找元素 ele = self.get_Element(loc, model) logging.info("{0}:元素:{1}鼠标悬停事件".format(model, loc)) try: AC(self.driver).move_to_element(ele).perform() logging.info("{0}:元素:{1}鼠标悬停成功".format(model, loc)) except: logging.error("鼠标悬停操作失败。") self.save_webImgs(model) raise # 双击操作 def double_click_element(self, loc, model=None): ele = self.get_Element(loc, model) try: AC(self.driver).double_click(ele).perform() logging.info("{0}:元素:{1}鼠标双击成功".format(model, loc)) except: logging.error("鼠标双击操作失败。") self.save_webImgs(model) raise # 右键点击 def context_click_element(self, loc, model=None): # 找元素再点击 ele = self.get_Element(loc, model) try: AC(self.driver).context_click(ele).perform() logging.info("{0}:元素:{1}鼠标右键点击成功".format(model, loc)) except: logging.error("鼠标右键点击:{0}:元素:{1}操作失败。".format(model, loc)) self.save_webImgs(model) raise # 鼠标拖拽 def drag_and_drop(self, loc1, loc2): AC(self.driver).drag_and_drop(loc1, loc2) # 清除操作 def clear_input_text(self, loc, model=None): # 找元素再清除 ele = self.get_Element(loc, model) logging.info("{0}:清除元素:{1}".format(model, loc)) try: ele.clear() except: logging.error("清除失败") self.save_webImgs(model) raise # 获取文本内容 def get_text(self, loc, model=None): # 找到元素 self.wait_eleVisible(loc) ele = self.get_Element(loc, model) # 获取元素的文本内容 logging.info("{0}:获取元素:{1}的文本内容".format(model, loc)) try: text = ele.text logging.info("{0}:元素:{1}的文本内容为:{2}".format(model, loc, text)) return text except: # 捕获异常到日志 logging.error("获取元素:{0}的文本内容失败。".format(loc)) # 截图 self.save_webImgs(model) # 抛出异常 raise # 获取元素属性 def get_element_attribuute(self, loc, attr_name, model=None): # 找到元素 ele = self.get_Element(loc, model) # 获取元素属性 logging.info("{0}:获取元素:{1}的属性:{2}".format(model, loc, attr_name)) try: value = ele.get_attribute(attr_name) logging.info("{0}:元素:{1}的属性:{2}值为:{3}".format(model, loc, attr_name, value)) return value except: logging.error("获取元素:{0}的属性:{1}失败,异常信息".format(loc, attr_name)) self.save_webImgs(model) raise # 截图 def save_webImgs(self, model= None): # filepath=制定的图片保存目录/model(页面功能名称)_当前时间到秒.png filepath = dir_config.screenshot_dir + \ "/{0}_{1}.png".format(model, time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime())) try: self.driver.save_screenshot(filepath) logging.info("截屏成功,图片路径为{0}".format(filepath)) except: logging.error("截屏失败") # iframe切换 def switch_iframe(self, frame_refer, timeout=30, poll_frequency=0.5, model=None): # 等待iframe存在 logging.info("iframe切换操作:") try: WebDriverWait(self.driver, timeout, poll_frequency).until( EC.frame_to_be_available_and_switch_to_it(frame_refer)) time.sleep(0.5) logging.info("切换成功") except: logging.error("iframe切换失败!") self.save_webImgs(model) raise # 切换回初始还没有完善 # self.driver.switch_to_default_content() # 切换==index、name\id\WebElement # alert切换 def switch_alert(self, timeout=30, poll_frequency=0.5, model=None): ''' 正常获取到弹出窗的text内容就返回alert这个对象(注意这里不是返回Ture),没有获取到就返回False :param timeout: :param poll_frequency: :param model: :return: ''' try: result = EC.alert_is_present()(self.driver) if result: msg = result.text logging.info("alert出现,内容为:{0}".format(msg)) result.accept() logging.info("alert已经关闭") return msg else: logging.info("未弹出alert") except: logging.error("alert切换失败!") self.save_webImgs(model) raise # 获取窗口句柄 def current_handles(self): current_handles = self.driver.window_handles return current_handles # 窗口切换==如果是切换到新窗口,new,如果是回到默认窗口,default。切换前,在新窗口打开前获取handles def switch_window(self, name, current_handles=None, timeout=30, poll_frequency=0.5, model=None): ''' :param name: new代表最新打开的一个窗口。default代表第一个窗口。其他的值表示为窗口的handles :param current_handles: :param timeout: :param poll_frequency: :param model: :return: ''' try: if name == "new" and current_handles is not None: logging.info("切换到最新打开的窗口") WebDriverWait(self.driver, timeout, poll_frequency).until(EC.new_window_is_opened(current_handles)) window_handles = self.driver.window_handles # 获取所有窗口句柄 self.driver.switch_to.window(window_handles[-1]) elif name == "default": logging.info("切换到第一个窗口") window_handles = self.driver.window_handles self.driver.switch_to.window(window_handles[0]) # self.driver.switch_to_default_content() else: logging.info("切换到指定handles") self.driver.switch_to.window(name) except: logging.error("切换失败") self.save_webImgs(model) raise # select操作 def select(self, loc): # 等待Select出现 self.wait_eleVisible(loc) # 找到select元素 select_ele = self.get_Element(loc) # 初始化select类 s = Select(select_ele) return s # # 1、下标 # s.select_by_index() # # 2、value属性 # s.select_by_value() # # 3、文本内容 # s.select_by_visible_text()
selenium之BasePage封装
猜你喜欢
转载自www.cnblogs.com/l7planet/p/12566478.html
今日推荐
周排行