上海 selenium 进阶课 0722 关于 webdriver 封装&以及作业

工程结构

大厦停电,备用电比较炎热的情况下,大家坚持在学习。
课程公开webdriver封装基础封装的,需要使用基础封装和常规的定位器来实现作业

project名
     util(工具类模块)
\t       init.py  <--提升文件夹到模块
\t       ClientSelenium.py (selenium工具类)
               Base.py(工具的基础类)
\t       ParserConfig.py (工具的处理读取INI配置的类)   服务于Conf/config.ini

     Conf(配置类模块)
\t        init.py <--提升文件夹到模块
\t        config.ini  (目前处理驱动和网站地址等)--书架功能
                setting.py(处理文件常量和路径拼接) --服务于testcase文件夹

     driver(驱动文件夹)   拉起驱动时有这个不用配置环境变量了,给别人立即给用。
              chromedriver.exe
              geckodriver.exe

     test_log(预留的日志文件夹)

     screen(预留的截图文件夹)

     testcase(业务代码测试用例)
\t    init.py
\t    testLogin.py (第一个测试用例文件,名字先自己取)

     yaml(预留的外部配置文件夹)
\t   init.py
           browser.yaml (配置测试信息)

 run.py -入口函数 把testcase文件夹套件化处理(testsuite)

流程路径
util\\Base基础  -->    util\\SeleniumClient    -->   testcase\\业务代码 -->  run.py 启动(现在是第一层)
util(处理封装webdriver,日志,报告等)  -->  testcase\\业务代码(test开头*.py)

作业内容

请尽早完成3个任意网站,并且每个网站case不小于5条
case需要把webdriver封装的用上,并且使用学到定位器自己在工程结构下面的clientSelenium.py简单封装结合下面给的封装好的一起混合完成。

直接使用util\SeleniumClient.py

from selenium import webdriver 
#只开放了基础api的,定位器请自己学习封装完成作业,下节课在讲带保护的高级封装
class ClientSelenium(object):
    """通过封装把Page的行为压缩在这里"""
    def get_driver(self, driver,url):
        "拉起webdriver和浏览器和打开目标url   可以用于setUpClass的初始化"
        if driver == 'firefox' or driver == 'Firefox' or driver == 'F' or driver == 'f':
            exe_path = base.firefox_path()#第二个功能是包裹在第一个功能下面的   base代码稍等
            self.driver = webdriver.Firefox(executable_path=exe_path)
        elif driver == 'Chrome' or driver == 'chrome' or driver == 'Ch' or driver == 'ch':
            exe_path = base.chrome_path()
            self.driver = webdriver.Chrome(executable_path=exe_path)
        else:
            print("输入在预期以外")
        self.driver.get(url) #区域3
        return self.driver

    def start(self,url,_url):
        """
        不拉起webdriver,只打开浏览器打开网页  
        :param url: 打开网页
        :param _url: 期望网页
        :return:
        """
        self.driver.get(url)
        self._get_current_url(_url)

    def assert_title(self,titleStr):
        """
        页面标题上是否包含关键字,支持传入多个参数
        :param titleStr: 关键字
        :param args: 支持传入多个参数
        :return:
        """
        try:
            assert titleStr in self.driver.title, \\
                "在title里没有找到%s" % titleStr
            print("加载网页正确") #业务self.assertTrue()
        except AssertionError as error:  # 断言表达式不足
            print(format(error))
        except Exception as error:
            print(format(error))

    def assert_source(self,sources):
        """
        网页源码是否包含关键字 做业务判断
        :param sources: list [arg1,arg2...]
        :return:
        """
        for source in sources:  # 关键字驱动有可能包含多个参数
            try:
                assert source in self.driver.page_source, \\
                    "在page_source里没有找到%s" % source
                print("判断 %s 包含在page_source" % source)
            except AssertionError as error:  # 断言表达式
                print(format(error))
            except Exception as error:
                print(format(error))

    time_wait = 2

    def time_sleep(self, time_wait):
        """
        强制等待默认为2秒
        :param time_wait:
        :return:
        """
        if time_wait <= 0:
            time.sleep(time_wait)
        else:
            print("等待%ss" % time_wait)
            time.sleep(time_wait)

    def max_size(self):
        """
        放大浏览器最大化 需要先拉起浏览器
        :return:
        """
        time.sleep(0.5)  # 切换展示
        self.driver.maximize_window()


    def set_size(self,width=800, height=600):
        """
        先打印浏览器尺寸,设置浏览器到尺寸
        :param width: 宽
        :param height: 高
        :return:
        """
        self.driver.set_window_size(width, height, windowHandle="current")  # 当前句柄
        print("尺寸设置成功")

    def _get_current_url(self,_url):
        try:
            assert _url ==self.driver.current_url, \\
            "当前网页%刷新后url被修改"%self.driver.current_url
        except Exception as error:
            print(format(error))

    def F5(self,_url):
        """
        刷新后验证网页正确  now_url覆写使用
        :return:
        """
        self.driver.refresh()
        print("刷新正确")
        self._get_current_url(_url)  # 刷新后判断当前网页


    def back(self, _url,time_wait=2):
        """
        后退到之前的页面(等同浏览器上按回退按钮)
        条件:先需要有前后打开的2个页面
        :param _url:形参是验证当前页面
        :param time_wait:属于time_sleep方法
        :return:
        """
        self.time_sleep(time_wait)
        self.driver.back()
        self._get_current_url(_url)
        print("back网页成功")

    def forward(self, _url,time_wait=2):
        """
        配合浏览器回退使用,回到之前的页面
        :param _url:形参是验证当前页面
        :param time_wait:属于time_sleep方法
        :return:
        """
        self.time_sleep(time_wait)
        self.driver.forward()
        self._get_current_url(_url)
        print("forward网页成功")


    def quit(self):
        """关闭浏览器   可以用于tearDownClass的清理
        :return:
        """
        self.time_sleep(self.time_wait) # 展示最后一条case
        self.driver.quit()
        print("关闭浏览器",self.driver)

结合util\Base.py

# 只有用到的部分
from Conf.setting import *  #其他都被这个文件导入了, from后面跟着是文件夹绝对路径,可以想想比如os
from util.ParserConfig import ParserConfig #也可以放入Conf\\setting.py
pc =ParserConfig(ini_path)
class Base(object):
    def chrome_path(self):
        "谷歌的浏览器驱动"
        #读取驱动
        return pc.get_option_value("Driver", "chrome") #把driver目录拷贝到一级目录下。 这里之前写错了,传错了一个函数

    def firefox_path(self):
        "火狐的浏览器驱动"
        return pc.get_option_value("Driver", "firefox")

加油啊。