51Testing软件测试论坛

标题: Python+Selenium WebUI自动化框架 -- 基础操作封装 [打印本页]

作者: 魂尾ACE    时间: 2020-5-12 22:32
标题: Python+Selenium WebUI自动化框架 -- 基础操作封装
本帖最后由 魂尾ACE 于 2020-5-12 22:34 编辑

前言:

      封装Selenium基本操作,
知识储备前提:熟练python语言理论与实际运用,熟悉selenium库与自动化测试环境配置。



browseroperator.py   浏览器操作

webdriveroperator.py     WEBd页操作



分层设计:基础目录,浏览器操作与WEB操作分开。

一、browseroperator.py 的代码如下:

1、初始化函数def __init__(self),初始化浏览相关参数

2、初始化浏览器方法def open_url(self, **kwargs),先判断使用哪种浏览器。

**kwargs是不定长参数,dict格式,参数只需要传   url='www.baidu.com'   ,方法调用只用  opr.open_url(url='www.baidu.com'),打开了浏览器,他会返回webdriver的句柄,调用处接收到全流程操作网站元素。   

暂时还未封装IE 、火狐,留给各位朋友们实现吧,让我们一起学习

3、def close_browser(self, **kwargs)关闭浏览器,齐活,一并封装了



import os
import time
from selenium import webdriver
from common.getconf import Config
from common.getfiledir import BASEFACTORYDIR


class BrowserOperator(object):

    def __init__(self):
        self.conf = Config()
        self.driver_path = os.path.join(BASEFACTORYDIR, 'chromedriver.exe')

    def open_url(self, **kwargs):
        """
        打开网页
        :param url:
        :return: 返回 webdriver
        """
        try:
            url = kwargs['locator']
        except KeyError:
            return False, '没有URL参数'
        try:
            type = self.conf.get('base', 'browser_type')   #从配置文件里取浏览器的类型
            if type == 'chrome':
                #处理chrom弹出的info
                # chrome_options = webdriver.ChromeOptions()
                # #option.add_argument('disable-infobars')
                # chrome_options.add_experimental_option("excludeSwitches", ['enable-automation'])
                # self.driver = webdriver.Chrome(options=chrome_options, executable_path=self.driver_path)
                self.driver = webdriver.Chrome(executable_path=self.driver_path)
                self.driver.maximize_window()
                self.driver.get(url)
            elif type == 'IE':
                print('IE 浏览器')
            else:
                print('火狐浏览器')
        except Exception as e:
            return False, e
        return True, self.driver




    def close_browser(self, **kwargs):
        """
        关闭浏览器
        :return:
        """
        self.driver.quit()
        return True, '关闭浏览器成功'



二、webdriveroperator.py代码如下

1、def __init__(self, driver:Chrome),初始化浏览器返回的deriver句柄,

2、内容不一 一 介绍了,实现了所有页面的操作,定义成功与否判断、日志返回等细节。各位看官细细品尝,细节都在代码里,每个方法注释大体可以说明了这个方法意义,很容易看懂。

        还有很多UI操作没有搬运上来,留给各位朋友们去实现吧,让我们一起学习

import os
import time

from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver import Chrome
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from common.getfiledir import SCREENSHOTDIR




