1.创建一个case包,start_app的python文件

#coding=utf-8
from appium import webdriver
from util.read_init import ReadIni
from util.get_by_local import GetByloacl
import time
def get_driver():
desc={
"platformName":"Android",
"platformVersion":"5.1.1",
"deviceName":"emulator-5554",
"appPackage":"com.tencent.mobileqq",
"appActivity":".activity.SplashActivity",
"noReset":"True" }
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desc)
return driver def get_click():
get_by_local=GetByloacl(driver)
get_by_local.get_element('click').click()
time.sleep(1)
get_by_local.get_element('username').send_keys('11111')
get_by_local.get_element('password').send_keys('22222') driver=get_driver()
get_click()
----------------------------------------------------------------------------------------------

2.创建一个config目录,text1.ini文件

[login_element]
click=id>com.tencent.mobileqq:id/btn_login
username=classname>android.widget.EditText
password=id>com.tencent.mobileqq:id/password
login_button=loginbutton
[course_element]
course=price

----------------------------------------------------------------------------------------------------------------------------------------

3.创建util包,创建get_by_loacl的python文件 读取配置文件

#coding=utf-8
from util.read_init import ReadIni class GetByloacl:
def __init__(self,driver):
self.driver=driver
def get_element(self,key):
read_ini = ReadIni()
local=read_ini.get_value(key)
if local!=None:
by=local.split('>')[0]
local_by=local.split('>')[1]
if by=='id':
return self.driver.find_element_by_id(local_by)
elif by=='classname':
return self.driver.find_element_by_class_name(local_by)
else:
return self.driver.find_element_by_xpath(local_by)
else:
return None

(2)封装定位信息的python read_init文件

#coding=utf-8
import configparser
class ReadIni():
def __init__(self,file_path=None):
if file_path==None:
self.file_path=r'E:\Users\00\PycharmProjects\untitled\config\text1.ini' else:
self.file_path=file_path
self.data=self.read_ini() def read_ini(self):
read_ini = configparser.ConfigParser()
read_ini.read(r'E:\Users\00\PycharmProjects\untitled\config\text1.ini')
return read_ini
def get_value(self,key,section=None):
if section==None:
section='login_element'
try:
value = self.data.get(section, key)
except:
value=None return value if __name__=='__main__':
read_ini=ReadIni()
print(read_ini.get_value("course","course_element"))

--------------------------------------------------------------------------------------------------------------------------------------------

创建一个doc_cmd文件     封装执行命令方法

#coding=utf-8
import os
class DosCmd:
def excute_cmd_result(self,command):
result_list = []
result = os.popen(command).readlines()
for i in result:
if i =='\n':
continue
result_list.append(i.strip('\n'))
return result_list def excute_cmd(self,command):
os.system(command) if __name__ == '__main__':
dos = DosCmd()
print (dos.excute_cmd_result('adb devices'))
---------------------------------------------------------------------------------------------------------------------------
#coding=utf-8
from util.doc_cmd import DosCmd
class Port:
def port_is_used(self,port_num):
'''
判断端口是否被占用
'''
flag = None
self.dos = DosCmd()
command = 'netstat -ano | findstr '+str(port_num)
result = self.dos.excute_cmd_result(command)
if len(result)>0:
flag = True
else:
flag = False
return flag def create_port_list(self,start_port,device_list):
'''start_port 4701
生成可用端口
@parameter start_port
@parameter device_list
'''
port_list = []
if device_list != None:
while len(port_list) != len(device_list):
if self.port_is_used(start_port) != True:
port_list.append(start_port)
start_port = start_port +1
return port_list
else:
print ("生成可用端口失败")
return None if __name__ == '__main__':
port = Port()
li = [1,2,3,4,5]
print (port.create_port_list(4722,li))
创建一个server文件  多线程启动appium服务端
#coding=utf-8
from util.doc_cmd import DosCmd
from util.port import Port
import threading
class Server:
def get_devices(self): self.dos =DosCmd()
devices_list = []
result_list = self.dos.excute_cmd_result('adb devices')
if len(result_list)>=2:
for i in result_list:
if 'List' in i:
continue
devices_info = i.split('\t')
if devices_info[1]=='device':
devices_list.append(devices_info[0])
return devices_list
else:
return None
def create_port_list(self,start_port):
port=Port()
port_list=port.create_port_list(start_port,self.get_devices())
return port_list
def create_commed_list(self):
command_list=[]
appium_port_list=self.create_port_list(4700)
bootstrap_port_list=self.create_port_list(4900)
device_list=self.get_devices()
for i in range(len(device_list)):
command='appium -p '+str(appium_port_list[i])+" -bp "+str(bootstrap_port_list[i])+" -U "+device_list[i]+" --no-reset --session-override"
command_list.append(command)
return command_list
def start_server(self,i):
self.start_list=self.create_commed_list()
self.dos.excute_cmd(self.start_list[i])
def main(self):
for i in range(len(self.create_commed_list())):
appium_start=threading.Thread(target=self.start_server,args=(i,))
appium_start.start()
if __name__ == '__main__':
server=Server()
# print(server.create_commed_list())
# print(server.start_server())
print(server.main())
-------------------------------------------------------------------------------------------------------------------

