快捷搜索:  汽车  科技

selenium做接口自动化测试,UI自动化测试之POM设计模式

selenium做接口自动化测试,UI自动化测试之POM设计模式第一,我们要分离测试对象(元素对象)和测试脚本(用例脚本),那么我们分别创建两个脚本文件,分别为:(1)改造案例思路:# 1. 导入包 from selenium import webdriver import time import unittest # 定义测试类 class TestCaseLogin(unittest.TestCase): def setUp(self) -> None: """ 前置函数 用于打开浏览器,连接数据库,初始化数据等操作 """ # 2. 打开谷歌浏览器(获取浏览器操作对象) self.driver = webdriver.Chrome() # 3. 打开快递

前言

我的上一篇文章讲了POM的介绍,这一片呢我想讲讲普通的Selenium代码封装成POM模式,废话不多说我们直接开始吧。

selenium做接口自动化测试,UI自动化测试之POM设计模式(1)

1、案例说明:

提示:这里只是提供一种封装的思路, 小伙伴们可以根据自己的实际情况,按需封装。

以下是简单普通的登录测试用例

# 1. 导入包 from selenium import webdriver import time # 2. 打开谷歌浏览器(获取浏览器操作对象) driver = webdriver.Chrome() # 3. 打开快递100网站 url = "https://sso.kuaidi100.com/sso/authorize.do" driver.get(url) time.sleep(3) # 4. 登陆网站 driver.find_element_by_id("name").send_keys('xxxxxxxxxxx') driver.find_element_by_id("password").send_keys('xxxxxx') driver.find_element_by_id("submit").click() time.sleep(3) # 5. 关闭浏览器 driver.quit()

那我们如何进行一个改造升级呢?

2.加入unittest测试框架

# 1. 导入包 from selenium import webdriver import time import unittest # 定义测试类 class TestCaseLogin(unittest.TestCase): def setUp(self) -> None: """ 前置函数 用于打开浏览器,连接数据库,初始化数据等操作 """ # 2. 打开谷歌浏览器(获取浏览器操作对象) self.driver = webdriver.Chrome() # 3. 打开快递100网站 url = "https://sso.kuaidi100.com/sso/authorize.do" self.driver.get(url) time.sleep(3) def tearDown(self) -> None: """ 后置函数 用于关闭浏览器,断开数据库连接,清理测试数据等操作 """ # 5. 关闭浏览器 self.driver.quit() def testLogin(self): """登陆测试用例""" self.driver.find_element_by_id("name").send_keys('xxxxxxxxxxx') self.driver.find_element_by_id("password").send_keys('xxxxxx') self.driver.find_element_by_id("submit").click() time.sleep(3) if __name__ == '__main__': unittest.main()

selenium做接口自动化测试,UI自动化测试之POM设计模式(2)

3、加入元素显示等待

我们上边的示例中,用的是固定的等待时间,我们需要有话一下代码的效率,加入元素的显示等待。

Seleniun的EC模块:EC模块的使用

# 1. 导入包 from selenium import webdriver import time import unittest from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 定义测试类 class TestCaseLogin(unittest.TestCase): def setUp(self) -> None: """ 前置函数 用于打开浏览器,连接数据库,初始化数据等操作 """ # 2. 打开谷歌浏览器(获取浏览器操作对象) self.driver = webdriver.chrome() # 3. 打开快递100网站 url = "https://sso.kuaidi100.com/sso/authorize.do" self.driver.get(url) time.sleep(2) def tearDown(self) -> None: """ 后置函数 用于关闭浏览器,断开数据库连接,清理测试数据等操作 """ # 5. 关闭浏览器 time.sleep(2) self.driver.quit() def testLogin(self): """登陆测试用例""" # 编写定位器 name_input_locator = ("id" "name") passwd_input_locator = ("id" "password") submit_button_locator = ("id" "submit") # 等待元素出现在操作元素 WebDriverWait(self.driver 5).until(EC.visibility_of_element_located(name_input_locator)) WebDriverWait(self.driver 5).until(EC.visibility_of_element_located(passwd_input_locator)) WebDriverWait(self.driver 5).until(EC.visibility_of_element_located(submit_button_locator)) self.driver.find_element_by_id("name").send_keys('xxxxxxxxxxx') self.driver.find_element_by_id("password").send_keys('xxxxxx') self.driver.find_element_by_id("submit").click() if __name__ == '__main__': unittest.main()4、引入POM模式

我们发现上面的代码越来越乱,代码冗余,不利于维护,可读性差,不可复用。

(1)改造案例思路:

