分为三层模块
1. 底层设置 basepage()模块 (使用的技术栈)
封装app的基本操作,例如点击,输入数据,滑动等
import os
import random
from appium.webdriver.webdriver import WebDriver
from selenium.common import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
from utils.error_handle import black_wrapper
from utils.log_util import logger
from utils.utils import Utils
class BasePage:
def __init__(self,driver:WebDriver = None):
self.driver = driver
# 找元素
@black_wrapper
def find(self, by, value):
# logger.info(f"定位的元素为{by,value}")
return self.driver.find_element(by, value)
# 查找多个元素
@black_wrapper
def finds(self, by, value):
logger.info(f"定位的元素为{by, value}")
# 返回一个列表
return self.driver.find_elements(by, value)
# 找到并点击
def find_and_click(self, by, value):
logger.info(f"点击的元素为{by, value}")
self.find(by, value).click()
# 找到并获取元素文本
def find_and_text(self, by, value):
logger.info(f"获取文本的元素为{by, value}")
return self.find(by, value).text
# 清空输入框
def find_and_clear(self,by,value):
logger.info(f"清空数据定位的元素为{by, value}")
self.find(by,value).clear()
# 找到并输入信息
def find_and_send_keys(self, by, value, text: str):
logger.info(f"输入数据定位的元素为{by, value}")
self.find(by,value).send_keys(text)
2. basedriver
app初始化设置 模块(继承basepage模块)
对app进行初始化,打开,关闭 等操作
# 完成企业微信 app 相关的设置
from appium import webdriver
from wewrok_app_po.Base.base_page import BasePage
'''
1. 先搭建空架子,不填写内容,运行通过,可能会有循环导入的问题,把导入放在方法中即可
2. 添加内容,在 wework_app.py 中完成 driver 的实例化,并且在页面跳转的时候,完成 driver 的传递
3. 各个页面,使用构造函数来接受传递过来的 driver
'''
'''
4.封装了基础配置的类 base_page.py
5.完成了 appium 底层操作的封装,和一些常用方法的封装
6.WeWorkApp 继承了 BasePage,其他各个 Page 继承 WeWork,完成了 driver 的传递和基础方法的调用
7 分离了定位表达式和具体的方法,在各个页面中调用 BasePage 中封装的查找元素以及相关操作的方法
'''
class WeWorkApp(BasePage):
# 启动app
def start(self):
# 定义一个json串
caps = {}
# 设置app的平台 android 或者 ios
caps["platformName"] = "android"
# 设置设备名称
caps["appium:deviceName"] = "wework"
# 设置设备包名
caps["appium:appPackage"] = "com.tencent.wework"
# 设置app的启动页
caps["appium:appActivity"] = ".launch.WwMainActivity"
# 不清除缓存启动app
caps["appium:noReset"] = "true"
# 不重启app
caps["appium:dontStopAppOnReset"] = "true"
# 设置版本
caps["platformVersion"] = '6.0'
# 动态设置页面刷新等待时间
caps['settings[waitForIdleTimeout]'] = 1
# client 与 server端建立连接的代码
self.driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", caps)
# 设置全局隐式等待时间
self.driver.implicitly_wait(10)
return self
def restart(self):
# 重启app
# 关闭app
self.driver.close()
# 激活后台的app
self.driver.activate_app("com.tencent.wework")
return self
def stop(self):
self.driver.back()
self.driver.quit()
def goto_main_page(self):
from wewrok_app_po.Page.main_page import MainPage
return MainPage(self.driver)
3. page模块 (继承app初始化)
对应操作页面,将每个页面中的操作和元素封装成方法,
编写对应的流程
每个方法return到要跳转的页面或者返回要断言的结果
(这里只写了主页)
import allure
from selenium.webdriver.common.by import By
from wewrok_app_po.Base.wework_app import *
from wewrok_app_po.Page.addresslist import AddressListPage
from wewrok_app_po.Page.work_staging import WorkStaging
class MainPage(WeWorkApp):
# 页面元素定义为私有类属性
_CONTACT_BTN = By.XPATH, "//*[@text = '通讯录']"
_WORK_STAGING = By.XPATH, "//*[@text='工作台']"
# def __init__(self, driver: WebDriver):
# super().__init__(driver)
# self.driver = driver
def goto_address_list(self):
# 点击通讯录按钮
# 找到通讯录点击通讯录
with allure.step("点击通讯录按钮"):
self.find_and_click(* self._CONTACT_BTN)
# 跳转到通讯录页面
return AddressListPage(self.driver)
def goto_work_staging(self):
# 点击工作台
with allure.step("点击工作台按钮"):
self.find_and_click(*self._WORK_STAGING)
return WorkStaging(self.driver)
3. test模块
存放测试用例
1.setup里面 初始化app ,进入app的首页
2.teardown里面 停止app
3.测试用例
1.链式调用完成测试用例的步骤
2.然后要断言的文本信息
3.进行断言
from faker import Faker
from wewrok_app_po.Base.wework_app import WeWorkApp
class TestWeWork:
def setup_class(self):
# 准备测试数据
self.faker = Faker("zh_CN")
# 准备姓名和手机号
self.name = self.faker.name()
self.name1 = "耿世杰"
self.phone = self.faker.phone_number()
def setup(self):
# 初始化app
self.app = WeWorkApp()
# 进入首页
self.main = self.app.start().goto_main_page()
def teardown(self):
# 停止app
self.app.stop()
def test_del(self):
res = self.main.goto_address_list().goto_search_page().input_name(self.name1).get_name()
assert res == self.name1