版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】Appium的代码实例及日志分析
本文内容:Android及IOS基于TestNG的代码结构示例,常用的元素定位方式的介绍部分项目中使用的功能代码示例Appium日志的具体分析部分需要理解的概念Android示例代码(TestNG):public
class
AndroidTest
{
protected
AndroidDriver<MobileElement>
driver;
URL
url
=
new
URL(":4723/wd/hub");
@BeforeSuite
public
void
setUp()
throws
Exception
{
DesiredCapabilities
capabilities
=
new
DesiredCapabilities();
capabilities.setCapability(MobileCapabilityType.DEVICE_NAME,
"AndroidPhone");
capabilities.setCapability(AndroidMobileCapabilityType.APP_PACKAGE,
"com.example.dev");
capabilities.setCapability(AndroidMobileCapabilityType.APP_ACTIVITY,
".MainActivity");
capabilities.setCapability(MobileCapabilityType.NO_RESET,
true);
driver
=
new
AndroidDriver<>(url,
capabilities);
}
@AfterSuite
public
void
tearDown()
throws
Exception
{
if
(driver
!=
null)
{
driver.quit();
}
}
@Test
public
void
test_001(){}//Test
Case
One
@Test
public
void
test_002(){}//Test
Case
Two
}IOS示例代码(TestNG):public
abstract
class
IOSTest
{
protected
IOSDriver<MobileElement>
driver;
URL
url
=
new
URL(":4723/wd/hub");
@BeforeSuite
public
void
setUp()
throws
Exception
{
DesiredCapabilities
capabilities
=
new
DesiredCapabilities();
capabilities.setCapability(MobileCapabilityType.PLATFORM_NAME,
"iOS");
capabilities.setCapability(MobileCapabilityType.PLATFORM_VERSION,
"10.3");
capabilities.setCapability(MobileCapabilityType.DEVICE_NAME,
"My
iPhone
6");
capabilities.setCapability(MobileCapabilityType.UDID,
"c4ef2cbc8a1b39123838a8ad9fdea45547e44c20");
capabilities.setCapability(IOSMobileCapabilityType.BUNDLE_ID,
"com.example.dev");
driver
=
new
IOSDriver<>(url,
capabilities);
}
}常用的元素定位方式:Android:IOS:AccessibilityIdappium移除了在Selenium上常用的name和tagname定位方式IOS上表示AccessibilityIdentifier,通常和Name、Label属性相同Android上表示contentdescription交互操作MobileElement:交互的对象,对应于Android中的一个View对象点击:element.click();输入:element.sendKeys("text");滑动:driver.swipe()点击:driver.tap();等待方式://隐式等待//全局设定查找元素时的等待时间,找不到会尝试10秒内间隔查找,找到了继续//这里设定的值对driver的整个生命周期起作用,从现在开始到下次修改,每次查找都是10秒。driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS);//显式等待//仅仅这次,指明最多等待5秒,指明结束条件为找到元素id=bt_next。超时抛出TimeoutException。WebElemente=newWebDriverWait(driver,5).until(ExpectedConditions.presenceOfElementLocated(By.id("bt_next")));//强行等待//线程直接暂停,适合于单纯的等待。不查找元素Thread.sleep(3000)DesiredCapabilities这是一个key-value的集合,用于告诉服务器建立连接的设备信息,不同平台有所不同。appium支持许多的属性设置,可以到官网做个全面的了解。MobileCapabilityType:不同平台共用AndroidMobileCapabilityType:Android专用IOSMobileCapabilityType:IOS专用Android一般至少需要:1、platformName2、platformVersion3、deviceName4、appPackage5、appActivityIOS一般至少需要:1、platformName2、platformVersion3、deviceName4、udid5、bundleId部分代码示例//对于弹出的权限对话框,如果找到Allow按钮则一直点击Allow。
protected
void
grantPermissionIfPrompt()
{
int
count
=
0;//at
most
five
times
grant
MobileElement
allowBtn
=
findElement(By.id(ConstConfig.ALLOW_BUTTON));
while
(allowBtn
!=
null
&&
count++
<
5)
{//at
most
5
time
to
try
allowBtn.click();
allowBtn
=
findElement(By.id(ConstConfig.ALLOW_BUTTON));
}
}//向上滑动列表,直到找到目标元素
static
public
MobileElement
scrollDownUnitFound(AndroidDriver<MobileElement>
driver,
String
content)
throws
Exception
{
int
width
=
driver.manage().window().getSize().getWidth();
int
height
=
driver.manage().window().getSize().getHeight();
int
count
=
0;
String
xpathStr
=
createXpathDesc(content);
do
{
if
(driver.findElementsByXPath(xpathStr).size()
>
0)
{
//in
case
of
the
element
is
still
hiding,
or
the
element
is
showing
only
a
little
part
of
it.
driver.swipe(width
/
2,
height
/
2,
width
/
2,
height
/
3,
600);
Thread.sleep(1000);//sleep
1
second
to
avoid
getting
the
element
in
the
wrong
position.
return
driver.findElementsByXPath(xpathStr).get(0);
}
driver.swipe(width
/
2,
height
/
2,
width
/
2,
height
/
4,
600);
count++;
}
while
(count
<
20);
return
null;
}//生成xpath字符串
static
public
String
createXpathDesc(String
content)
{
return
".//*[@text='"
+
content
+
"']";
}//滑动找到元素,并点击其左侧的CheckBox。CheckBox没有id,也不适合用classname,因为不知道是第几个,只能借助相邻元素坐标偏移。
MobileElement
el
=
AndroidHelper.scrollDownUnitFound(driver,
voteTarget);
if
(el
!=
null)
{//find
the
checkbox
to
the
left
of
the
founded
target.
int
targetX
=
el.getLocation().getX()
-
20;
int
targetY
=
el.getLocation().getY()
+
1;//event
+0
is
working
System.out.println("coordinates:x
=
"
+
targetX
+
"
y
=
"
+
targetY);
driver.tap(1,
targetX,
targetY,
300);
}日志分析(AppiumonAWSDeviceFarm):Appium是Client/Server结构的,所以每一次操作都是以Client向Server发送http请求开始,以Server向Client发送http响应结束。查阅日志可以按这个规律过滤不必要的信息。Android日志分析:driver.findElement(By.id("compose_button")).click();(Adnroid)findElement操作日志:2017-09-19
04:06:27:278
-
[HTTP]
-->
POST
/wd/hub/session/acfa31ae-321f-4ee1-a34b-294667393f8f/element
{"using":"id","value":"compose_button"}
2017-09-19
04:06:27:278
-
[debug]
[MJSONWP]
Calling
AppiumDriver.findElement()
with
args:
["id","compose_button","acfa31ae-321f-4ee1-a34b-294667393f8f"]
2017-09-19
04:06:27:279
-
[debug]
[BaseDriver]
Valid
locator
strategies
for
this
request:
xpath,
id,
class
name,
accessibility
id,
-android
uiautomator
2017-09-19
04:06:27:279
-
[debug]
[BaseDriver]
Valid
locator
strategies
for
this
request:
xpath,
id,
class
name,
accessibility
id,
-android
uiautomator
2017-09-19
04:06:27:279
-
[debug]
[BaseDriver]
Waiting
up
to
3000
ms
for
condition
2017-09-19
04:06:27:280
-
[debug]
[AndroidBootstrap]
Sending
command
to
android:
{"cmd":"action","action":"find","params":{"strategy":"id","selector":"compose_button","context":"","multiple":false}}
2017-09-19
04:06:27:310
-
[AndroidBootstrap]
[BOOTSTRAP
LOG]
[debug]
Got
data
from
client:
{"cmd":"action","action":"find","params":{"strategy":"id","selector":"compose_button","context":"","multiple":false}}
2017-09-19
04:06:27:310
-
[AndroidBootstrap]
[BOOTSTRAP
LOG]
[debug]
Got
command
of
type
ACTION
2017-09-19
04:06:27:310
-
[AndroidBootstrap]
[BOOTSTRAP
LOG]
[debug]
Got
command
action:
find
2017-09-19
04:06:27:311
-
[AndroidBootstrap]
[BOOTSTRAP
LOG]
[debug]
Finding
'compose_button'
using
'ID'
with
the
contextId:
''
multiple:
false
2017-09-19
04:06:27:311
-
[AndroidBootstrap]
[BOOTSTRAP
LOG]
[debug]
Using:
UiSelector[INSTANCE=0,
RESOURCE_ID=com.example.hello:id/compose_button]
2017-09-19
04:06:27:329
-
[AndroidBootstrap]
[BOOTSTRAP
LOG]
[debug]
Returning
result:
{"status":0,"value":{"ELEMENT":"9"}}
2017-09-19
04:06:27:330
-
[debug]
[AndroidBootstrap]
Received
command
result
from
bootstrap
2017-09-19
04:06:27:330
-
[debug]
[MJSONWP]
Responding
to
client
with
driver.findElement()
result:
{"ELEMENT":"9"}
2017-09-19
04:06:27:344
-
[HTTP]
<--
POST
/wd/hub/session/acfa31ae-321f-4ee1-a34b-294667393f8f/element
200
53
ms
-
87(Android)click操作日志:2017-09-19
04:06:27:348
-
[HTTP]
-->
POST
/wd/hub/session/acfa31ae-321f-4ee1-a34b-294667393f8f/element/9/click
{"id":"9"}
2017-09-19
04:06:27:348
-
[debug]
[MJSONWP]
Calling
AppiumDriver.click()
with
args:
["9","acfa31ae-321f-4ee1-a34b-294667393f8f"]
2017-09-19
04:06:27:359
-
[debug]
[AndroidBootstrap]
Sending
command
to
android:
{"cmd":"action","action":"element:click","params":{"elementId":"9"}}
2017-09-19
04:06:27:375
-
[AndroidBootstrap]
[BOOTSTRAP
LOG]
[debug]
Got
data
from
client:
{"cmd":"action","action":"element:click","params":{"elementId":"9"}}
2017-09-19
04:06:27:391
-
[AndroidBootstrap]
[BOOTSTRAP
LOG]
[debug]
Got
command
of
type
ACTION
2017-09-19
04:06:27:391
-
[AndroidBootstrap]
[BOOTSTRAP
LOG]
[debug]
Got
command
action:
click
2017-09-19
04:06:27:876
-
[debug]
[AndroidBootstrap]
Received
command
result
from
bootstrap
2017-09-19
04:06:27:876
-
[debug]
[MJSONWP]
Responding
to
client
with
driver.click()
result:
true
2017-09-19
04:06:27:880
-
[HTTP]
<--
POST
/wd/hub/session/acfa31ae-321f-4ee1-a34b-294667393f8f/element/9/click
200
529
ms
-
76IOS日志分析:driver.findByAccessibilityId("Compose").click();(IOS)findElement操作日志:2017-09-19
07:19:36:259
-
[HTTP]
-->
POST
/wd/hub/session/bbb16560-a4c7-43fc-a5d0-dea9057dff93/element
{"using":"accessibility
id","value":"Compose"}
2017-09-19
07:19:36:259
-
[debug]
[MJSONWP]
Calling
AppiumDriver.findElement()
with
args:
["accessibility
id","Compose","bbb16560-a4c7-43fc-a5d0-dea9057dff93"]
2017-09-19
07:19:36:260
-
[debug]
[XCUITest]
Executing
command
'findElement'
2017-09-19
07:19:36:260
-
[debug]
[BaseDriver]
Valid
locator
strategies
for
this
request:
xpath,
id,
name,
class
name,
-ios
predicate
string,
-ios
class
chain,
accessibility
id
2017-09-19
07:19:36:260
-
[debug]
[BaseDriver]
Waiting
up
to
3000
ms
for
condition
2017-09-19
07:19:36:261
-
[debug]
[JSONWP
Proxy]
Proxying
[POST
/element]
to
[POST
:8100/session/3FAA9ECD-8EE9-49BC-B1F9-010B03B9821B/element]
with
body:
{"using":"accessibility
id","value":"Compose"}
2017-09-19
07:19:37:826
-
[debug]
[JSONWP
Proxy]
Got
response
with
status
200:
{"value":{"ELEMENT":"E56F3927-08E6-4ECD-B3E4-05F30198FA6A","type":"XCUIElementTypeButton","label":"Compose"},"sessionId":"3FAA9ECD-8EE9-49BC-B1F9-010B03B9821B","status":0}
2017-09-19
07:19:37:829
-
[debug]
[MJSONWP]
Responding
to
client
with
driver.findElement()
result:
{"ELEMENT":"E56F3927-08E6-4ECD-B3E4-05F30198FA6A","type":"XCUIElementTypeButton","label":"Compose"}
2017-09-19
07:19:37:843
-
[HTTP]
<--
POST
/wd/hub/session/bbb16560-a4c7-43fc-a5d0-dea9057dff93/element
200
1570
ms
-
171(IOS)click操作日志:2017-09-19
07:19:37:869
-
[HTTP]
-->
POST
/wd/hub/session/bbb16560-a4c7-43fc-a5d0-dea9057dff93/element/E56F3927-08E6-4ECD-B3E4-0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年光建一体化科技公司质量控制点管理制度
- 2026春贵州贵阳市观山湖区第七中学招临聘教师6人备考题库带答案详解(培优a卷)
- 2026春贵州贵阳市观山湖区第七中学招临聘教师6人备考题库附答案详解(巩固)
- (2025年)汽车驾驶员(技师)模拟考试题及答案
- (2025年)会计从业资格《会计电算化》模拟试题及答案(全文)
- 2026江苏南京大学化学学院助理招聘备考题库附参考答案详解(能力提升)
- 2025-2030中国海绵城市建设运营风险与投融资模式分析研究报告
- 2026江苏南京大学化学学院助理招聘备考题库附答案详解(考试直接用)
- 2026江苏南京大学化学学院博士后招聘备考题库及一套完整答案详解
- 2026江苏南京大学化学学院科研人员招聘备考题库及答案详解一套
- 2026年甘肃省公信科技有限公司面向社会招聘80人(第一批)笔试模拟试题及答案解析
- 文献检索与论文写作 课件 12.1人工智能在文献检索中应用
- 艾滋病母婴传播培训课件
- 公司职务犯罪培训课件
- 运营团队陪跑服务方案
- 北京中央广播电视总台2025年招聘124人笔试历年参考题库附带答案详解
- 2023年内蒙专技继续教育学习计划考试答案(整合版)
- 《通信工程制图》课程标准
- 石油天然气建设工程交工技术文件编制规范(SYT68822023年)交工技术文件表格仪表自动化安装工程
- 马鞍山市恒达轻质墙体材料有限公司智能化生产线环保设施改造项目环境影响报告表
- GB/T 26332.6-2022光学和光子学光学薄膜第6部分:反射膜基本要求
评论
0/150
提交评论