Python+selenium基于POM的简单UI框架!

本文介绍了基于Python和Selenium的Page Object Model(POM)实现的简单UI自动化框架。通过设置setUp和tearDown方法处理登录和退出,以及BasePage和具体页面对象的继承,提高了测试的复用性和维护性。尽管存在不足,但该框架为UI自动化提供了一个良好的起点。

前一段时间用RobotFramework+Appium实现了安卓的UI自动化,2个人+1个月,大概写了300多条的用例,需要大约4小时全部执行完成,用于版本上线前的回归测试;由于各种各样的原因,每次执行时,用例都不能全部正确通过,执行速度慢,稳定性差,受环境影响较大,维护成本高,UI自动化的缺点很多,但是也是学习成果。

  自动化讲究思想:分层思想。由于所有的测试用例都需要优先登录系统,所以在做安卓UI自动化时,我们将系统登录和退出放在了RF的setup()和teardown()中,其他用例分为2层(测试页面元素和方法+用户逻辑)

Python资源共享群:626017123

最近在学习selenium的web测试,同样所有的测试用例都需要先登录系统,因此将登录和退出系统操作放在setUp和teardown中,如图,创建一个MyUnittest类,继承unittest.TestCase,有4个方法:

(1)setUp():每个测试方法运行前运行,测试前的初始化工作。一条用例执行一次,若N次用例就执行N次,根据用例的数量来定。

(2)setUpClass():每个class文件运行前运行,必须使用@classmethod装饰器进行修饰。

(3)tearDown():每个测试方法运行结束后运行,测试后的清理工作。一条用例执行一次,若N次用例就执行N次。

  (4)tearDownClass():每个class文件运行结束后运行,必须使用@classmethod装饰器进行修饰。

在每个测试的class执行之前,执行setUpClass()用于打开浏览器和浏览器最大化;

在class中的每个测试方法执行之前,执行setUp()用于输入url;

在class中的每个测试方法执行结束之后,执行tearDown()用于刷新浏览器;

在每个测试的class执行结束之后,执行tearDownClass()用于退出浏览器。

 

 

 

 

 

接着将公共处理的事情写在BasePage里面,用于所有页面对象的继承,可以写的公共方法很多,大家按需要写。

 

 

 

 

 

然后,具体的每一个需要测试的页面需要继承BasePage,具体的页面属性和操作在这一层定义,如若出现UI的更改,只需要修改这一层的对象即可。

 

 

 

 

 

 

最后是测试用例,测试用例继承MyUnittest,执行顺序如上述所述,每个class中可以是相同的业务测试用例,如下是对登录页面的测试:

 

 

 

 

 

这样一个简单的UI框架的完成了。如果需要测试具体的业务操作,例如登录系统之后,对某个页面进行查询的测试,具体的页面属性和方法的编写这里就不列出了,测试用例同样是继承MyUnittest,并且先执行一次登录系统操作:

 

 

 

 

 

以上是近期的总结,还存在很多不足之处,路一步一步走,慢慢完善。

### 结合PythonSeleniumPOM、Pytest和Excel进行自动化测试 #### 页面对象模型(POM) 页面对象模型是一种设计模式,旨在创建一个清晰分离关注点的结构。通过这种方式,UI更改的影响仅限于页面类内部,而不会影响到实际的测试代码[^1]。 ```python class LoginPage: def __init__(self, driver): self.driver = driver self.username_textbox_id = "txtUsername" self.password_textbox_id = "txtPassword" self.login_button_id = "btnLogin" def set_username(self, username): self.driver.find_element_by_id(self.username_textbox_id).clear() self.driver.find_element_by_id(self.username_textbox_id).send_keys(username) def set_password(self, password): self.driver.find_element_by_id(self.password_textbox_id).clear() self.driver.find_element_by_id(self.password_textbox_id).send_keys(password) def click_login(self): self.driver.find_element_by_id(self.login_button_id).click() ``` 此段代码定义了一个`LoginPage`类来表示登录页上的交互操作[^2]。 #### 使用pytest编写测试案 pytest是一个支持简单且可扩展的测试框架。它允许开发者轻松地编写小型测试,并能灵活处理参数化测试数据集。 ```python import pytest from selenium import webdriver from page_objects.login_page import LoginPage @pytest.fixture(scope="module") def setup(): driver = webdriver.Chrome(executable_path=r"path_to_chromedriver") yield driver driver.quit() def test_valid_login(setup): loginPage = LoginPage(setup) loginPage.set_username("Admin") loginPage.set_password("admin123") loginPage.click_login() title = setup.title assert title == "OrangeHRM" ``` 这段脚本展示了如何利用pytest fixtures初始化浏览器实以及执行具体的验证逻辑[^3]。 #### 整合Excel读取功能 为了使测试更加动态并易于维护,可以从外部文件加载输入数据。这里展示的是怎样借助pandas库解析.xlsx格式的数据表单作为测试用的一部分: ```python import pandas as pd def get_test_data(file_name): df = pd.read_excel(io=file_name) data = [] for index, row in df.iterrows(): temp = (row['username'], row['password']) data.insert(index, temp) return data ``` 上述函数接受一个Excel文档路径名作为参数返回由元组组成的列表形式的结果集合,其中每个元素代表一行记录中的用户名密码组合。 最后,在pytest中可以通过参数化的方式调用这些来自Excel的数据来进行多次迭代式的测试运行: ```python @pytest.mark.parametrize('username,password', get_test_data(r'path_to_your_file')) def test_invalid_logins(setup, username, password): loginPage = LoginPage(setup) loginPage.set_username(username) loginPage.set_password(password) loginPage.click_login() message = setup.find_element(By.ID, 'spanMessage').text assert message == "Invalid credentials" ``` 这样就实现了基于PythonSelenium WebDriver、页面对象模型(Page Object Model)、pytest单元测试工具链加上Excel电子表格驱动的Web应用程序自动化的完整流程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值