Selenium基础知识---POM设计模式
web自动化常用的设计模式就是POM(Page Pbject Model),其设计理念是进行分层。之前我们写百度搜索测试用例时候,所有的操作都在一块,修改起来比较麻烦,并且利用率不高。
POM的理念是,将获取元素的一些属性单独封装,每一个页面对应一个page class,每个页面都可以操作调用一些公用的元素方法类,这样后面即使需要变动,只需要看每一个page即可,其他地方不需要改动。
以下以百度首页为例的POM组织架构:
base下面封装的是定位元素,以及操作元素,如点击,输入内容,关闭浏览器,获取网页标题等一些可重复利用的常规操作
page下面则封装的是一个个页面,比如这里封装的是搜索页面
report下面存放的是输出的allure的报告
testcase下面封装的是搜索测试用例
main.py是用pytest框架运行此测试用例,并且输出测试报告。
代码如下
base_element.py
rom selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class Base: def __init__(self,driver): self.driver=driver self.driver.maximize_window() def go_page(self,url): self.driver.get(url) def find_element(self,*loc): return self.driver.find_element(*loc) def send_key(self,text,*loc): self.find_element(*loc).send_keys(text) def ele_clear(self,*loc): self.find_element(*loc).clear() def ele_click(self,*loc): self.find_element(*loc).click() def page_title(self): return self.driver.title def web_quit(self): self.driver.quit() def wait_title_content(self,title): WebDriverWait(self.driver,5).until(EC.title_contains(title))
search_page.py
from selenium.webdriver.common.by import By from pythonProject.DemoTesting.baidu.base.base_element import Base from selenium import webdriver class SearchPage(Base): page_url = 'https://www.baidu.com' search_input=(By.ID,'kw') search_btn=(By.ID,'su') def __init__(self): driver = webdriver.Chrome() Base.__init__(self,driver) self.go_page(self.page_url) def clear_input(self): self.ele_clear(*self.search_input) def input_text(self,text): self.send_key(text,*self.search_input) def click_btn(self): self.ele_click(*self.search_btn)
test_search.py
import time from pythonProject.DemoTesting.baidu.page.search_page import SearchPage import allure @allure.feature('百度首页') class TestSearch: def setup_class(self): self.baidu_search = SearchPage() @allure.story('测试百度搜索框,输入为 selenium') @allure.description('进入百度首页,测试百度搜索框功能,输入内容为 selenium') @allure.title("testcase1:搜索 selenium") def test_case1(self): self.baidu_search.clear_input() self.baidu_search.input_text('selenium') self.baidu_search.click_btn() self.baidu_search.wait_title_content('selenium') assert self.baidu_search.page_title()=='selenium_百度搜索' @allure.story('测试百度搜索框,输入为 自动化测试') @allure.description('进入百度首页,测试百度搜索框功能,输入内容为 自动化测试') @allure.title("testcase2:搜索 自动化测试") def test_case2(self): self.baidu_search.clear_input() self.baidu_search.input_text('自动化测试') self.baidu_search.click_btn() self.baidu_search.wait_title_content('自动化测试') assert self.baidu_search.page_title() == '自动化测试_百度搜索' def teardown_class(self): time.sleep(1) self.baidu_search.web_quit()
main.py
import os import pytest if __name__ == '__main__': pytest.main(['-vs', "./testcase/test_search.py", "--alluredir", "./report/allure-result"]) os.system(r"allure generate --clean ./report/allure-result -o ./report/allure-report")