python+selenium笔记:UI自动化--如何封装一个页面基类

直接上代码:

# _*_ coding:utf-8 _*_

from framework.logger import Logger
import time
import os
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.wait import WebDriverWait

logger = Logger(logger='BasePage').getlog()


class BasePage(object):
    """
        页面基类,封装了截图方法、定位元素方法、输入框录入、点击操作等方法,供其他页面类通过继承该类调用
    """

    def __init__(self, driver):
        self.driver = driver

    def get_window_img(self):
        file_path = os.path.dirname(os.path.dirname(__file__)) + '/screenshots/'
        if not os.path.exists(file_path):
            os.makedirs(file_path)
        rq = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))
        screenshot_name = file_path + rq + '.png'
        try:
            self.driver.get_screenshot_as_file(screenshot_name)
            logger.info("屏幕截取成功,截图存放路径:%s" % screenshot_name)
        except NameError as e:
            logger.error("屏幕截取失败:%s" % e)

    def find_element(self, selector):
        """
        :param selector, 参数selector格式示例:id=>login_name,其中id为定位方式,=>是分隔符,            
        login_name定位的值
        """

        element = ''

        if "=>" not in selector:
            try:
                element = self.driver.find_element_by_id(selector)
                logger.info("成功定位到元素%s通过%s,value:%s" % (element.text))
            except NoSuchElementException as e:
                logger.error("NoSuchElementException: %s" % e)
                self.get_window_img()

        selector_by = selector.split("=>")[0]
        selector_value = selector.split("=>")[1]

        if selector_by == 'i' or selector_by == 'id':
            try:
                element = self.driver.find_element_by_id(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_window_img()

        elif selector_by == 'n' or selector_by == 'name':
            try:
                element = self.driver.find_element_by_name(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_window_img()

        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_window_img()

        elif selector_by == 'p' or selector_by == 'partial_link_text':
            try:
                element = self.driver.find_element_by_partial_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_window_img()

        elif selector_by == 't' or selector_by == 'tag_name':
            try:
                element = self.driver.find_element_by_tag_name(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_window_img()

        elif selector_by == 'c' or selector_by == 'class_name':
            try:
                element = self.driver.find_element_by_class_name(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_window_img()

        elif selector_by == 's' or selector_by == 'css_selector':
            try:
                element = self.driver.find_element_by_css_selector(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_window_img()

        elif selector_by == 'x' or selector_by == 'xpath':
            try:
                element = self.driver.find_element_by_xpath(selector_value)
                if element.get_attribute('placeholder') is not None:
                    logger.info("Had find the element \'%s\' successful,"
                            " by %s via value: %s" % (element.get_attribute('placeholder'), selector_by, selector_value))
                else:
                    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_window_img()

        else:
            raise NameError("请输入有效的目标元素类型")

        return element

    def input(self, selector, text):
        element = self.find_element(selector)
        element.clear()
        try:
            element.send_keys(text)
            logger.info("已经在输入框中输入\'%s\'" % text)
        except NameError as e:
            logger.error("在输入框中输入失败:%s" % e)
            self.get_window_img()

    def clear(self, selector):
        element = self.find_element(selector)
        try:
            element.clear()
            logger.info("成功清空目标元素'%s'数据" % element.text)
        except NameError as e:
            logger.error("目标元素'%s'数据清除失败,错误信息:%s" % (element.text, e))
            self.get_window_img()

    def click(self, selector):
        element = self.find_element(selector)
        try:
            logger.info("点击元素'%s'" % element.text)
            element.click()
        except NameError as e:
            logger.error("点击元素'%s'失败,失败原因:%s" % (element.text, e))
            self.get_window_img()

    def refresh(self):  # 刷新整个页面
        self.refresh()

    def select_by_value(self, selector, text):
        element = self.find_element(selector)
        try:
            logger.info("选择下拉框'%s'的值:%s" % (element.get_attribute('placeholder'), text))
            Select(element).select_by_value(text)
        except NameError as e:
            logger.error("无法选择下拉框'%s'的值:%s" % (element.text, text))
            self.get_window_img()

    def select_by_visible_text(self, selector, text):  # 选择下拉框的值
        element = self.find_element(selector)
        try:
            logger.info("选择下拉框'%s'的值:%s" % (element.get_attribute('placeholder'), text))
            self.wait(1)
            Select(element).select_by_visible_text(text)
        except NameError as e:
            logger.error("无法选择下拉框'%s'的值:%s" % (element.text, text))
            self.get_window_img()

    def switch_newpage(self):
        win_handles = self.driver.window_handles
        if len(win_handles) > 1:
            try:
                self.driver.switch_to.window(win_handles[1])
                logger.info("成功切换到新窗口:%s" % self.driver.title)
            except NameError as e:
                logger.error("无法切换到新窗口")
                self.get_window_img()
        else:
            raise NameError("当前浏览器没有生成新的窗口")

    def get_page_title(self):
        logger.info("当前网页标题是%s" % self.driver.title)
        return self.driver.title

    def get_text(self, selector):  # 获取元素文本
        element = self.find_element(selector)
        try:
            logger.info("获取元素的text内容为:%s" % element.text)
            return element.text
        except NameError as e:
            logger.error("获取元素的text内容失败:%s" % e)
            self.get_window_img()

    def quit_browser(self):
        self.driver.quit()
        logger.info("关闭所有窗口,退出浏览器驱动")

    def close(self):
        try:
            self.driver.close()
            logger.info("关闭当前窗口,不退出浏览器驱动")
        except NameError as e:
            logger.error("当前窗口关闭失败,错误信息:%s" % e)

    def until_wait(self, selector, seconds):  # 显示等待
        try:
            wait_ = WebDriverWait(self.driver, seconds)
            wait_.until(lambda driver: self.find_element(selector))
            logger.info("等待 %d 秒." % seconds)
        except NameError as e:
            logger.error("元素加载失败,失败原因:%s" % e)

    def wait(self, seconds):  # 隐式等待
        self.driver.implicitly_wait(seconds)
        logger.info("程序进入隐式等待状态,等待 %d 秒" % seconds)

    @staticmethod
    def sleep(seconds):  # 强制等待
        time.sleep(seconds)
        logger.info("等待 %d 秒" % seconds)



  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值