python3+selenium实现Web自动化9:basePa

2021-03-24  本文已影响0人  C1R2

封装selenium库的一些基础操作方法,如:元素定位、截图、元素通用操作、切换frame、警示框处理等等,basePage是最底层操作页面的方法,只要是web页面一些常用的操作都可以写在该基类中,后面有需要的地方直接调用即可。
basePage.py
代码参考:

# _*_ coding:utf-8 _*_
import time,os
from selenium.webdriver.support.ui import WebDriverWait             #导入显示等待等待
from selenium.webdriver.support import expected_conditions as EC    #导入判断方法
from Public import getPathInfo,log

log_info =log.logger                                                #log方法

class BasePage(object):
    """
    基本类,用于所有页面的继承
    """
    def __init__(self, driver):
        self.driver = driver

    def _open(self, url, pagetitle):
        """
        打开网页
        :param url: 网址
        :param pagetitle: 关键字
        """
        self.driver.maximize_window()               #浏览器最大化
        self.driver.implicitly_wait(30)             #显示等待
        self.driver.get(url)                        #打开指定网站
        assert pagetitle in self.driver.title, log_info.error("页面源码中不存在该关键字!")   #断言打开页面是否正确

    def find_element(self, *loc):
        """
        重写定位元素
        """
        try:
            #WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located(loc))                   #判断元素是否存在
            WebDriverWait(self.driver, 10).until(lambda driver: driver.find_element(*loc).is_displayed())  #判断元素是否存在
            return self.driver.find_element(*loc)                   #返回定位元素
        except Exception as e:
            log_info.error('%s页面未找到%s元素' % (self, loc))
            self.get_windows_img()                                  #截图

    def switch_frame(self, loc):
        """
        切换frame
        """
        return self.driver.switch_to.frame(loc)

    def script(self, src):
        """
        定义script方法,用于执行js脚本
        """
        self.driver.execute_script(src)

    def get_windows_img(self):
        """
        截图
        """
        image_path=getPathInfo.join_cwd('Report\\Images\\')             #拼接截图存放目录
        if not os.path.exists(image_path):                              #判断目录是否存在
            os.mkdir(image_path)                                        #创建目录文件
        nowtime=time.strftime("%Y%m%d%H%M%S")                           #当前时间变量
        image_name=image_path +nowtime+ '.png'                          #截图路径
        try:
            self.driver.get_screenshot_as_file(image_name)              #截图
            log_info.info("截图保存地址:%s" % image_name)
            print('screenshot:', nowtime+'.png')                        #打印screenshot关键字,报告中显示截图
        except NameError as e:
            log_info.error("截图保存失败! %s" % e)
            #self.get_windows_img()

loginPage.py
以网易企业邮箱登录页面为案例,封装的方法主要有:登录页面元素、输入账号、输入密码、登录成功、登录失败等登录相关的步骤,loginPage是继承了basePage类,相当于中间层,以后页面元素变动,主要也是修改loginPage内容。

# _*_ coding:utf-8 _*_
from selenium.webdriver.common.by import By
from Page.basePage import BasePage                          #导入基本类
from Public import log

log_info =log.logger                                        #log方法

class Login_page(BasePage):
    """
    登录页面操作步骤
    """
    #元素定位器
    login_way =(By.ID,"switchNormalCtrl")
    username = (By.ID, "accname")
    password = (By.ID, "accpwd")
    login_btn = (By.XPATH, "//*[@id='loginBlock']/div[2]/form[1]/div[5]/button")
    logout = (By.XPATH, "//*[@id='top']/div/div[2]/div[3]/div/a[5]")
    login_msg = (By.ID, 'msgpid')
    user_air=(By.XPATH,"//*[@id='loginBlock']/div[2]/form[1]/div[1]/div")
    pw_air=(By.XPATH,"//*[@id='loginBlock']/div[2]/form[1]/div[2]/div")

    #打开页面
    def open(self, url, pagetitle):
        self._open(url, pagetitle)

    #登录方式选择
    def click_loginway(self):
        log_info.info("点击密码登录")
        self.find_element(*self.login_way).click()

    #输入账号
    def input_username(self, username):
        log_info.info("输入账号")
        self.find_element(*self.username).clear()
        self.find_element(*self.username).send_keys(username)

    #输入密码
    def input_password(self, password):
        log_info.info("输入密码")
        self.find_element(*self.password).clear()
        self.find_element(*self.password).send_keys(password)

    #点击登录
    def click_login(self):
        log_info.info("点击登录")
        self.find_element(*self.login_btn).click()

    #登录成功文本
    def show_userid(self):
        exit_text=self.find_element(*self.logout).text
        log_info.info("登录成功")
        return exit_text

    #账号注销
    def click_exit(self):
        self.find_element(*self.logout).click()
        log_info.info("账号注销")

    #登录失败提示
    def Mismatch(self):
        msg_text=self.find_element(*self.login_msg).text
        #log_info.info(msg_text)
        return msg_text

    #帐号为空
    def username_air(self):
        user_air=self.find_element(*self.user_air).text
        #log_info.info(user_air)
        return user_air

    #密码为空
    def password_air(self):
        password_text=self.find_element(*self.pw_air).text
        #log_info.info(password_text)
        return password_text

