Appium+robotframework xpath元素定位、难点解决

1.打开app,Open application http://localhost:4723/wd/hub  platformName=android  platformVersion=4.3  

deviceName=127.0.0.1:62001  appPackage=.debug  appActivity=.MainActivity。

我这里使用的是模拟器,使用模拟器需要手动添加设备,即adb connect 127.0.0.1:62001,devicename为设备名,我这些写的是127.0.0.1:62001.。如果使用真机,需要通过查询才能知道,adb devices。使用真机,有时候会遇到电脑识别不到手机,而开发者选项都打开了,这时候需要在pc和手机上下载360手机助手之类的软件,通过软件的识别会在手机上弹出一个是否调试选项,选择调试后,adb devices就能获取到设备名了。我只试过360的,其他类型软件应该也可以。

package和activity为app的包名和路径。简单的获取方法为,下载客户端版appium,在pc上下载apk,再在appium上选择包apk,选择之后,appium跟activity就出来了。




2.AppiumLibrary跟selenium2library同时使用时,需要在关键字前加库名.,如AppiumLibrary.click element,因为这两个库的keyword有很多是一样的,没有添加库名时会提示错误。


3.当有可能出现数量不确定的赎回时,需要通过追加进行定位来点击赎回按钮。


xpath=//android.widget.TextView[@text="追加"]/../preceding-sibling::android.view.View/android.widget.TextView[@text="赎回"];如果要定位在后面的,则需要把preceding-sibling改为following-sibling。

如果是同级的话需要在following-sibling前加“/”,如xpath=//android.widget.TextView[@text='${code}']/following-sibling::android.widget.TextView[4]


4.对于text会随数据变化而变化的可以用模糊定位,


xpath=//android.widget.EditText[contains(@text,"可赎回份额:")],跟selenium2library不同,text前要加@。


5.有时候会出现一些没有name或id的View,用第三的方法也无法进行定位,那么就可以使用click a point ,但是屏幕不同点的坐标也会不同,所以非没办法的情况下尽量不要使用。Click A Point420700,420为x坐标,700为y坐标。


6.获取text的值跟替换金额中的千位符号,但替换后的数据类型为str,数据库获取的数据位float,直接should be equal会报错,需要使用should be equal as string。

另外,在robotframework里写sql,需要把分号去掉,不然会提示sql没有适当结束的错误。


还有一种替换方法为使用robotframework自带的string库,


我这里的robotframework版本是1.5.2.1的,如果是2.8.2以上的可以使用remove string。



对于数据来讲,获取到的text为str,而数据库的数据是float,所以会出现29006.6 != 29006.60的情况,所以还是得把str转换成float,即

${c} Evaluatefloat(${b})


7.判断购买金额是否比最低限买金额高

在这里,我没有找到直接比较的关键字,而是通过相减,来判断结果应该为正数还是负数。


${minbuys}是从数据库查询到的最低限买金额,但是是一个列表,需要进行赋值。buyamount是购买金额,当buyamount跟minbuy相等时,是允许购买的,相减会等于0,所以需要再后面加1。

此外,在使用run keyword if 时,需要注意判断追加购买金额的位置只能写关键字,所以无法直接实现的功能可以封装起来再调用。而ELSE则必须要大写,否则会变成上一句的参数而报输入过多参数的错误。



8.输入框

浮点型变量输入输入框时,会报错,这时候需要把他转换成字符串,代码如下:



9.在rf里写keyword,判断是否满足条件,满足的话直接返回不执行后面的代码,使用return from keyword if,后面两个0,是返回参数的值。


10.退出For循环,用Exit For Loop


持续更新。。。。