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

news/2024/7/8 11:48:13
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)
    


http://www.niftyadmin.cn/n/4388293.html

相关文章

java程序员昵称_那些神秘的Java程序员

我们都知道程序员的工作主要就是写代码&#xff0c;这样的工作可能会给他们带来近视、秃顶等种种问题。而之前我看过一档辩论型的综艺节目&#xff0c;从中了解到&#xff0c;在北京&#xff0c;女孩们的家长最希望自己未来的女婿是个程序员。这是为什么呢&#xff1f;原来她们…

vue 中 mixins 的详细介绍

mixins(混入)就是定义了一部分公共的方法、计算属性或者钩子函数等 vue 组件中的可复用功能&#xff0c;然后混合进各个组件中使用。下面我们具体来看看怎么使用。 创建一个 demo.js 文件&#xff0c;然后 export 给外部使用 export const demoMixins {data() {return {name: …

python+selenium webui自动化测试之打开浏览器封装两种方式ini配置文件或者yaml文件

yaml文件&#xff1a;# !/usr/bin/python # -*- coding:utf-8 -*-from logs.logger import Logger from selenium import webdriver import os from configfg.read_yaml import YamlReader import timelogger Logger(logger"BrowserEngine").get_log()# 浏览器引擎类…

uni-app 微信小程序实现发送给朋友分享功能

我们在用 uni-app 开发微信小程序时&#xff0c;我们有时需要分享功能&#xff0c;uni-app 中只要在需要分享的页面的 js 中定义了 onShareAppMessage(和 onLoad 等生命周期函数同级)&#xff0c;就能实现 发送给朋友 微信小程序的分享功能。但是如果每个需要分享的页面都写一个…

mysql redis 一致性_redis与Mysql的数据一致性

为了减少db的读压力&#xff0c;加快读速度&#xff0c;系统使用cache做缓存&#xff0c;会引起cache一致性问题。因为db会有事务性导致回滚&#xff0c;而cache无法回滚&#xff0c;会导致脏数据。一般情况下&#xff0c;我们会在保存数据时&#xff0c;先穿透保存到DB中&…

事件监听器 java_java事件与监听器

在java开发中&#xff0c;事件的处理非常重要。比如在swing编程里&#xff0c;若要实现当点击按钮、文本框、移动鼠标、按下键盘就执行相应的操作&#xff0c;就要用到事件与监听器。这个过程可以分解为事件源产生某个获某些事件&#xff0c;添加在这个事件源的监听器会自动根据…

vue 中 style 的私有作用域 scoped 和深度作用选择器及 /deep/ 用法

前言 我们在用 vue 开发项目时&#xff0c;在给当前组件中的元素设置样式&#xff0c;为了不污染全局样式&#xff0c;一般会在当前组件的 <style> 标签中增加 scoped 属性&#xff0c;表明 CSS 只作用于当前组件中的元素。 实现原理 按 vue 官方解释&#xff0c;scoped …

python renames_Python3 os.renames() 方法 - Python 3 基础教程

Python3 OS 文件/目录方法概述os.renames() 方法用于递归重命名目录或文件。类似rename()。语法renames()方法语法格式如下&#xff1a;os.renames(old, new)参数old — 要重命名的目录new –文件或目录的新名字。甚至可以是包含在目录中的文件&#xff0c;或者完整的目录树。返…