excel测试用例(UI_TestCase.xlsx)、unittest组织登录测试用例,其中需要用到读取UI_TestCase.xlsx测试数据、paramunittest(参数化)、调用loginPage类、断言等方法。

详细如下:

一、UI_TestCase.xlsx

image

二、test_login.py
self.login_page = Login_page(self.driver) #初始化loginPage对象
后续需要用self.login_page调用已封装的函数。

# _*_ coding:utf-8 _*_
from selenium import webdriver                                  #导入浏览器模块
from Page.loginPage import Login_page                           #导入登录对象类
from Public import log,readConfig,readExcel                     #导入封装的Log方法、GetPath方法
import unittest,time,paramunittest

excel= readExcel.readExcel('UI_TestCase.xlsx')                  #获取excel文件
names=excel.get_sheetnames()                                    #获取sheel
testcase=excel.get_xlsx(names[0])                               #获取指定shell的case
baseurl = readConfig.Read_Config().get_info('HTTP','baseurl')   #获取配置文件的baseurl
log_info =log.logger                                            #log方法

@paramunittest.parametrized(*testcase)
class TestLogin(unittest.TestCase):
    """
    网易企业邮箱登录测试
    """
    def setParameters(self,NO,case_name,path,username,password,result):
        """
        从 excel 中获取用例
        :param NO: 用例编号
        :param case_name: 用例名称
        :param username: 账号
        :param password: 密码
        :param result: 预期结果
        """
        self.no =NO
        self.case_name = str(case_name)
        self.path = baseurl+str(path)
        self.username = username
        self.password = password
        self.result=result

    @classmethod
    def setUpClass(self):
        """执行类之前运行一次"""
        self.driver = webdriver.Chrome()              #启动浏览器
        self.login_page = Login_page(self.driver)     #初始化loginPage对象

    @classmethod
    def tearDownClass(self):
        """执行完类后执行一次"""
        time.sleep(3)                                 #等待时间
        self.driver.close()                           #关闭浏览器窗口

    def setUp(self):
        """执行每个测试用例前执行一次"""
        self.login_page.open(self.path, '网易企业邮箱 - 登录入口')            #打开首页,并断言title是否正确
        log_info.info('---%s %s测试用例 测试开始---' % (names[0], self.case_name))

    def tearDown(self):
        """执行完每个测试用例后执行一次"""
        log_info.info('---%s %s测试用例 测试结束---' % (names[0], self.case_name))

    #@unittest.skip("无条件跳过该测试")
    def test_login(self):
        """登录成功测试"""
        #self._testMethodName = self.case_name                   #当前函数方法+测试用例测试函数名称
        self._testMethodDoc = self.case_name                     # 测试函数文档
        self.login_page.click_loginway()
        self.login_page.input_username(self.username)             #输入用户名
        self.login_page.input_password(self.password)               #输入密码
        self.login_page.click_login()                               #点击登录按钮

        if self.case_name in ['登录成功']:
            try:
                self.assertEqual(self.result, self.login_page.show_userid(), msg='断言失败')  # 断言
                self.login_page.click_exit()                                # 点击退出按钮
                log_info.info('***断言成功***')
            except Exception as e:
                log_info.info('***断言失败***')
                self.login_page.get_windows_img()
                raise e

        elif self.case_name in ['登录失败-账号为空']:
            try:
                self.assertEqual(self.result, self.login_page.username_air(), msg='断言失败')  # 断言
                log_info.info('***断言成功***')
            except Exception as e:
                log_info.info('***断言失败***')
                self.login_page.get_windows_img()
                raise e

        elif self.case_name in ['登录失败-密码为空']:
            try:
                self.assertEqual(self.result, self.login_page.password_air(), msg='断言失败')  # 断言
                log_info.info('***断言成功***')
            except Exception as e:
                log_info.info('***断言失败***')
                self.login_page.get_windows_img()
                raise e
        else:
            try:
                self.assertEqual(self.result, self.login_page.Mismatch(), msg='断言失败')  # 断言
                log_info.info('***断言成功***')
            except Exception as e:
                log_info.info('***断言失败***')
                self.login_page.get_windows_img()
                raise e

if __name__ == '__main__':
    unittest.main()

参考链接:
https://www.cnblogs.com/airb/p/13490299.html

--参考链接:
Selenium Python 框架之 BasePage页面封装写法
https://blog.csdn.net/wuyoudeyuer/article/details/102685903

上一篇下一篇

猜你喜欢

热点阅读