美文网首页
python3+selenium实现Web自动化9:basePa

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

作者: C1R2 | 来源:发表于2021-03-24 22:35 被阅读0次

    封装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

    相关文章

      网友评论

          本文标题:python3+selenium实现Web自动化9:basePa

          本文链接:https://www.haomeiwen.com/subject/fvmdcltx.html