4.创建page包,创建一个 login_page的python文件

#coding=utf-8
from util.get_by_local import GetByloacl
class LoginPage:
def __init__(self,driver):
self.get_by_local = GetByloacl(driver) def get_username_element(self):
return self.get_by_local.get_element('username') def get_password_element(self):
return self.get_by_local.get_element('password') def get_login_elemnt(self):
return self.get_by_local.get_element('click')

----------------------------------------------------------------------------------------------------------------------------

5.创建一个handle包,login_handle的python文件

#coding=utf-8
from page.login_page import LoginPage
class Login_handle():
def __init__(self,driver):
self.login_page=LoginPage(driver)
def send_username(self,user): self.login_page. get_username_element().send_keys(user)
def send_password(self,password):
self.login_page.get_password_element().send_keys(password)
def send_click(self):
self.login_page.get_login_elemnt().click()

---------------------------------------------------------------------------------------------------------------------------------------

6.创建bussiness包,一个 login_bussiness的python文件

#coding=utf-8
from handle.login_handle import Login_handle
class Login_bussiness:
def __init__(self,driver):
self.login_handle=Login_handle(driver)
def login_pass(self):
self.login_handle.send_username('11111')
self.login_handle.send_password('22222')
self.login_handle.send_click() def login_user_error(self):
self.login_handle.send_username('12111')
self.login_handle.send_password('25222')
self.login_handle.send_click()

