PO设计模式(一)

文章目录

  • 【1】提出问题
  • 【2】PO设计模式
  • 【3】PO设计模式优势
  • 【4】示例

【1】提出问题

当有上百个用例,几十个页面的时候,我们会在测试用例中重复的使用到页面当中的元素和操作。当其中的页面发生变化时,我们需要在多个用例中去修改。这种情况下,代码多且乱,维护成本也不低。

那么有什么好的方式来解决这个问题呢?

【2】PO设计模式

在做web 测试时,无论是什么业务,都是在页面上去操作,即所有的测试用例都是在页面中操作的。比如一个用例是由5个页面的功能串行组成的。
假设一个产品有30个页面,有500个功能测试用例。那么这500个功能测试用例就是有30个页面的功能组成。

如此,如果能够把30个页面的功能封装起来,500个用例按照业务场景从30个页面当中调用需要的页面即可。

这种方式叫做PO模式,全称 Page object ,页面对象模型。
将页面的元素定位和元素行为封装成一个 page 类。
实现页面对象和测试用例分离。

在测试用例中,调用所需页面对象中的行为,组成测试用例。

【3】PO设计模式优势

1、当某个页面的元素发生变化,只需要修改该页面对象中的代码即可,测试用例不需要修改。
2、提高代码重用率。结构清晰,维护代码更容易。
3、测试用例发生变化时,不需要或者只需要修改少数页面对象代码即可,

【4】示例

登录页面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"])

你可能感兴趣的:(Selenium)