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()
第一个例子,理论当获取到最后一个的元素的时候停止滑动
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)
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
执行写好的程序,会发现已经成功