appium自己的文档(持续更新)

Python版

Python + appium的链接手的一个例子

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File    :   kuaishoumoniqi.py    
@Contact :   
@License :   

@Modify Time      @Author    @Version    @Desciption
------------      -------    --------    -----------
2019/3/25 18:01   xuemei      1.0         None
'''

# import lib

from appium import webdriver
from time import sleep
from collect import response
import os
from selenium.webdriver.common.by import By

from start import appiumStart
from utils.redisUtil import redis_Util


class Action():
    # , click_x, click_y, click_time, id
    def __init__(self, platformVersion, deviceName, appPackage, appActivity, keyWords):
        self.appPackage = appPackage
        self.appActivity = appActivity
        self.platformVersion = platformVersion
        self.deviceName = deviceName
        self.keyWords = keyWords
		# 连接某手app的参数,当分端口链接多个模拟器的时候加上udid
        self.desired_caps = {
            "platformName": "Android",
            # "deviceName": "Mi_Note_3",
            "appPackage": self.appPackage,  # com.ss.android.ugc.aweme
            "appActivity": self.appActivity,  # com.ss.android.ugc.aweme.splash.SplashActivity
            "platformVersion": self.platformVersion,
            "deviceName": self.deviceName,
            "udid": self.deviceName,
            "unicodeKeyboard": True,
            "resetKeyboard": True,
            "noSign": True
        }

        # 指定Appium Server
        self.server = 'http://localhost:4725/wd/hub'
        # 新建一个Session
        self.driver = webdriver.Remote(self.server, self.desired_caps)
        # 设置滑动初始坐标和滑动距离
        self.start_x = 300
        self.start_y = 1052
        self.distance = 700

    def comments(self, click_x, click_y, click_time):
        """
        根据坐标模拟点击
        :param click_x: x坐标
        :param click_y: y坐标
        :param click_time: 点击的时间
        :return:
        """
        sleep(2)
        # app开启之后点击一次屏幕,确保页面的展示
        # [(500, 1200)], 500)
        self.driver.tap([(click_x, click_y)], click_time)

    def comments_by(self, type, data):
        """
        根据元素的type模拟点击
        :param id: 元素的id
        :return:
        """
        sleep(2)
        # self.driver.tap([493, 1056],500)
        # com.ss.android.ugc.aweme:id/rm  同意id
        self.driver.find_element(type, data).click()
        # self.driver.find_element_by_id(id).click()

    def scroll(self):
        """
        无限向下滑动第一种方式
        
        :return:
        """
        while True:

            try:

                self.driver.swipe(self.start_x, self.start_y, self.start_x,
                                  self.start_y - 900)
                sleep(3)
                print(self.driver.find_element_by_xpath(
                    "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.support.v4.view.ViewPager/android.view.View/android.support.v7.widget.RecyclerView/android.widget.LinearLayout[@index=11]"))

                break
            except Exception as e:

                try:
                    self.driver.find_element_by_id('com.smile.gifmaker:id/description')
                    print('没有搜到数据')
                    break
                except:
                    print('有数据')
                # 模拟滑动
                self.driver.swipe(self.start_x, self.start_y, self.start_x,
                                  self.start_y - self.distance)
                # 设置延时等待
                sleep(8)

    def lastElement(self):
        while True:
            beforeswipe = self.driver.page_source
            self.driver.swipe(self.start_x, self.start_y, self.start_x,
                              self.start_y - self.distance)
            afterSwipe = self.driver.page_source
            if beforeswipe == afterSwipe:
                print("没有更多数据了")
                break
            sleep(8)



    def login(self):
        """
        模拟用户登陆
        :return:
        """
        self.comments_by(By.ID, "com.smile.gifmaker:id/left_text_two")
        sleep(2)
        self.comments_by(By.XPATH,
                         '/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.RelativeLayout[1]')
        sleep(2)
        self.comments(361, 770, 500)  # 选择哪个微信
        sleep(10)
        # # self.comments_by_id(By.ID,"com.tencent.mm:id/cov")   #确认登陆
        # self.comments_by(By.ID,"com.ss.android.ugc.aweme:id/cjx")

    def search(self, keyWord):
        """
        模拟用户搜索
        :return:
        """
        # self.comments(664, 95, 500)


        try:
            el1 = self.driver.find_element_by_xpath(
                "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.RelativeLayout/android.widget.RelativeLayout/android.widget.EditText")
        except:
            el1 = self.driver.find_element_by_id("com.smile.gifmaker:id/editor")
        # el1 = self.driver.find_element_by_id("com.ss.android.ugc.aweme:id/adr")  #搜索框  id
        el1.send_keys(keyWord)
        # self.comments_by(By.ID, "com.smile.gifmaker:id/search_icon")
        try:
            self.comments_by(By.ID, 'com.smile.gifmaker:id/item_root')
        except:
            self.comments_by(By.XPATH,
                         "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.View/android.support.v7.widget.RecyclerView/android.widget.LinearLayout")

        sleep(3)
        # self.comments(244, 179, 500)   # 视频
        # self.comments(403, 176, 500)  # 用户

        self.comments_by(By.XPATH,
                         "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.HorizontalScrollView/android.widget.LinearLayout/android.widget.TextView[2]")
        # 返回到搜索页
        # self.scroll()
        self.lastElement()
        sleep(5)
        self.driver.keyevent(4)    #返回键


    def main(self):
        sleep(10)
        # self.login()
        #进入搜索页
        self.comments_by(By.ID, 'com.smile.gifmaker:id/left_btn')
        self.comments_by(By.ID, 'com.smile.gifmaker:id/tab_search')
        sleep(2)
        for i in self.keyWords:
            # x = bytes.decode(i)
            print(i)
            if not r.hexists('kscikuqc', i):
                self.search(i)
                sleep(9)
                r.hset('kscikuqc', i, '')
        # self.comments(244, 179, 500)
        sleep(3)
        # self.scroll()
        self.driver.quit()


if __name__ == '__main__':
    ru = redis_Util()
    # r2 = ru.redis_py('47.93.114.131', '6111', 'bayside801')
    r = ru.redis_py('127.0.0.1', '6379', '')
    # keyswords = r.hgetall("constword")
    # for i in keyswords:
    #     r.hset('constword', i, '')
    f3 = open("./../lib/三字1.txt", "r", encoding="utf-8")
    keyswords = f3.readlines()
    action = Action("5.1.1", "127.0.0.1:62001", "com.smile.gifmaker",
                        "com.yxcorp.gifshow.HomeActivity", keyswords)  # 模拟器
    action.main()

Python判断模拟滑动是否到底部

第一个例子,理论当获取到最后一个的元素的时候停止滑动

 def scroll(self):
        """
        无限向下滑动第一种方式
        :return:
        """
        while True:
            try:
            #判断找到元素了没
                self.driver.swipe(self.start_x, self.start_y, self.start_x,
                                  self.start_y - 900)
                sleep(3)
                print(self.driver.find_element_by_xpath("/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.support.v4.view.ViewPager/android.view.View/android.support.v7.widget.RecyclerView/android.widget.LinearLayout[@index=11]"))
                break
            except Exception as e:
                try:
                	#判断是否没有搜索出数据来
                    self.driver.find_element_by_id('com.smile.gifmaker:id/description')
                    print('没有搜到数据')
                    break
                except:
                    print('有数据')
                # 模拟滑动
                self.driver.swipe(self.start_x, self.start_y, self.start_x,
                                  self.start_y - self.distance)
                # 设置延时等待
                sleep(8)

第二种滑动的方式:此种方式比较推荐通过page_dource来判断

    def lastElement(self):
        while True:
            beforeswipe = self.driver.page_source
            self.driver.swipe(self.start_x, self.start_y, self.start_x,
                              self.start_y - self.distance)
            afterSwipe = self.driver.page_source
            if beforeswipe == afterSwipe:
                print("没有更多数据了")
                break
            sleep(8)
appium双开设置

1.需要在配置数据的时候加上udid 内容以deviceName相同
2.启动appium的时候不同设备对应不同的端口和bp

appium -p 4723 -U 127.0.0.1:62001 -bp 4724
appium -p 4725 -U 127.0.0.1:62025 -bp 4726

3.不需要在夜神模拟器的目录下connect
在外面 adb connect 设备的udid
显示成功连接后 执行 adb devices,会显示你链接号的设备的udid
执行写好的程序,会发现已经成功

你可能感兴趣的:(python,appium)