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.webdriver.common.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):
        self.driver.get('http://localhost:8080/jpress/user/login')
        self.driver.maximize_window()
    #用户名的定位和输入值
    def input_username(self, username):
        #调用basePage方法
        self.clear(*self.username_input)
        self.type_text(username, *self.username_input)

    #输入密码
    def input_pwd(self, pwd):
        # 调用basePage方法
        self.clear(*self.pwd_input)
        self.type_text(pwd, *self.pwd_input)

    #点击确定
    def click_login_btn(self):
        # 调用basePage方法
        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)
        #调用登录入口
        self.loginPage.goto_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自带的断言
            assert alert.text == 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.webdriver.common.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基类的方法
        self.type_text(name, *self.category_name_loc)
        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基类的方法
        self.type_text(slug, *self.slug_loc)

    # 点击添加
    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.pom.ddt.tests.test_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 的断言
            # 获取弹窗上的文字来比较
            assert alert.text == expected
            alert.accept()
        else:

            #没有异常就添加成功直接断言成功就好了
            assert 1 == 1



if __name__ == '__main__':
    # 这里可以跳过登录错误
    pytest.main(['test_category.py'])

这样下来整个项目就是跑通了,后期会有分布测试以及持续集成和交付就全部结束了。敬请期待!!!!

  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Selenium的Python语言,也可以使用POM(Page Object Model)设计模式来实现页面跳转和滚动浏览。下面是一个示例代码,演示如何在Python使用POM模式实现页面跳转和滚动浏览: ```python from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support.ui import Select class HomePage: def __init__(self, driver): self.driver = driver def go_to_login_page(self): login_link = self.driver.find_element_by_link_text("Login") login_link.click() def scroll_to_bottom(self): self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") ``` 在上面的示例代码,我们定义了一个HomePage,其包含了两个方法:go_to_login_page()用于跳转到登录页面,scroll_to_bottom()用于滚动到页面底部。这些方法都是基于Selenium WebDriver实现的,可以与其他测试代码一起使用,以实现自动化测试的目的。 在这个示例,我们使用Selenium WebDriver提供的方法来找到页面上的元素(如链接)并与之交互。我们也使用了execute_script()方法来执行JavaScript代码以实现页面滚动。 使用POM模式可以使测试代码更加模块化和可维护,从而提高测试的效率和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值