必威体育Betway必威体育官网
当前位置:首页 > IT技术

app爬虫appium获取借贷宝,无忧等等(配置文件)

时间:2019-08-19 08:40:55来源:IT技术作者:seo实验室小编阅读:87次「手机版」
 

借贷宝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 被抄袭犯盯上了该怎么办?

App Store 里面一直存着在抄袭问题,这一点这些年来我们已经心知肚明。在创新与抄袭之间有着泾渭分明的界限,在我们进一步讨论抄袭问

移动互联网APP推广的8大邪恶方法

小编按:小编只能说,都尼玛是人才啊&#8230;现在APP的火爆程度简直不亚于房地产,在移动互联网行业的影响下,大量的传统开发者进入APP的

交通银行APP产品首页分析

手机银行就是一个7*24小时的银行网点,也是一位客户当地的客户经理,也能更明白客户的需求所在。手机银行有助于银行深入了解用户的具

多闪app如何使用?

多闪app如何使用?多闪app是一款十分专业的集短视频与聊天为一体的社交应用,软件支持上传精彩短视频,多样性的编辑工具助力打造炫酷

分享到:

栏目导航

推荐阅读

热门阅读