Selenium(一)——Page Object Model (POM)

1. 简介

  • POM是什么
    Page Object Model (POM) 直译为“页面对象模型”,这种设计模式旨在为每个待测试的页面创建一个页面对象(class),将那些繁琐的定位操作封装到这个页面对象中,只对外提供必要的操作接口。

  • POM 有什么好处
    POM 将页面定位和业务操作分开,分离了测试对象和测试脚本,如果UI更改页面,测试脚本不需要更改,只需要更改页面对象中的某些代码就可以,提高了可维护性。

2. 举个例子

  • 比如测试一个登陆页面:新浪微博 ,执行测试的人员传递不同的数据到帐号、密码框就可以了,而不应该去顾虑:页面是否已经加载完成?怎样定位到帐号输入框?怎样定位到登陆按钮等等问题。
    这些问题全部交由登陆页面的“页面对象”去解决并封装起来,只提供给测试人员三个接口方法:1.帐号输入接口、2.密码输入接口、3.提交接口。
  • 首先定义一个基本页面 BasePage类 ,定义基本的页面操作,提供给其他页面去继承,basePage.py 内容如下:
  1 from selenium import webdriver
  2 from selenium.webdriver.support.wait import WebDriverWait
  3 from selenium.webdriver.support import expected_conditions as EC
  4 
  5 class BasePage(object):
  6     """
  7     基础页面,提供给其他页面继承
  8     """
  9     def __init__(self, driver, base_url, title):
 10         """
 11         初始化
 12         """
 13         self.driver = driver
 14         self.base_url = base_url
 15         self.title = title
 16 
 17     def _open(self, url):
 18         """
 19         私有方法,打开url参数指定的页面,
 20         并检查打开是否正确
 21         """
 22         self.driver.get(url)
 23         # 显式等待10秒,如果打开页title与预期不符或者超时,抛出异常
 24         WebDriverWait(self.driver, 10).until(EC.title_is(self.title))
 25 
 26     def open(self):
 27         """
 28         公共方法,调用私有方法_open()打开链接
 29         """
 30         self._open(self.base_url)
 31 
 32     def find_element(self, *loc):
 33         """
 34         定位指定元素
 35         """
 36         # 显式等待元素,超过10秒未找到则抛出超时异常(TimeoutException)
 37         # presence_of_element_located: 不关心元素是否可见,只关心元素是否存在在页面中
 38         # visibility_of_element_located: 不仅找到元素,并且该元素必须可见
 39         WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located(loc))
 40         return self.driver.find_element(*loc)
 41 
 42 if __name__ == '__main__':
 43     driver = webdriver.Chrome()
 44     page = BasePage(driver, 'https://www.baidu.com/')
 45     page.open()
 46     driver.quit()
  • 再定义一个 LoginPage类 继承 BasePage类 ,向外提供测登陆方法。文件命名为 xl_login.py ,内容如下:
  1 from selenium import webdriver
  2 from selenium.webdriver.common.by import By
  3 from basePage import BasePage
  4 
  5 
  6 class LoginPage(BasePage):
  7     """
  8     新浪微薄登陆页面
  9     继承自基础页面BasePage
 10     """
 11     # 定位帐号输入框
 12     username_loc = (By.ID, 'loginname')
 13     # 定位密码输入框
 14     password_loc = (By.NAME, 'password')
 15     # 定位登陆按钮
 16     submit_loc = (By.XPATH, '//*[@id="pl_login_form"]/div/div[3]/div[6]/a')
 17     # 定位提示信息,如:请输入验证码
 18     # 不要迷信开发者工具提供的Xpath,
 19     # 比如这里提供的Xpath://*[@id="layer_15582553868501"]/div/p/span[2],
 20     # id是动态的,无法使用,需自行推到Xpath
 21     message_loc = (By.XPATH, '//div[@class="content layer_mini_info"]/p/span[2]')
 22 
 23     # 输入用户名操作
 24     def type_username(self, username):
 25         self.find_element(*self.username_loc).send_keys(username)
 26 
 27     # 输入密码操作
 28     def type_password(self, password):
 29         self.find_element(*self.password_loc).send_keys(password)
 30 
 31     # 点击登陆按钮操作
 32     def submit(self):
 33         self.find_element(*self.submit_loc).click()
 34 
 35     # 获取提示信息
 36     def get_message(self):
 37         return self.find_element(*self.message_loc).text
 38 
 39 if __name__ == '__main__':      # 测试登陆
 40     # 预打开页面
 41     base_url = 'https://weibo.com/'
 42     # 页面title
 43     title = '微博-随时随地发现新鲜事'
 44      # 准备好待输入的用户名和密码
 45     username = 'haha'
 46     password = 'hehe'
 47 
 48     # 打开Chrome浏览器
 49     driver = webdriver.Chrome()
 50     # 登陆页面初始化
 51     login = LoginPage(driver, base_url, title)
 52     # 打开新浪微博页
 53     login.open()
 54     # 输入用户名
 55     login.type_username(username)
 56     # 输入密码
 57     login.type_password(password)
 58     # 点击登陆
 59     login.submit()
 60     # 打印提示信息
 61     print(login.get_message())
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,427评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,551评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,747评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,939评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,955评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,737评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,448评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,352评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,834评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,992评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,133评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,815评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,477评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,022评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,147评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,398评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,077评论 2 355

推荐阅读更多精彩内容