class WebdriverOperator(object):

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

    def get_screenshot_as_file(self):
        """
        截屏保存
        :return:返回路径
        """
        pic_name = str.split(str(time.time()), '.')[0] + str.split(str(time.time()), '.')[1] + '.png'
        screent_path = os.path.join(SCREENSHOTDIR, pic_name)
        self.driver.get_screenshot_as_file(screent_path)
        return screent_path

    def gotosleep(self, **kwargs):
        time.sleep(3)
        return True, '等待成功'


    def web_implicitly_wait(self, **kwargs):
        """
        隐式等待
        :return:
        type  存时间
        """
        try:
            s = kwargs['time']
        except KeyError:
            s = 10
        try:
            self.driver.implicitly_wait(s)
        except NoSuchElementException:
            return False, '隐式等待 页面元素未加载完成'
        return True, '隐式等待 元素加载完成'


    def web_element_wait(self, **kwargs):
        """
        等待元素可见
        :return:
        """
        try:
            type = kwargs['type']
            locator = kwargs['locator']
        except KeyError:
            return False, '未传需要等待元素的定位参数'
        try:
            s = kwargs['time']
        except KeyError:
            s = 30
        try:
            if type == 'id':
                WebDriverWait(self.driver, s, 0.5).until(EC.visibility_of_element_located((By.ID, locator)))
            elif type == 'name':
                WebDriverWait(self.driver, s, 0.5).until(EC.visibility_of_element_located((By.NAME, locator)))
            elif type == 'class':
                WebDriverWait(self.driver, s, 0.5).until(EC.visibility_of_element_located((By.CLASS_NAME, locator)))
            elif type == 'xpath':
                WebDriverWait(self.driver, s, 0.5).until(EC.visibility_of_element_located((By.XPATH, locator)))
            elif type == 'css':
                WebDriverWait(self.driver, s, 0.5).until(EC.visibility_of_element_located((By.CSS_SELECTOR, locator)))
            else:
                return False, '不能识别元素类型[' + type + ']'
        except NoSuchElementException:
            return False, '元素[' + locator + ']等待出现超时'
        return True, '元素[' + locator + ']等待出现成功'


    def find_element(self, type, locator, index = 0):
        """
        定位元素
        :param type:
        :param itor:
        :param index:
        :return:
        """
        #isinstance(self.driver, selenium.webdriver.Chrome.)
        type = str.lower(type)
        try:
            if type == 'id':
                elem = self.driver.find_elements_by_id(locator)[index]
            elif type == 'name':
                elem = self.driver.find_elements_by_name(locator)[index]
            elif type == 'class':
                elem = self.driver.find_elements_by_class_name(locator)[index]
            elif type == 'xpath':
                elem = self.driver.find_elements_by_xpath(locator)[index]
            elif type == 'css':
                elem = self.driver.find_elements_by_css_selector(locator)[index]
            else:
                return False, '不能识别元素类型:[' + type + ']'
        except Exception:
            screenshot_path = self.get_screenshot_as_file()
            return False, '获取[' + type + ']元素[' + locator + ']失败,已截图[' + screenshot_path + '].'
        return True, elem


    def element_click(self, **kwargs):
        """
        点击
        :param kwargs:
        :return:
        """
        try:
            type = kwargs['type']
            locator = kwargs['locator']

        except KeyError:
            return False, '缺少传参'
        try:
            index = kwargs['index']
        except KeyError:
            index = 0
        _isOK, _strLOG = self.find_element(type, locator, index)
        if not _isOK:      #元素没找到,返回失败结果
            return _isOK, _strLOG
        elem = _strLOG
        try:
            elem.click()
        except Exception:
            screenshot_path = self.get_screenshot_as_file()
            return False, '元素['+ locator +']点击失败,已截图[' + screenshot_path + '].'
        return True, '元素['+ locator +']点击成功'


    def element_input(self, **kwargs):
        """
        输入
        :param kwargs:
        :return:
        """
        try:
            type = kwargs['type']
            locator = kwargs['locator']
            text = str(kwargs['input'])
        except KeyError:
            return False, '缺少传参'
        try:
            index = kwargs['index']
        except KeyError:
            index = 0
        _isOK, _strLOG = self.find_element(type, locator, index)
        if not _isOK:  # 元素没找到,返回失败结果
            return _isOK, _strLOG
        elem = _strLOG
        # if 'test' != elem.get_property('type'):     #校验元素是不是text输入框
        #     screenshot_path = self.get_screenshot_as_file()
        #     return False, '元素['+ itor +']不是输入框,输入失败,已截图[' + screenshot_path + '].'
        try:
            elem.send_keys(text)
        except Exception:
            screenshot_path = self.get_screenshot_as_file()
            return False, '元素['+ locator +']输入['+ text +']失败,已截图[' + screenshot_path + '].'
        return True, '元素['+ locator +']输入['+ text +']成功'

结语:封装了基础类,还得实现一个工厂,实现统一一个入口执行所有自动化,后续更新。



作者: szc123qq    时间: 2020-5-13 09:05

作者: Miss_love    时间: 2020-12-25 13:58
感谢分享
作者: 尚云鹏    时间: 2020-12-28 23:10
好的总结,Mark下,后期学习




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2