在前面一篇博客中我们学到了如何使用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)
很棒,这节课就学完了,加油,下面还有!