appnium适应之配置
一.session

#获取包名和acctivename
#这个工具在adk包里面
aapt.exe dump badging E:\Wandoujia_851097_web_seo_baidu_binded.apk
aapt.exe dump badging E:\Wandoujia_851097_web_seo_baidu_binded.apk |find “launchable-activity”


寻找包名和activityname的另外一职中方式
C:\Windows\System32>adb shell
root@SM-G9350:/ # logcat |grep cmp=


2.python脚本驱动
from appium import webdriver
cap={
"platformName": "Android",
"platformVersion": "5.1.1",
"deviceName": "127.0.0.1:21533",
"appPackage": "com.mei.wood",
"appActivity": ".ui.SplashActivity",
"noReset": True
}
driver=webdriver.Remote("http://127.0.0.1:4723/wd/hub",cap)
淘宝列子:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#author tom import time
from appium import webdriver
from appium.webdriver.common import mobileby
from appium.webdriver.webdriver import WebDriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC desired_capabilities = {
'platformName': 'Android', # 系统
'deviceName': '127.0.0.1:21533', # 移动设备号
'platformVersion': '5.1.1', # 系统版本
'appPackage': 'com.taobao.taobao', # 操作的app
'appActivity': 'com.taobao.tao.welcome.Welcome', # 打开淘宝app首页
'unicodeKeyboard': True,
'resetKeyboard': True,
'dontStopAppOnReset': True,
'autoGrantPermissions': True,
'noReset': True,
'automationName': 'uiautomator2',
'newCommandTimeout': '', # 超时时间
# 'systemPort': '8202', # 端口号,操作不用设备使用不同端口号
# 'udid': 'xxxxxxxx', # 移动设备号
'command_executor': 'http://127.0.0.1:4723/wd/hub' # 和启动命令保持一致
} class AppiumDemo(object):
def __init__(self):
self.driver = webdriver.Remote(command_executor=desired_capabilities['command_executor'],
desired_capabilities=desired_capabilities)
self.by = mobileby.MobileBy()
#点击同意使用流量
# if self.driver.find_element_by_id("com.taobao.taobao:id/uik_mdButtonDefaultPositive"):
# self.driver.find_element_by_id("com.taobao.taobao:id/uik_mdButtonDefaultPositive").click()
# 点击同意使用协议
if self.driver.find_element_by_id("com.taobao.taobao:id/yes"):
self.driver.find_element_by_id("com.taobao.taobao:id/yes").click()
# # 点击更新
# if self.driver.find_element_by_id("com.taobao.taobao:id/update_button_accept"):
# self.driver.find_element_by_xpath("com.taobao.taobao:id/update_button_accept").click()
# 点击搜索框
self.wait_find_element(by_type=self.by.ID, value='com.taobao.taobao:id/home_searchedit').click()
# 点击店铺搜索
self.wait_find_element(by_type=self.by.XPATH, value='//android.widget.TextView[@text="店铺"]').click() def wait_find_element(self, by_type: str, value: str, driver: WebDriver = None):
"""
获取单个元素, 显式等待
:param driver: 驱动对象
:param by_type: 查找元素的操作
:param value: 查找元素的方法
:return:
"""
driver = driver or self.driver
if not driver:
return driver
try:
WebDriverWait(driver, 10).until(EC.visibility_of_element_located(locator=(by_type, value)))
return driver.find_element(by_type, value)
except:
# self.logger.warning(traceback.format_exc())
return False def wait_find_elements(self, by_type: str, value: str, driver: WebDriver = None):
"""
获取多个元素, 显式等待
:param driver:
:param by_type:
:param value:
:return:
"""
driver = driver or self.driver
if not driver:
return driver
try:
WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located(locator=(by_type, value)))
return driver.find_elements(by_type, value)
except:
return False def get_size(self, driver: WebDriver = None):
"""
获取屏幕大小
:param driver:
:return:
"""
driver = driver or self.driver
if not driver:
return driver x = driver.get_window_size()['width']
y = driver.get_window_size()['height']
return [x, y] def swipe_up(self, driver: WebDriver = None, _time: int = 1000):
"""
向上滑动
:param driver:
:param _time:
:return:
"""
driver = driver or self.driver
if not driver:
return driver
try:
size = self.get_size(driver)
x1 = int(size[0] * 0.5) # 起始x坐标
y1 = int(size[1] * 0.80) # 起始y坐标
y2 = int(size[1] * 0.30) # 终点y坐标
driver.swipe(x1, y1, x1, y2, _time)
return True
except:
return False def execute(self, seed):
#清空搜索框,输入我们要爬取的数据
self.wait_find_element(by_type=self.by.ID, value='com.taobao.taobao:id/searchEdit').clear().send_keys(seed['keyword'])
#点击搜索按钮
self.wait_find_element(by_type=self.by.ID, value='com.taobao.taobao:id/searchbtn').click()
#获取店铺列表
shop_list = self.wait_find_elements(by_type=self.by.ID, value='com.taobao.taobao:id/shopTitle')
for shop_info in shop_list:
shop_info.click()
# 点击全部宝贝
self.wait_find_element(by_type=self.by.XPATH, value='//android.widget.FrameLayout'
'[@content-desc="全部宝贝"]').click() for i in range(3):
# 获取这一屏的数据
item_list = self.wait_find_elements(by_type=self.by.ID, value="com.taobao.taobao:id/title")
for item_info in item_list:
print(item_info.text)
self.swipe_up() # 向上滑动
time.sleep(0.5) # 一定要延时
self.driver.back() # 返回上一级
self.driver.back() def main():
seed = {
'keyword': 'Python 书'
}
spider = AppiumDemo()
while True:
spider.execute(seed=seed) if __name__ == '__main__':
main()
appnium适应之配置的更多相关文章
- Appnium移动自动化框架初探
作者:cryanimal QQ:164166060 本文简要介绍了appnium自动化框架的架构.加载流程.支持语言.相关配置,以及元素定位工具等. 官方网站: http://appium.io Ap ...
- 3.Appnium的安装
Appnium:移动端的自动测试话工具,类似selenium,可利用其驱动手机端去模拟点击.滑动.输入操作. 下载地址:https://github.com/appium/appium-desktop ...
- 【Appnium+C#+Winform自动化测试系列】一、获取本机连接的设备、启动多个Appnium和获取本机启动的Appnium
本系列内容,准备根据所完成的项目为基线,一步一步的把整个设计和实现过程梳理. 先从基本的一些环境问题入手,梳理清楚关于手机设备和Appnium.因为我们在后面的建立Appnium连接时,需要设备名字和 ...
- Mac下Appnium的Android的UI自动化环境搭建
1. 安装jdk:略 检查是否安装:执行命令java -version admindeMacBook-Pro-2:~ $ java -version java version "1.8.0_ ...
- (转)MitmProxy+APPnium安装使用
MitmProxy+APPnium安装使用 2019年08月19日 11:09:48 jiageibuuuyi 阅读数 61更多 分类专栏: python学习笔记 版权声明:本文为博主原创文章,遵 ...
- 配置android sdk 环境
1:下载adnroid sdk安装包 官方下载地址无法打开,没有vpn,使用下面这个地址下载,地址:http://www.android-studio.org/
- Android Studio配置 AndroidAnnotations——Hi_博客 Android App 开发笔记
以前用Eclicps 用习惯了现在 想学学 用Android Studio 两天的钻研终于 在我电脑上装了一个Android Studio 并完成了AndroidAnnotations 的配置. An ...
- react-router 组件式配置与对象式配置小区别
1. react-router 对象式配置 和 组件式配置 组件式配置(Redirect) ----对应---- 对象式配置(onEnter钩子) IndexRedirect -----对应-- ...
- 总结:Mac前端开发环境的搭建(配置)
新年新气象,在2016年的第一天,我入手了人生中第一台自己的电脑(大一时好友赠送的电脑在一次无意中烧坏了主板,此后便不断借用别人的或者网站的).macbook air,身上已无分文...接下来半年的房 ...
随机推荐
- curl操作和file_get_contents() 比较
1 . curl需要php开启php_curl开启扩展 $ch = curl_init(); $timeout = 5; curl_setopt ($ch, CURLOPT_URL, 'http:// ...
- htaccess 伪静态的规则
利用htaccess文件可以很好的进行站点伪静态,并且形成的目标地址与真正的静态页面几乎一模一样,如abc.html等,伪静态可以非常好的结合SEO来提高站点的排名,并且也能给人一种稳定的印象. 由于 ...
- [LC] 211. Add and Search Word - Data structure design
Design a data structure that supports the following two operations: void addWord(word) bool search(w ...
- 华为OD两轮技术面试
华为OD面试1性格测试选积极向上的选项,注意,性格测试也会挂人,我一个朋友性格测试就没过.2机试 一道变成题目 1h 用例60%通过即可任给一个数组,元素有20M,1T,300G之类的,其中1T=10 ...
- css - inline-block 盒子下的内容文字错位问题
参考资料: “display:block-inline形式的Span或Div中添加文字后,导致Span或Div排版掉落.错位”的原因及解决方法: 正文: 场景:两个 div 排在一行上,各有固定宽高, ...
- JVM常见问题分析
JVM常见问题分析 启动,并且去查看日志 ./startup.sh && tail -f ../logs/catalina.out 常见有有以下几个问题: 1.java.lang.Ou ...
- MyBatis 逆向工程介绍
1. 概念: 逆向工程就是根据数据库中对应的表在项目工程中生成相应的MyBatis代码(XXXMapper.java/XXXMapper.xml/Moudle(XXX)),逆向工程生成的代码可以进行简 ...
- basecalling|vector mark|Assembly的难题|
生物信息学 染色体可以据染色图谱判断染色体号码,1-22号染色体依次变短,它们影响机体发育,23号染色体决定性别.肿瘤是由于遗传密码变异造成的.因此,遗传密码的解读非常重要,但是因为遗传密码长度非常长 ...
- Java实现Luhm算法--银行卡号合法性校验
银行卡是由"发卡行标识代码 + 自定义 + 校验码 "等部分组成的. 银联标准卡与以往发行的银行卡最直接的区别就是其卡号前6位数字的不同. 银行卡卡号的前6位是用来表示发卡银行 ...
- js 实现排序算法 -- 选择排序(Selection Sort)
原文: 十大经典排序算法(动图演示) 选择排序(Selection Sort) 选择排序(Selection-sort)是一种简单直观的排序算法.它的工作原理:首先在未排序序列中找到最小(大)元素,存 ...