python web自动化测试之二次封装 selenium 类

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)
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值