appium分层自动化的封装
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分层自动化的封装的更多相关文章
- appium安卓自动化的 常用driver方法封装
appium安卓自动化的 常用driver方法封装 做安卓自动化的时候,很多方法写起来会造成代码冗余,把这部分封装起来 ,添加到androidUI工具类里,随时可调用 都放在这个类下面: @Compo ...
- Appium UI自动化的那些梗
@作者 彭海波 转载请注明出处 前言 由于需求的快速迭代和敏捷测试的要求,在测试过程中引入自动化成为必不可少的手段.作为一个互联网测试团队,我们自然也引入了自动化测试这个环节.在众多的测试框架中,我们 ...
- Appium+python自动化
名称 链接地址 Appium+python自动化8-Appium Python API(上) http://mp.weixin.qq.com/s/WvpT5oRrYY22avI95FuypQ Appi ...
- 阿里巴巴CI:CD之分层自动化实践之路
阿里巴巴CI:CD之分层自动化实践之路 2018-05-30 摘自:阿里巴巴CI:CD之分层自动化实践之路 目录 1 自动化 1.1 为什么要做自动化? 1.2 自动化的烦恼 1.3 自动化的追 ...
- Appium+python自动化8-Appium Python API
Appium+python自动化8-AppiumPython API 前言: Appium Python API全集,不知道哪个大神整理的,这里贴出来分享给大家. 1.contexts conte ...
- appium+python自动化61-中文输入乱码问题解决
前言 在夜神模拟器上输入中文,发现是乱码,将unicodeKeyboard和resetKeyboard参数设置为True了,发现还是没法解决. 打开手机设置语言和输入法,发现找不到Appium And ...
- appium安卓自动化常见问题处理
appium安卓自动化常见问题处理 1.seesionnotcreatedexception 遇到这个首先确定下jdk需要1.7以上 然后还要确定appium是启动状态,可以cmd重启下appium ...
- 阿里巴巴CI/CD之分层自动化
一佛是阿里巴巴B2B事业群高级产品经理.从事多年互联网系统的研发和测试工作,目前主要负责云效分层自动化测试的产品设计.因为自动化测试在实践过程中,总是碰到各种各样的问题,导致进入自动化测试盲区.所以, ...
- appium+python自动化57-chromedriver与chrome版本
前言 由于app的webview自动化是依赖于chromedriver的,并且每个app的webview版本号都不太一样,这就导致了,每次都需要重新去下载对应的chromedriver版本.如何根据当 ...
随机推荐
- 对于Linux内核tty设备的一点理解
http://blog.chinaunix.net/uid-7828352-id-3233064.html
- HDU 4533
一道好题.想了好久没想出来,只是觉得总要二分独立处理矩形.感觉自己在把问题转化为数学公式以及分解问题的方面的能力很不足. http://blog.csdn.net/wh2124335/article/ ...
- 向Java枚举类型中加入新方法
除了不能继承enum之外,可将其看做一个常规类.甚至能够有main方法. 注意:必须先定义enum实例.实例的最后有一个分号. 以下是一个样例:返回对实例自身的描写叙述,而非默认的toString返回 ...
- Servlet仿CSDN动态验证码的生成-带数字和字母
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 一.实现的思路: (1)首先,须要创建一个Servlet.该Servlet通过字节型响应给cl ...
- alsa 用户空间编程【转】
本文转载自:http://blog.csdn.net/sjin_1314/article/details/12872581 /**alsa play test *ALSA用户空间编译,ALSA驱动的声 ...
- C# openfiledialog对文本框的操作//C#中OpenFileDialog的使用
在WebForm中提供了FileUpload控件来供我们选择本地文件,只要我们将该控件拖到页面上了,就已经有了选择本地文件的功能了.而在WinForm中,并没有为我们提供集成该功能的控件,但为我们提供 ...
- 逻辑回归 C++
#include <iostream>#include <string>#include <fstream>#include <sstream>#inc ...
- gulp安装成功但是无法使用
gulp安装正常,但是查看gulp -v和使用gulp的时候报错, 原因:缺少环境变量或环境变量错误. 查找环境变量的方法:在dos下输入npm config get prefix就会显示一个地址,这 ...
- Python 1:环境搭建及运行第一个程序
在计算机控制面板中找到系统,然后点击高级系统设置,再点击环境变量,把安装的python.exe的目录复制到下面系统变量的path栏最后面,复制前加个分号以隔开前面的变量,然后按3次确定即可退出配置.具 ...
- 5.27 indeed 第三次网测
1. 第一题, 没有看 2. 暴力枚举.每一个部分全排列, 然后求出最大的请求数. #include<bits/stdc++.h> #define pb push_back typedef ...