第一,我们要分离测试对象(元素对象)和测试脚本(用例脚本),那么我们分别创建两个脚本文件,分别为:

  • LoginPage.Py 用于定义页面元素对象,每一个元素都封装成组件(可以看做存放页面元素对象的仓库)
  • TestCaseLogin.py 测试用例脚本。

第二,抽取出公共方法定义在base.py文件中,每个Page类都要继承这个base.py文件,也就是每Page类都能使用base类中的方法,来操作页面中的元素,同时也可以在每个Page类中定义自己独有的方法,解决工作中的实际需求。

第三 设计实现思想,一切元素和元素的操作组件化定义在Page页面,用例脚本页面,通过调用Page中的组件对象,进行拼凑成一个登录脚本。

selenium做接口自动化测试,UI自动化测试之POM设计模式(3)

(2)封装公共操作在base类

把一些公共的方法放到此类中,这个类将被PO对象继承。

""" 封装公共方法 """ from selenium import webdriver import time from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class Base: def __init__(self browser="chrome"): """ 初始化driver :param browser:浏览器名称 """ if browser == "chrome": self.driver = webdriver.Chrome() elif browser == "firefox": self.driver = webdriver.Firefox() elif browser == "ie": self.driver = webdriver.Ie() else: self.driver = None print("请输入正确的浏览器 例如:chrome firefox ie") def open_url(self url): """ 打开地址 :param url: 被测地址 :return: """ self.driver.get(url) time.sleep(2) def find_element(self locator timeout=10): """ 定位单个元素 如果定位成功返回元素本身 如果失败 返回False :param locator: 定位器 例如("id" "id属性值") :return: 元素本身 """ try: element = WebDriverWait(self.driver timeout).until(EC.presence_of_element_located(locator)) return element except: print(f"{locator}元素没找到") return False def click(self locator): """ 点击元素 :return: """ element = self.find_element(locator) element.click() def send_keys(self locator text): """ 元素输入 :param locator: 定位器 :param text: 输入内容 :return: """ element = self.find_element(locator) element.clear() element.send_keys(text) def close(self): """ 关闭浏览器 :return: """ time.sleep(2) self.driver.quit() if __name__ == '__main__': base = Base() base.open_url("https://sso.kuaidi100.com/sso/authorize.do") base.close()

(3)每个页面对应一个Page类

定位元素的定位器和操作元素方法分离开,元素定位器全部放一起, 然后每一个操作元素动作写成一个方法。

""" 管理登陆页面所有的元素, 以及操作这些元素所用的方法。 """ from common.base import Base class LoginPage(Base): # 编写定位器和页面属性 name_input_locator = ("id" "name") passwd_input_locator = ("id" "password") submit_button_locator = ("id" "submit") username = 'xxxxxxxxxxx' userpasswd = 'xxxxxx' url = 'https://sso.kuaidi100.com/sso/authorize.do' # """封装元素操作""" # 输入用户名 def name_imput(self): self.send_keys(self.name_input_locator self.username) # 输入密码 def passwd_imput(self): self.send_keys(self.passwd_input_locator self.userpasswd) # 点击登陆 def click_submit(self): self.click(self.submit_button_locator) if __name__ == '__main__': base = Base('firefox') base.open_url(url=LoginPage.url)

selenium做接口自动化测试,UI自动化测试之POM设计模式(4)

(4)原登陆案例封装完成代码

测试方法及测试类的执行都在此文件中。

# 1. 导入包 import unittest from pages.login_page import LoginPage # 定义测试类 class TestCaseLogin(unittest.TestCase): def setUp(self) -> None: self.driver = LoginPage() self.driver.open_url(LoginPage.url) def tearDown(self) -> None: # 5. 关闭浏览器 self.driver.close() def testLogin(self): """登陆测试用例""" self.driver.name_imput() self.driver.passwd_imput() self.driver.click_submit() if __name__ == '__main__': unittest.main()5、总结

虽然该实现方法看上去复杂多了,但其中的设计好处是不同层关心不同的问题。

  • 页面对象只关心元素的定位。
  • 测试用例只关心测试数据。

使用POM进行重新构造代码结构后,发现代码测试用例代码的可读性提高很多。

定义好的PageObject 组件可以重复在其它的脚本中进行使用,减少了代码的工作量,也方便对脚本进行后期的维护管理,当元素属性发生变化时,我们只需要对一个PageObaject页面中的对象组件定义进行更改即可。

好了,关于selenium基础—UI自动化测试之POM设计模式就讲完了,喜欢的可以点赞加关注哟,关注我每天给你不同的惊喜。

selenium做接口自动化测试,UI自动化测试之POM设计模式(5)

猜您喜欢: