浅谈测试自动化selenium之POM模式

基于本人也是一个初学者,在运用POM模式的时候记录一下自己的学习笔记。

如果你是大神,那么可以略过,如果你是初学者,希望对你有帮助。

本文阐述了以下几个问题:

什么叫POM模式

为什么要用POM模式

POM模式的思想

POM模式的运用

在刚学习selenium自动化测试的时候,一般都是:

1.打开网页

2.定位元素,进行操作

3.关闭网页

以百度为例:

python 复制代码
import time
from selenium import webdriver
from selenium.webdriver.common.by import By

driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")

text_input=driver.find_element(By.XPATH,'//*[@id="kw"]')
text_input.send_keys("京东")
submit_button=driver.find_element(By.XPATH,'//*[@id="su"]')
submit_button.click()
time.sleep(8)
driver.quit()

以上是一个简单的访问百度网页,搜索京东的例子。

因为只有一个页面,所以相对来说使用这种模式的弊端没有显露出来。

当被测对象有很多页面的时候,问题开始显现出来了。

假设在5个测试用例中都使用到了元素X,那么,当前端对元素X做了更新处理的时候。我们就需要找到这5个引用到了元素X的地方,对元素X进行更改。

所以,引入POM模式。

什么叫POM模式

POM模式:Page Object Model,即页面对象模型。

通俗讲,就是把页面的元素、操作、数据等分离开来,再通过用例调用。

本质上就是一种封装的思想,让代码逻辑更清晰,容易维护。这样的话,就能减少重复大量的定位元素和维护的时间成本。

为什么要用POM模式

通过这种模式,我们把页面的元素定位和业务操作分离开。

1.多个测试人员可同时编写和维护脚本

2.代码逻辑更清晰,更易维护

POM模式的思想

将页面分为3层:操作层、页面层、用例层

操作层:就是对一些元素的公共操作。比如:点击,输入,拖拽。

页面层:页面元素的定位,及属于该页面独有的操作也可封装在这里。

用例层:在页面中操作元素。也就是测试用例。

关系如下图,网络找的,侵删。

操作层:BasePage,点击,输入,拖拽等公共的操作。

页面层:Page,继承BasePage,实现元素定位以及一些该页面独有的功能。

用例层:TestCase,测试用例。

POM模式的运用

根据POM模式的思想:

1.首先封装公共操作到base_page

2.然后定位页面元素至page

3.最后在test_case写测试用例

base_page.py:

定义了打开网页,定位元素,点击,输入,关闭网页的方法。

可被其他页面继承。

python 复制代码
from selenium import webdriver
import logging
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class BasePage:
    def __init__(self):
        self.driver=webdriver.Chrome()

    def open_url(self,url):
        self.driver.get(url)
        self.driver.maximize_window()

    def find_element(self,locator,timeout=10):
        try:

            element=WebDriverWait(self.driver,timeout).until(EC.presence_of_element_located(locator))
            return element
        except:
            logging("{locator}元素没有找到")
            raise


    def click(self,locator):
        element=self.driver.find_element(*locator)
        element.click()

    def send_keys(self,locator,text):
        element=self.driver.find_element(*locator)

        element.send_keys(text)

    def quit(self):
        self.driver.quit()

index_page.py:

具体的页面元素定位,以及一些该页面元素独有的方法。

继承了BasePage。

python 复制代码
from selenium.webdriver.common.by import By
from base_page import BasePage
class IndexPage(BasePage):
    text_input = (By.XPATH, '//*[@id="kw"]')
    submit_button = (By.XPATH, '//*[@id="su"]')
    def input_text(self,text):
        self.send_keys(self.text_input,text)
    def submit(self):
        self.click(self.submit_button)

testcase.py

前置操作,初始化driver,打开网页。

执行测试用例。

后置操作,关闭浏览器。

python 复制代码
import time
import unittest
from index_page import IndexPage

class TestCaseSearch(unittest.TestCase):
    def setUp(self)->None:
        self.driver=IndexPage()
        self.driver.open_url("https://www.baidu.com/")

    def tearDown(self)->None:
        self.driver.quit()

    def testSearch(self):
        self.driver.input_text(text="京东")
        self.driver.submit()
        time.sleep(8)

if __name__ =="__main__":
    unittest.main()
相关推荐
好家伙VCC15 小时前
### WebRTC技术:实时通信的革新与实现####webRTC(Web Real-TimeComm
java·前端·python·webrtc
前端玖耀里16 小时前
如何使用python的boto库和SES发送电子邮件?
python
serve the people16 小时前
python环境搭建 (十二) pydantic和pydantic-settings类型验证与解析
java·网络·python
小天源16 小时前
Error 1053 Error 1067 服务“启动后立即停止” Java / Python 程序无法后台运行 windows nssm注册器下载与报错处理
开发语言·windows·python·nssm·error 1053·error 1067
喵手17 小时前
Python爬虫实战:HTTP缓存系统深度实战 — ETag、Last-Modified与requests-cache完全指南(附SQLite持久化存储)!
爬虫·python·爬虫实战·http缓存·etag·零基础python爬虫教学·requests-cache
喵手17 小时前
Python爬虫实战:容器化与定时调度实战 - Docker + Cron + 日志轮转 + 失败重试完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·容器化·零基础python爬虫教学·csv导出·定时调度
2601_9491465317 小时前
Python语音通知接口接入教程:开发者快速集成AI语音API的脚本实现
人工智能·python·语音识别
寻梦csdn18 小时前
pycharm+miniconda兼容问题
ide·python·pycharm·conda
Java面试题总结19 小时前
基于 Java 的 PDF 文本水印实现方案(iText7 示例)
java·python·pdf
不懒不懒19 小时前
【决策树算法实战指南:从原理到Python实现】
python·决策树·id3·c4.5·catr