借贷宝app
首先了由于本文并不是走的api破解或是apk逆向的路子,所以各位勿喷。其次经过验证APPium加上模拟器的路子不太好除非你用真机做的(这类需求做游戏项目之内可以试试),当然可能是我没get到正确的姿势。最后本文由于幅度太长会分开两篇。本文是appium服务器多开,多线程控制不同app。。。。
#主配置篇#appium分装的函数
1模块
import selenium.webdriver.support.ui as ui
from appium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from appium.webdriver.common.touch_action import TouchAction
import sys
import socket
import subprocess
import os
sys.path.append(os.path)
2函数#自己随便构建一个类class
2.1#检查端口占用
#检查端口占用
def isOpen(self,ip, port):
"""
本函数主要是检测本地开启的cmd有没有被占用,使用appium的端口,就是检测appium的server是否被占用,占用返回端口号,未被占用返回FALSE
:param ip: 由于appium在本地本片中是127.0.0.1,当然这个函数可以通用
:param port:当前开启的cmd窗口占用的端口
:return:返回被占用的端口号,或false
"""
#创建套接字,绑定套接字到本地IP与端口
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect((ip, int(port)))#尝试连接ip,和端口,连接失败报错,只有在cmd中存在该端口的情况下才能联通
s.shutdown(2) # 0代表禁止下次的数据读取;1代表禁止下次的数据写入;2代表禁止下次的数据读取和写入
print('%d 被占用' % port)
return port
except Exception:
return false
# 开启appium服务
关于socket点这
2.2#检测之后在未被占用的cmd中开启appium server
#开启appium server
def appium_start(self, host, port):
bootstrap_port = str(port + 1)#port自动加1,批量开启的情况下
# /b是不打开cmd命令窗口,开启appium server命令,空格不可少
cmd = 'start appium -a ' + host + ' -p ' + str(port) + ' -bp ' + str(bootstrap_port)
#这个是连接cmd的命令相当于构建一个进程通道,规定输出位置,可自行百度
subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
2.3关闭appium,我是直接手关cmd。没用上
def kill_appium(self): # 关闭appium 服务
cmd_kill = 'pkill node'
os.system(cmd_kill)
print('close appium service')
3:appium开启app,以及在app中的使用func
3.1appium server中开启app,连接上返回driver,udid,(driver是记录所以要传递出去)
def mobile_setConfig(self, udid, appPackage, appActivity, port="4723",ip="http://127.0.0.1:",platformName="Android", timeout=10):
"""
使用appium开启app必要的配置文件
:param udid: 分配给APP的udid,127.0.0.1:21503,这个实际上是分给机型的身份标志。我用模拟器是逍遥。所以此处是个关键
:param appPackage:package名称:"com.yxbao.faith"
:param appActivity:当前页面开启的使用活动路径
:param port:
:param ip:
:param platformName:app所在的系统
:param timeout:超时时间
:return:
"""
try:
# self.desired=desired_caps
# self.adbs = adb.AdbTools()
self.lastPageSource = ""
desired_caps = {}
# 再次访问不需验证
desired_caps["noSign"] = "true"
desired_caps["noReset"] = "true"
# 启用unicode输入,可以输入中文
desired_caps["unicodeKeyboard"] = True
desired_caps["resetKeyboard"] = True
desired_caps["deviceName"] = udid
desired_caps["platformName"] = platformName
desired_caps["udid"] = udid
desired_caps['newcommandTimeout'] = timeout
# desired_caps["app"] = os.path.dirname(self.url)+"/apps/{param1}"
desired_caps["appPackage"] = appPackage
desired_caps["appActivity"] = appActivity
remoteurl=str(ip) + str(port) + "/wd/hub"
driver = webdriver.Remote(remoteurl, desired_caps)
return driver,udid
except Exception as e:
print(e)
return {'status': False, 'msg': '%s' % ("--" + "--driver init ERROR--" + "--[异常信息]:%s" % repr(e))}
3.2等待某标签出现
#等待相应xpath标签出现直至报错
def waitXPATH(self,driver,xpath):
'''
等待某个XPATH出现,切换到新页面时填写,然后截图
'''
try:
find_element=WebDriverWait(driver,5).until(EC.presence_of_element_located((By.XPATH, xpath)))
return find_element
except Exception as e:
funcName = sys._getframe().f_code.co_name
# print(funcName,e)
return False
3.3输入框内容校验
# 解决数字sendkeys慢的问题,并校验重启,共五次,密码不在页面展示不需要校验
def Sendkeys_need_check(self,udid,driver_ele,content,count=5):
""“
:param driver_ele: 代码之前确定的element,例driver_phone=WebDriverWait(xxxxx),该变量
:param content: 输入框中输入的字符例111111
:return:
"""
self.SendKeysUseAdbInputEvent(udid,content)
if count <= 0:
print("校验失败请检测代码")
print("".join(driver_ele.text.split(" ")))
#这个校验是独属于本项目,主要检测输入内容和输入框内容中是否一致,不一样清除重新输入
if content != "".join(driver_ele.text.split(" ")):
driver_ele.clear()
self.Sendkeys_need_check(udid,driver_ele,content, count-1)
3.4输入框输入数字太快报错解决
# 输入数字并处理输入较慢的问题
def SendKeysUseAdbInputEvent(self,udid,content):
'''
将每个数字转换成键盘时间进行输入
*** 只支持数字,暂未支持字母
content是输入的文本
'''
try:
# if content.isdigit():
for i in content:
#adb输入文字,很大的局限就在只在当前机器上当前页面输入#不识别当前是某特定页
strCmd = 'adb -s %s shell input keyevent %s' % (udid, int(i) + 7)
subprocess.Popen(strCmd, shell=True, stdout=subprocess.PIPE,stderr=subprocess.PIPE).stdout.readlines()
except Exception as e:
print(str(e))
3.5密码框问题
#密码校验的时候是*****所以如果不符只能重启(密码狂一次性输入)
def SendKeysUseAdbPwdInput(self, udid, content):
try:
strCmd = 'adb -s %s shell input text %s' % (udid,content)
subprocess.Popen(strCmd, shell=True, stdout=subprocess.PIPE,stderr=subprocess.PIPE).stdout.readlines()
except Exception as e:
print("密码输入方式有误,校验代码")
print(e)
3.6密码输入一个个输入
# 向cmd输入命令,输入中文
def SendKeysUseAdbInputText(self,driver_ele,udid,content,count=5):
try:
for i in content:
strCmd = 'adb -s %s shell input text %s'%(udid,i)
subprocess.Popen(strCmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).stdout.readlines()
if count <= 0:
print("校验失败请检测代码")
if content != "".join(driver_ele.text.split(" ")):
driver_ele.clear()
self.SendKeysUseAdbInputText(udid, driver_ele, content, count - 1)
except Exception as e:
print(str(e))
3.7清除输入框内容
#登录框清理
def ele_login(self,ele):
ele.click()
ele.clear()
3.8打印页面源码,保存快照,调试的时候用
def page_source(self,driver):
print(driver.page_source)
driver.save_screenshot("1.png")
3.9当代码模拟点击不好用即使标签显示可点击采用adb传tap的命令(tap模拟人手指点击)
#当标签不可被点击时
def ele_unclickable(self,udid,content):
try:
strCmd = 'adb -s %s shell input tap %s' % (udid, content)
print(strCmd,content)
os.system(strCmd)
# subprocess.Popen(strCmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).stdout.readlines()
except Exception as e:
print(str(e))
3.10当标签click属性为False,选用tap点击,计算点击位置,我采用的计算横纵坐标中间值
#计算点击点,最好改成适配模式
def tap_int(self,element):
location = element.location
size = element.size
x=(location["x"]*2 + size["width"])/2
y=(location["y"]*2 + size["height"])/2
return int(x),int(y)
相关阅读
Android Freeline加速编译App方案 使用和总结
Freeline简介 在Android Studio还没推出Instant Run功能之前,每次修改Android 工程项目时都要将整个项目重新编译一次,然后再将资
App Store 里面一直存着在抄袭问题,这一点这些年来我们已经心知肚明。在创新与抄袭之间有着泾渭分明的界限,在我们进一步讨论抄袭问
小编按:小编只能说,都尼玛是人才啊…现在APP的火爆程度简直不亚于房地产,在移动互联网行业的影响下,大量的传统开发者进入APP的
手机银行就是一个7*24小时的银行网点,也是一位客户当地的客户经理,也能更明白客户的需求所在。手机银行有助于银行深入了解用户的具
多闪app如何使用?多闪app是一款十分专业的集短视频与聊天为一体的社交应用,软件支持上传精彩短视频,多样性的编辑工具助力打造炫酷