from logs.logger import Logger from selenium.common.exceptions import NoSuchElementException import time import os from selenium import webdriver """""" """ 二次封装 selenium 类,又称之为通用类。用于给页面类使用 """ # 引用自定义日志文件 logger = Logger(logger="BasePage").get_log() class BasePage(object): def __init__(self, driver): """初始化driver对象""" self.driver = driver def quit_browser(self): """浏览器退出方法""" self.driver.quit() def forward_browser(self): """forward browser 浏览器前进方法""" self.driver.forward() logger.info("Click forward on current page.") def close_browser(self): """close_browser 关闭当前浏览器窗口""" try: self.driver.close() logger.info("Close and quit the browser") except NameError as e: logger.error("Failed to quit the browser with %s" % e) def get_windows_img(self, case_no='base'): file_path = os.path.dirname(os.path.abspath('.')) + '\screenshots\\' print(file_path) isExists = os.path.exists(file_path) # 判断文件夹是否存在,如果不存在则创建。 if not isExists: try: os.makedirs(file_path) except Exception as e: logger.error("Failed new bulid folder %s" % e) rq = time.strftime('%Y%m%d%H%M', time.localtime(time.time())) screen_name = file_path + case_no + rq + '.png' # screen_name = screen_name.replace("\\", "\\\\") print(screen_name) try: self.driver.get_screenshot_as_file(screen_name) logger.info("Had take screenshot and save to folder : /screenshots") except NameError as e: logger.error("Failed to take screenshot! %s" % e) self.get_windows_img() # find_element_** 元素定位方法 selector:元素位置 def find_element(self, selector): """ 这个地方为什么是根据=来切割字符串,请看页面里定位元素的方法 submit_btn = "id=su" login_lnk = "xpath = //*[@id='u1']/a[7]" # 百度首页登录链接定位 如果采用等号,结果很多xpath表达式中包含一个=,这样会造成切割不准确,影响元素定位 :param selector: :return: """ element = '' if '=>' not in selector: # 如果不是:分隔直接认为是id return self.driver.find_element_by_id(selector) selector_by = selector.split('=>')[0] # 元素名称 selector_value = selector.split('=>')[1] # 元素ID名称 if selector_by == "i" or selector_by == "id": try: element = self.driver.find_element_by_id(selector_value) # id 定位 logger.info("Had find the element: %s successful" "by: %s via value:%s" % (element.text, selector_by, selector_value)) except NoSuchElementException as e: logger.error("NoSuchElementException:%s" % e) self.get_windows_img() elif selector_by == "n" or selector_by == "name": element = self.driver.find_element_by_name(selector_value) # name 名称定位 elif selector_by == "c" or selector_by == "class_name": element = self.driver.find_element_by_class_name(selector_value) # css 样式名称定位 elif selector_by == "l" or selector_by == "link_text": try: element = self.driver.find_element_by_link_text(selector_value) # 文本超链接定位 logger.info(("Had find the element %s successful" "by %s via value:%s" % (element.text, selector_by, selector_value))) except NoSuchElementException as e: logger.error("NoSuchElementException:%s" % e) self.get_windows_img() elif selector_by == "p" or selector_by == "partial_link_text": element = self.driver.find_element_by_partial_link_text(selector_value) elif selector_by == "t" or selector_by == "tag_name": element = self.driver.find_element_by_tag_name(selector_value) elif selector_by == "x" or selector_by == "xpath": try: element = self.driver.find_element_by_xpath(selector_value) logger.info("Had find the element: %s successful\ by %s via value:%s" % (element.text, selector_by, selector_value)) except NoSuchElementException as e: logger.error("NoSuchElementException:%s" % e) self.get_windows_img() elif selector_by == "s" or selector_by == "selector_selector": element = self.driver.find_element_by_css_selector(selector_value) else: logger.error("Please enter a valid type of targeting elements.") raise NameError("Please enter a valid type of targeting elements.") return element def send_keys(self, selector, text): """文本输入""" el = self.find_element(selector) el.clear() try: el.send_keys(text) logger.info("Had type : %s in inputBox" % text) except NameError as e: logger.error("Failed to type in input box with %s" % e) self.get_windows_img() def clear(self, selector): """清空文本框""" el = self.find_element(selector) # 获取元素位置信息 try: el.clear() logger.info("Clear text in input box before type") except NameError as e: logger.error("Failed to type in input box with %s" %e) self.get_windows_img() def click(self, selector): """Text click 点击事件 selector:元素位置""" el = self.find_element(selector) # 获取元素位置信息 print(el) try: el.click() print(el) logger.info("The emement was click") # 并不是每个元素都存在 text 属性 except NameError as e: logger.error("Failed to type in input box with %s" % e) self.get_windows_img() def get_url_title(self): """get_url_title 获取网页标题""" logger.info("Current page title is %s" % self.driver.title) return self.driver.title def current_window(self): """获取当前窗口句柄""" handle = self.driver.current_window_handle logger.info("获取当前窗口句柄: %s" % handle) return handle @property def current_url(self): """获取当前网址""" url = self.driver.current_url logger.info("获取当前网址:%s" % url) return url def switch_to_window(self, partial_url='', partial_title=''): """切换窗口 如果窗口数<3,不需要传入参数,切换到当前窗口外的窗口; 如果窗口数>=3,则需要传入参数来确定要跳转到哪个窗口 """ all_windows = self.driver.window_handles if len(all_windows) == 1: logger.info('只有1个window!') elif len(all_windows) == 2: other_window = all_windows[1 - all_windows.index(self.current_window)] self.driver.switch_to.window(other_window) else: for window in all_windows: self.driver.switch_to.window(window) if partial_url in self.driver.current_url or partial_title in self.driver.title: break logger.debug([self.driver.current_url, self.driver.title]) def switch_to_frame(self, param): """ 切换frame页面 :param param: frame的定位方式 :return: """ frame = self.driver.switch_to.frame(param) logger.info("切换frame页面frame:%s" % frame) def switch_to_alert(self): """切换alter弹窗""" alert = self.driver.switch_to.alert logger.info("切换到弹窗alert:%s" % alert) return alert """ 接受弹窗 driver.switch_to_alert().accept() ,比如得到:请输入用户名! message=driver.switch_to_alert().text print(message) 取消按钮 driver.switch_to_alert().dismiss() 输入值 driver.switch_to_alert().send_keys() """ def accept_alert(self): """接受弹窗""" self.driver.switch_to_alert().accept() logger.info("接受弹窗") def dismiss_alert(self): """弹窗取消""" self.driver.switch_to_alert().dismiss() logger.info("弹窗取消") def get_alert_text(self): """获取弹窗信息""" msg = self.driver.switch_to_alert().text logger.info("得到弹窗的文本消息:%s" % msg) return msg def alter_send_keys(self, text): """弹窗输入值""" self.driver.switch_to_alert().send_keys(text) logger.info("弹窗输入值:%s" % text) def execute(self, js, *args): """执行js脚本""" self.driver.execute_script(js, *args) logger.info("执行js脚本js:%s" % js) if __name__ == '__main__': driver = webdriver.Chrome() driver.maximize_window() driver.get("https://www.baidu.com") time.sleep(1) # driver = '1' bs = BasePage(driver)
python web自动化测试之二次封装 selenium 类
最新推荐文章于 2023-03-23 07:10:57 发布