代码改变世界

appium使用相对坐标定位元素

  zouhui  阅读(2955)  评论(0编辑  收藏  举报

最近在用appium做自动化时发现,有一些元素无法通过uiautomatorviewer进行定位,这样就只能通过相对坐标来进行定位了。但是,问题又来了:如何获取元素的坐标呢?

在网上找了半天也没找到相应的解决方法,后来在一篇文章中看到打开手机指针位置来确定元素所在坐标。具体方法:设置--开发者选项--指针位置

开启指针位置之后,点击手机屏幕就会显示该位置的具体坐标,这样就获取到了元素的绝对坐标 然后通过webdriver的tap()函数点击该坐标就可以了。

 

我们获取到的是绝对坐标,如果换一个屏幕分辨率不同的手机那这个坐标自然会发生变化,要实现不同手机均能实现点击同一控件自然要用到相对坐标了,具体方法如下:

1.获取当前空间的绝对坐标(x1,y1),开启指针位置后,通过点击控件位置获取坐标;

2.获取当前手机的屏幕大小(x2,y2),通过driver.get_window_size()['width'],dirver.get_window_size()['height']分辨获取当前手机的x、y坐标;

3.获取测试手机的屏幕大小(x3,y3),获取方式同上一步;

4.获取指定控件在测试手机中的坐标:((x1/x2)*x3,(y1/y2)*y3)

5.获取到坐标之后同样使用tap()函数点击该控件。

 

具体代码如下:

640?wx_fmt=gif

# -*-encoding:utf-8 -*-

import os
import unittest
import HTMLTestRunner
from test_platform import URL
from test_platform import platform
from appium import webdriver
from time import sleep

# 设定系数
a = 554.0/1080
b
= 1625.0/1794


class Login(unittest.TestCase):
def setUp(self):
platform[
'appPackage'] = 'com.xxxxxxxxx'
platform[
'appActivity'] = '.ui.activity.LoginActivity'
#platform['appWaitActivity'] = '.MainActivity_'

desired_caps
= platform
self.driver
= webdriver.Remote(URL,desired_caps)

self.driver.implicitly_wait(
30)


def tearDown(self):
self.driver.quit()

def test_login(self):
el
= self.driver.find_element_by_xpath("\
//android.widget.TextView[contains(@resource-id,'com.xxxxx/etRole')]
")
if el:
el.click()
# 以xml格式打印当前页面内容
# print self.driver.page_source.encode("utf-8")
# self.driver.find_element_by_name("家长").click()


# 获取当前手机屏幕大小X,Y
X = self.driver.get_window_size()['width']
Y
= self.driver.get_window_size()['height']
# 屏幕坐标乘以系数即为用户要点击位置的具体坐标,当前app内为选择用户角色为“家长”
self.driver.tap([(a*X, b*Y)],)
# 输入手机号码
self.driver.find_element_by_xpath("\
//android.widget.EditText[contains(@resource-id,'com.xxxxx:id/etAccount')]
")\
.send_keys(
"***********")

# 输入密码
self.driver.find_element_by_xpath("\
//android.widget.EditText[contains(@resource-id,'com.xxxxxx.qh:id/etPasswd')]
") \
.send_keys(
"123456")


# 点击登录按钮
self.driver.find_element_by_xpath("\
//android.widget.Button[contains(@resource-id,'com.xxxxxx:id/btnLogin')]
").click()

sleep(
5)

# 当前账号存在多个孩子,选择孩子后登录app
self.driver.find_element_by_xpath("\
//android.widget.TextView[contains(@text,'徐熙媛')]
").click()



if __name__ == '__main__':
unittest.main()


本文转自:https://blog.csdn.net/qq_37695583/article/details/79320116

努力加载评论中...
点击右上角即可分享
微信分享提示