当有上百个用例,几十个页面的时候,我们会在测试用例中重复的使用到页面当中的元素和操作。当其中的页面发生变化时,我们需要在多个用例中去修改。这种情况下,代码多且乱,维护成本也不低。
那么有什么好的方式来解决这个问题呢?
在做web 测试时,无论是什么业务,都是在页面上去操作,即所有的测试用例都是在页面中操作的。比如一个用例是由5个页面的功能串行组成的。
假设一个产品有30个页面,有500个功能测试用例。那么这500个功能测试用例就是有30个页面的功能组成。
如此,如果能够把30个页面的功能封装起来,500个用例按照业务场景从30个页面当中调用需要的页面即可。
这种方式叫做PO模式,全称 Page object ,页面对象模型。
将页面的元素定位和元素行为封装成一个 page 类。
实现页面对象和测试用例分离。
在测试用例中,调用所需页面对象中的行为,组成测试用例。
1、当某个页面的元素发生变化,只需要修改该页面对象中的代码即可,测试用例不需要修改。
2、提高代码重用率。结构清晰,维护代码更容易。
3、测试用例发生变化时,不需要或者只需要修改少数页面对象代码即可,
登录页面LoginPage.py:
class LoginPage:
#用户名输入框
login_username_xpath = "//*[@name='phone']"
#密码输入框
login_passwd_xpath = "//*[@name='password']"
#登录按钮
login_button_xpath = "//button"
def __init__(self,driver,url):
self.driver = driver
self.driver.get(url)
def login(self,username,passwd):
#找到登录用户名
self.driver.find_element_by_xpath(self.login_username_xpath).send_keys(usernaem)
self.driver.find_element_by_xpath(self.login_passwd_xpath).send_keys(password)
self.driver.find_element_by_xpath(self.login_button_xpath).click()
登录用例 test_login.py:
def setUp(self):
url = "XXXXXXXX"
self.driver = webdriver.Chrome()
self.lp = LoginPage (self.driver,url)
def tearDown(self):
self.driver.quit()
#用例一:登录成功
def test_1_login_success(self):
#步骤
self.lp.login(login_success_dict["username"]),login_success_dict["passwd"])
#结果对比
time.sleep(3)
ip = IndexPage (self.driver)
self.assertEqual(ip.get_nickname(),login_success_dict["check_nickname"])
#用例二:没有用户名
def test_2_login_noUsername(self):
#步骤
self.lp.login(login_noUser_dict["username"],login_noUser_dict["passwd"])
#结果对比
time.sleep(3)
url = self.lp.get_current_url()
wrong_msg = self.lp.get_wrongMsg_from_noUserPaswd()
self.assertEqual(url,login_noUser_dict["check_url"])
self.assertEqual(wrong_msg, login_noUser_dict["check_msg"])