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

前文说要

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

        本章只是改进脚本,如需继续深入学习可以联系博主,或下方留言。这一讲只是框架的一小部分,存在很多完善的地方,但仍有要学习的地方。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文章,这里的执行用例我们可以写的更加的明确点。

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

  • 21
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
selenium是一个web的自动化测试工具,通过使用浏览器访问目标站点而对一个页面上的各个控件进行操作,比如输入框输入内容,点击按钮,刷新页面,选择单选框和复选框等等操作。它能够很好地实现用工具模拟人的操作对访问进行自动化测试。在软件测试中,selenium可以完成自动化测试的任务。它也可以在爬虫中使用,通过驱动浏览器对页面进行操作,比如跳转、输入、点击、下拉等,从而获取页面上的有用信息。unittest是Python中的一个单元测试框架,可以用来编写和运行测试用例。通过结合seleniumunittest,我们可以编写自动化测试脚本,对网站进行全面的功能测试和回归测试。这样可以提高测试效率,减少人工测试的工作量。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [webUI自动化之基本框架搭建(python + selenium + unittest)](https://blog.csdn.net/m0_67695717/article/details/125502224)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [自动化测试:Selenium8种元素定位+unittest框架设计](https://blog.csdn.net/AI_Green/article/details/119939916)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清安无别事

慢慢的积累一杯奶茶吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值