selenium之使⽤POM模式设计PO类,将POM模式运⽤到项⽬中
终极⽬标就是运⽤DDT思想+POM思想+pytest框架来最终实现项⽬
但是这样虽然松耦合了但是pom思想多维护了⼀个类,视情况⽽定,可以不⽤pom思想
最基本的逻辑就是:
test_user_login调⽤UserLoginPage⽂件调⽤basePage⽂件
test_category调⽤categoryPage⽂件调⽤basePage⽂件
⽂件⽬录:
具体例⼦:
BasePage⽅法中的代码是:
#这是个基类封装⼀些定位⽅法
class BasePage(object):
def __init__(self, driver):
self.driver = driver  #初始化
#定位元素
def find_element(self,*loc):
return self.driver.find_element(*loc)
#输⼊值
def type_text(self, text,*loc):
self.find_element(*loc).send_keys(text)
#点击确认
def click(self,*loc):
self.find_element(*loc).click()
#清空
def clear(self,*loc):
self.find_element(*loc).clear()
#获取title标题
def get_title(self):
return self.driver.title
登录的页⾯设计,调⽤basepage⽅法 处理登录
UserLoginPage:
#设计页⾯对象
from time import sleep
from selenium.webdrivermon.by import By
from testcases.pom.pages.basePage import BasePage
class UserLoginPage(BasePage):
#先到定位器
username_input =(By.NAME,'username')
pwd_input =(By.NAME,'password')
login_btn =(By.CLASS_NAME,'btn')
#先初始化,⽤BasePage的init⽅法
def __init__(self, driver):
BasePage.__init__(self, driver)
#登录⼊⼝
def goto_login_page(self):
('localhost:8080/jpress/user/login')        self.driver.maximize_window()
#⽤户名的定位和输⼊值
def input_username(self, username):
#调⽤basePage⽅法
self.clear(*self.username_input)
#输⼊密码
def input_pwd(self, pwd):
# 调⽤basePage⽅法
self.clear(*self.pwd_input)
#点击确定
def click_login_btn(self):
# 调⽤basePage⽅法
selenium怎么使用self.click(*self.login_btn)
sleep(2)
然后测试案例运⾏,执⾏⽤户登录:
#运⽤DDT思想以及pom和pytest综合设计测试案例
#test_user_login调⽤UserLoginPage⽂件调⽤basePage⽂件
from time import sleep
import pytest
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait
from testcases.pom.ddt.pages.UserLoginPage import UserLoginPage
import pyautogui  #通过定位坐标来到元素
class TestUserLogin(object):
login_data =[
('','root','信息提交错误'),
('root','root','Jpress'),
]
def setup_class(self):
#初始化
self.driver = webdriver.Chrome()
#登录的初始化
self.loginPage =UserLoginPage(self.driver)
#调⽤登录⼊⼝
_login_page()
# 测试⽤户登录,⽤户名错误
# 测试⽤户登录成功
#为了后⾯的依赖关系
@pytest.mark.dependency(name='admin_login')
@pytest.mark.parametrize('username, pwd, expected', login_data)    def test_user_login(self,username, pwd, expected):
# 输⼊⽤户名 #调⽤UserLoginPage⽂件中的⽅法
self.loginPage.input_username(username)
# 输⼊密码#调⽤UserLoginPage⽂件中的⽅法
self.loginPage.input_pwd(pwd)
# 点击登录#调⽤UserLoginPage⽂件中的⽅法
self.loginPage.click_login_btn()
sleep(3)
# 等待提⽰框
if username =='':
WebDriverWait(self.driver,5).until(EC.alert_is_present())
alert = self.driver.switch_to.alert
# 验证(断⾔)还是改成se⾃带的断⾔
== expected
alert.accept()
else:
# 等待提⽰框
WebDriverWait(self.driver,5).until(EC.title_is(expected))
sleep(3)
#验证因为没有弹窗所以⽤到了title断⾔判断
assert self.driver.title == expected
# @classmethod
# def teardown_class(cls):
#    cls.driver.quit()
if __name__ =='__main__':
pytest.main(['-sv','test_user_login.py'])
这样就实现登录了 也实现了解耦合。
下⾯是⽂章分类实现,有⼀个登录依赖关系
先看⼀下categoryPage⽂件
⽂章分类的处理:
#设计页⾯对象
from time import sleep
from selenium.webdrivermon.by import By
from selenium.webdriver.support.select import Select
from testcases.pom.pages.basePage import BasePage
class CategoryPage(BasePage):
def __init__(self, login): #先初始化
BasePage.__init__(self, login.driver)
# ⽂章loc
click_article_loc =(By.XPATH,'//*[@id="article"]/a/span')
# 分类loc
click_category_loc =(By.XPATH,'//*[@id="category"]/a')
# 分类名称loc
category_name_loc =(By.NAME,'taxonomy.title')
# ⽗分类loc
parent_category_loc =(By.NAME,'taxonomy.parent_id')
# slug loc
slug_loc =(By.NAME,'taxonomy.slug')
# 添加按钮
add_btn_loc =(By.XPATH,'//*[@id="form"]/button')
# 点击⽂章
def click_article(self):
#调⽤basepage基类的⽅法
self.click(*self.click_article_loc)
sleep(1)
# 点击分类
def click_category(self):
# 调⽤basepage基类的⽅法
self.click(*self.click_category_loc)
sleep(1)
# 输⼊分类名称
def input_category_name(self, name):
# 调⽤basepage基类的⽅法
sleep(1)
# 选择⽗分类
def select_parent_category(self, parent_name):
# 调⽤basepage基类的⽅法
parent_category_elem = self.find_element(*self.parent_category_loc) Select(parent_category_elem).select_by_visible_text(parent_name)    # 输⼊slug
def input_slug(self, slug):
# 调⽤basepage基类的⽅法
# 点击添加
def click_add_btn(self):
# 调⽤basepage基类的⽅法
self.click(*self.add_btn_loc)
然后运⾏⽂章分类的测试案例:
test_category⽂件:
#运⽤DDT思想以及pom和pytest综合设计测试案例
#test_category调⽤categoryPage⽂件调⽤basePage⽂件
# ⽂章分类
#注意下拉框选⽗级菜单时⽤到select⽅法
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from time import sleep
import pytest
from testcases.st_user_login import TestUserLogin
from testcases.pom.ddt.pages.categoryPage import CategoryPage
class TestCategory(object):
#先初始化登录
def setup_class(self):
self.login =TestUserLogin()
self.categoryPage =CategoryPage(self.login)
#成功和失败
category_data =[
('','python','test','名称不能为空!'),
('test','python','test',''),
]
# 测试⽂章分类成功因为需要依赖登录
@pytest.mark.dependency(depends=['admin_login'], scope="module")    #参数化
@pytest.mark.parametrize('name,parent,slug,expected', category_data)    def test02_add_category(self,name,parent,slug,expected):
if name =='':
# 点击⽂章 #调⽤categoryPage⽂件的⽅法
self.categoryPage.click_article()
# 点击分类#调⽤categoryPage⽂件的⽅法
self.categoryPage.click_category()
# 输⼊分类名称#调⽤categoryPage⽂件的⽅法
self.categoryPage.input_category_name(name)
# 选择⽗分类#调⽤categoryPage⽂件的⽅法
self.categoryPage.select_parent_category(parent)
# 输⼊slug#调⽤categoryPage⽂件的⽅法
self.categoryPage.input_slug(slug)
# 点击添加#调⽤categoryPage⽂件的⽅法
self.categoryPage.click_add_btn()
if name=='':
# 因为有弹窗所以需要切换到弹窗上
WebDriverWait(self.login.driver,7).until(EC.alert_is_present())
alert = self.login.driver.switch_to.alert
# python 的断⾔
# 获取弹窗上的⽂字来⽐较
== expected
alert.accept()
else:
#没有异常就添加成功直接断⾔成功就好了
assert 1==1

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。