从零开始学习selenium-第二课

在前面一篇博客中我们学到了如何使用selenium对网页进行操作,那么接下来我们再多学一点吧!

本章我们需要用到前一篇博客的html代码:一个简易的HTML网页

在上一篇博客中我们知道了一些简易的操作,但是如果输入框中我们需要上输入大量的数据,如用户名密码等等,我们就需要重复写很多类似的代码,作为程序猿,可不能把自己累死了,所以我们想到了使用类来封装一个方法,当我们需要时可以随时调用,代码如下

import time
import unittest

import ddt
from selenium import webdriver
from selenium.webdriver.common.by import By
@ddt.ddt#函数装饰器,用于增强函数以及其他类的功能
class testlogin(unittest.TestCase):
    def setUp(self) -> None:
        self.driver = webdriver.Chrome() self.driver.get('html页面在浏览器打开后的地址')

    @ddt.data({"uname":"admin","pwd":"123456","expect":"登录成功"},
                {"uname":"","pwd":"123456","expect":"用户名不能为空"},
                {"uname":"admin","pwd":"","expect":"密码不能为空"},
                {"uname":"jackma123","pwd":"123456","expect":"账号不存在"},
                {"uname":"admin","pwd":"1234566","expect":"密码错误"})
    def testlogin(self, uname, pwd, expect):#在自己写程序时需要定义方法开头必须为test,不然待会的操作一定会报错
        self.driver.find_element(By.ID, 'accountID').send_keys(uname)
        self.driver.find_element(By.ID, 'passwordID').send_keys(pwd)
        self.driver.find_element(By.ID, 'submitID').click()
        # 断言:预期结果与实际结果一致
        actual = self.driver.find_element(By.XPATH, '//div[@id="divID"]').text#这里需要注意是精确找到div元素的id,不然也会报错
        assert expect == actual
        time.sleep(1)

    def tearDown(self) -> None:
        self.driver.close()


unittest.main(verbosity=2)

需要注意的是仅仅只有代码是无法运行的,我们需要创造一个专门的测试环境运行上述代码

步骤如下:1.复制代码文件的绝对地址

2.为该文件建立测试环境(pycharm右上角编辑配置)

3.点击+号,再选择python创建

4.将刚刚复制的代码文件绝对路径粘贴到脚本路径中,右下角点击应用,点击确定即可

注:每次运行前先看看运行环境与代码文件是否匹配,否则容易报错

解释一下上述代码的最后一句

在Python的unittest框架中,unittest.main()是一个函数,它允许你直接从模块中运行测试用例,而无需显式地创建测试套件和测试运行器。

当你为unittest.main()函数提供一个verbosity参数时,你正在控制输出到控制台的详细程度。

  • verbosity=0(默认): 只输出失败的测试和错误。
  • verbosity=1: 输出每个测试方法的名字,即使它成功通过了。
  • verbosity=2: 输出每个测试方法的名字和测试开始/结束的时间。

所以,unittest.main(verbosity=2)会运行模块中的所有测试,并且为每个测试方法输出名字和开始/结束的时间,即使它们都通过了。

下面是一个简单的例子:

import unittest  
  
class TestExample(unittest.TestCase):  
    def test_one(self):  
        self.assertEqual(1, 1)  
  
    def test_two(self):  
        self.assertEqual(2, 2)  
  
if __name__ == '__main__':  
    unittest.main(verbosity=2)

当你运行这个模块时,它会输出两个测试方法的名字和它们的开始/结束时间,因为verbosity被设置为2。

可是大量的数据如何调用呢,这又是一个值得思考的问题

数据驱动能很好地帮我们解决这个问题,就是从json文件中获取我们需要的数据来对页面进行测试

我们先创建一个json文件,将下列数据粘贴到你创建的json文件中,本次示例为data.json文件:

{
"登录成功":{"uname":"admin","pwd":"123456","expect":"登录成功"},
"用户名不能为空":{"uname":"","pwd":"123456","expect":"用户名不能为空"},
"密码不能为空":{"uname":"admin","pwd":"","expect":"密码不能为空"},
"账号不存在":{"uname":"jackma123","pwd":"123456","expect":"账号不存在"},
"密码错误":{"uname":"admin","pwd":"1234566","expect":"密码错误"}
}

注意:所有文件需要放在同一个文件夹最佳

之后我们就能编写更加简洁的测试代码了,来瞧瞧代码吧:

import time
import unittest
import ddt
from selenium import webdriver
from selenium.driver.common.by import By

@ddt.ddt
class testlogin(unittest.testcase):
    def setUp(self)->None:#这是固定的启动名称,不需要自己定义和修改
        self.driver=webdriver.Chrome()
        self.driver.get('你的HTML页面在网页打开后的链接地址')
        #self.driver.implicitly_wait()#隐式等待,如果页面响应太慢就获取不到数据,不过一般会和下面的time.sleep()同时使用时会有概率报错,如果报错了可以试试把这行注释一下
    @ddt.file_data('data.json')
    def testlogin(self,uname,pwd,expect):
        self.driver.find_element(By.ID,'accountID').send_keys(uname)
        self.driver.find_element(By.ID,'passwordID').send_keys(pwd)
        self.driver.find_element(By.ID,'submitID').click()
        actual=self.driver.find_element(By.XPath,'//div[@id="divID"]/font').text
        assert expect==actual
        time.sleep(5)
    def tearDown(self)->None:
        self.driver.close()

unittest.main(verbosity=2)

很棒,这节课就学完了,加油,下面还有!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值