selenium系列–改进脚本为unittest框架–框架设计

selenium系列–改进脚本为unittest框架–框架设计unittest+POM,如需要学习如何添加日志,截图等内容,可以留言或加博主微信。

前文说要

        这里是清安,本章讲述如何将上一章的脚本改写为框架,当然,框架有优质框架也有劣质框架,本章我们讲述比较通俗易懂,且基本上都在使用的一种。对于新手也是比较的友好。        

        本章只是改进脚本,如需继续深入学习可以联系博主,或下方留言。这一讲只是框架的一小部分,存在很多完善的地方,但仍有要学习的地方。V:qing_an_an。内设微信群聊,比较卷,想学习的都可以联系博主。

        如果你看完本篇,觉得合适,可以,那么请留言或添加好友告知我,看情况而定,如果人数多就带着各位写一遍POM思想的框架全过程!

        学习本篇之前,需要了解如下两篇文章:

        selenium系列–手把手写测试脚本_清欢无别事-CSDN博客

        开学了同学们快来–selenium之unittest框架–浅显易懂_清欢无别事-CSDN博客

正文说要

        我们先将unittest的大体部分写出来。

# -->>>清安<<<---
import unittest


class Logintest(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        print("开始执行")

    @classmethod
    def tearDownClass(cls) -> None:
        print("执行完毕")

    def test_login(self):
        print("执行中")


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

        接下来我们执行一遍看看效果:

============================= test session starts =============================
collecting ... collected 1 item

un_login.py::Logintest::test_login 开始执行
PASSED                                [100%]执行中
执行完毕

POM

        到这里,大体的框架就是这样,但是又想了想,如果就这样,把昨天的内容搬进来岂不是显的有些多余了。那我们就结合POM思想。那么什么是POM思想呢。

        Page Object Model (POM) 直译为“页面对象模型”,将那些繁琐的定位操作封装到这个页面

对象中,只对外提供必要的操作接口,是一种封装思想

为什么要用POM?

       
少数的自动化测试用例维护起来看起来是很容易的。但随着时间的迁移,测试套件将持续的增长。
脚本也将变得越来越臃肿庞大。如果变成我们需要维护10个页面,100个页面,甚至1000个呢?
而且页面元素很多是公用的。那页面元素的任何改变都会让我们的脚本维护变得繁琐复杂,而且
变得耗时易出错。

有哪些好处?

        让UI自动化更早介入项目中,可项目开发完再进行元素定位的适配与调试

      
POM 将页面元素定位和业务操作流程分开,分离了测试对象和测试脚本.
       如果UI页面元素更改,测试脚本不需要更改,只需要更改页面对象中的某些代码就可以
       POM能让我们的测试代码变得可读性更好,高可维护性,高复用性,
可多人共同维护开发脚本,利于团队协作

如何设计

        POM可以使代码看起来更整洁,那么我们先另外创建一个py文件。这里面主要放一些方法之类的东西,比如:定位、输入内容,点击等

# -->>>清安<<<---
from time import sleep
from selenium import webdriver

def supdriver():
    driver = webdriver.Firefox()
    driver.maximize_window()
    return driver


class Login_f:
    def __init__(self):
        self.driver = supdriver()

    def get_url(self, url):
        self.driver.get(url)

    def get_click(self, ele, tager):
        self.driver.find_element(ele, tager).click()
        sleep(1)

    def get_send_keys(self, ele, tager, value):
        self.driver.find_element(ele, tager).send_keys(value)
        sleep(1)

    def eles_text(self, ele, tager, number):
        eles = self.driver.find_elements(ele, tager)[number]
        sleep(1)
        return eles

    def ele_text(self, ele, tager):
        ele = self.driver.find_element(ele, tager).text
        return ele

        方法暂时性就写这么几个,因为在本章还算够用,能解决当前的一些问题。自己练习也可以加一些显示等待鼠标操作等方法进来。

        温馨提示:这的url其实可以优化的,放在文本中去,本章暂时不讲。其次就是等待时间,我们可以写显示等待来写,这里自己可以尝试优化一下。不会就下方留言吧。

        好了,这个py文件就到这里了,我们进入写用例环节:#测试一下#

# -->>>清安<<<---
import unittest
from index.web_fun import Login_f
from selenium.webdriver.common.by import By


class Logintest(unittest.TestCase):
    logf = Login_f()

    @classmethod
    def setUpClass(cls) -> None:
        cls.logf.driver.get('http://39.98.138.157/shopxo/public/index.php?s=/index/user/logininfo.html')
        cls.logf.driver.implicitly_wait(10)
        print("开始执行")

    @classmethod
    def tearDownClass(cls) -> None:
        cls.logf.driver.quit()
        print("执行完毕")

    def test_login(self):
        print("执行中")
        self.logf.get_click(By.XPATH,'/html/body/div[4]/div/div[2]/div[1]/a')


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

        这里我用了实例化的方式来写,各位也可以用其他的方法来来写,比如说继承的方法。不做限制,只要你有想法,不会的可以私信我来一起交流交流。

        简单的测试就到这里了,接下来我们把脚本的用例写完,上述代码有不明白的可以去看看之前的unittest文。

        注意:这里加了显示等待,有可能出现页面加载需要很长的时间,为什么呢?因为网址的服务器响应慢了,然后我们加上全局隐士等待,等待页面 元素加载,如果网络不好可能等到花都要谢掉。

        好了,我们看看用例的源码:

# -->>>清安<<<---
import unittest
from index.web_fun import Login_f
from selenium.webdriver.common.by import By

class Logintest(unittest.TestCase):
    logf = Login_f()

    @classmethod
    def setUpClass(cls) -> None:
        cls.logf.driver.get('http://39.98.138.157/shopxo/public/index.php?s=/index/user/logininfo.html')
        # cls.logf.driver.implicitly_wait(10)
        print("开始执行")

    @classmethod
    def tearDownClass(cls) -> None:
        cls.logf.driver.quit()
        print("执行完毕")

    def test_login_01(self):
        print("执行中")
        # self.logf.get_url('http://39.98.138.157/shopxo/public/index.php?s=/index/user/logininfo.html')
        self.logf.get_click(By.XPATH, '/html/body/div[4]/div/div[2]/div[1]/a')
        self.logf.get_click(By.XPATH, '//label[contains(text(),"用户名")]')
        self.logf.get_send_keys(By.NAME, 'accounts', 'qingan')
        self.logf.get_send_keys(By.NAME, 'pwd', 'qingan')
        self.logf.get_click(By.CLASS_NAME, 'am-icon-checked')
        self.logf.eles_text(By.XPATH, '//button[contains(text(),"注册")]', 0).click()
        ele = self.logf.ele_text(By.XPATH, '//*[@id="common-prompt"]/p')
        self.assertEqual(ele,'账号已存在')
        if ele == '账号已存在':
            print('账号已存在')
            self.logf.get_click(By.XPATH,'/html/body/div[4]/div/div/div/div[1]/a')
            self.logf.get_send_keys(By.NAME,'accounts','qinganan')
            self.logf.get_send_keys(By.NAME,'pwd','qingan')
            self.logf.get_click(By.XPATH,'/html/body/div[4]/div/div[2]/div[2]/form/div[3]/button')
        else:
            self.logf.get_click(By.CLASS_NAME, 'am-icon-checked')
            self.logf.get_send_keys(By.NAME, 'accounts', 'qinganan')
            self.logf.get_send_keys(By.NAME, 'pwd', 'qingan')
            self.logf.get_click(By.CLASS_NAME,'am-icon-checked')
            self.logf.eles_text(By.XPATH,'//button[contains(text(),"注册")',0).click()

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

        解析点一:看了源码用例是不是发现也不过如此,这里需要说明的是这是一条用例,你发现代码量跟脚本没啥区别,但是你要是写多条用例呢。脚本很多东西你需要重复写,这里你只需要调用。

        解析点二:这里呢只用到了部分的POM,这里面是有很多需要完善的地方的。比如说断言,我这写了一个断言,我们可以用显示等待来写,就不用每次都写断言了,也不用写什么if else了。

        解析点三:这里的账号我们是可以提取出来的用数据驱动就可以,再往后定位也是可以提取出来的,也就是关键字驱动了。

        解析点四:参照前面写的unittest文章,这里的执行用例我们可以写的更加的明确点。

        本篇就到这里,欢迎留言交流。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/36382.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注