appium分层自动化的封装的更多相关文章

  1. appium安卓自动化的 常用driver方法封装

    appium安卓自动化的 常用driver方法封装 做安卓自动化的时候,很多方法写起来会造成代码冗余,把这部分封装起来 ,添加到androidUI工具类里,随时可调用 都放在这个类下面: @Compo ...

  2. Appium UI自动化的那些梗

    @作者 彭海波 转载请注明出处 前言 由于需求的快速迭代和敏捷测试的要求,在测试过程中引入自动化成为必不可少的手段.作为一个互联网测试团队,我们自然也引入了自动化测试这个环节.在众多的测试框架中,我们 ...

  3. Appium+python自动化

    名称 链接地址 Appium+python自动化8-Appium Python API(上) http://mp.weixin.qq.com/s/WvpT5oRrYY22avI95FuypQ Appi ...

  4. 阿里巴巴CI:CD之分层自动化实践之路

    阿里巴巴CI:CD之分层自动化实践之路 2018-05-30 摘自:阿里巴巴CI:CD之分层自动化实践之路 目录 1 自动化  1.1 为什么要做自动化?  1.2 自动化的烦恼  1.3 自动化的追 ...

  5. Appium+python自动化8-Appium Python API

    Appium+python自动化8-AppiumPython API   前言: Appium Python API全集,不知道哪个大神整理的,这里贴出来分享给大家. 1.contexts conte ...

  6. appium+python自动化61-中文输入乱码问题解决

    前言 在夜神模拟器上输入中文,发现是乱码,将unicodeKeyboard和resetKeyboard参数设置为True了,发现还是没法解决. 打开手机设置语言和输入法,发现找不到Appium And ...

  7. appium安卓自动化常见问题处理

    appium安卓自动化常见问题处理 1.seesionnotcreatedexception 遇到这个首先确定下jdk需要1.7以上 然后还要确定appium是启动状态,可以cmd重启下appium ...

  8. 阿里巴巴CI/CD之分层自动化

    一佛是阿里巴巴B2B事业群高级产品经理.从事多年互联网系统的研发和测试工作,目前主要负责云效分层自动化测试的产品设计.因为自动化测试在实践过程中,总是碰到各种各样的问题,导致进入自动化测试盲区.所以, ...

  9. appium+python自动化57-chromedriver与chrome版本

    前言 由于app的webview自动化是依赖于chromedriver的,并且每个app的webview版本号都不太一样,这就导致了,每次都需要重新去下载对应的chromedriver版本.如何根据当 ...

随机推荐

  1. Java和JS MD5加密-附盐值加密demo

    JAVA和JS的MD5加密 经过测试:字母和数据好使,中文不好使. 源码如下: ** * 类MD5Util.java的实现描述: * */public class MD5Util { // 获得MD5 ...

  2. N天学习一个Linux命令之top

    用途 查看机器负载以及进程资源占用情况,linux系统性能分析工具 用法 top -hv | -abcHimMsS -d delay -n iterations -p pid [, pid ...] ...

  3. 中国移动MySQL数据库优化最佳实践

    原创 2016-08-12 章颖 DBAplus社群 本文根据DBAplus社群第69期线上分享整理而成,文末还有书送哦~ 讲师介绍章颖 数据研发工程师 现任中国移动杭州研发中心数据研发工程师,擅长M ...

  4. dataguard switchover to physical stnadby

    首先做一系列的check check 当前primary 的 standby redo log是否存在 SQL> select * from v$logfile; GROUP# STATUS T ...

  5. 027依据前序遍历和中序遍历,重建二叉树(keep it up)

    剑指offer中题目:http://ac.jobdu.com/problem.php?pid=1385 题目描写叙述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.如果输入的前序遍历和中 ...

  6. OllyDbg 使用笔记 (七)

    OllyDbg 使用笔记 (七) 參考 书:<加密与解密> 视频:小甲鱼 解密系列 视频 演示样例程序下载:http://pan.baidu.com/s/1gvwlS 暴力破解 观察这个程 ...

  7. MFC小程序003------MFC使用WebBrowser组件,在对话框中创建滚动视图,动态创建一个静态文本控件并设置鼠标单击的消息响应

    MFC小程序截图: 一.在MFC中简单使用WebBrowser的ActiveX插件的方法: 见博文:  http://blog.csdn.net/supermanking/article/detail ...

  8. 加密学教程(Cryptography Tuturials)文件夹

    加密学教程(Cryptography Tuturials) 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致&quo ...

  9. java的list类

    java的list类 目录: list中添加,获取,删除元素: list中是否包含某个元素: list中根据索引将元素数值改变(替换): list中查看(判断)元素的索引: 根据元素索引位置进行的判断 ...

  10. spring:利用Spring AOP 使日志输入与方法分离

    对方法进行日志输出是一种很常见的功能.传统的做法是把输出语句写在方法体的内部,在调用该方法时,用输入语句输出信息来记录方法的执行! 1.先写一个普通类: package com.importnew; ...