Facebook-wda方法介绍---总结归纳一些疑惑点

news/2024/7/20 21:12:29 标签: python, ios, APP自动化, window

Facebook-wdawait()displayedexists 的区别

wait() 方法是 wda.Waiter 类的一个方法,用于等待指定元素在一定时间内出现并返回该元素。如果元素未在超时时间内出现,则将引发 wda.ElementNotFoundError 异常。因此,wait() 方法适用于需要确保元素出现后才能进行下一步操作的场景。

displyed 属性是 wda.Element 类的一个方法,用于检查元素是否可见。如果元素可见,则返回 True;否则,返回 False。因此,displayed 属性适用于需要判断元素是否可见的场景。

exists 属性也是 wda.Element 类的一个方法,用于检查元素是否存在。如果元素存在,则返回 True;否则,返回 False。因此,exists 属性适用于需要判断元素是否存在的场景。

python">import wda

c = wda.Client()
s = c.session()

# 使用 wait() 方法等待元素出现并获取它
elem = s(id='button_id').wait(timeout=10)

if elem:
    # 使用 displayed 属性判断元素是否可见
    if elem.displayed:
        elem.click()

    # 使用 exists 属性判断元素是否存在
    if not elem.exists:
        print('元素不存在')

在Facebook-wda中tap()、click()、press()的区别

tap() 方法是 wda.Element 类的一个方法,用于在元素指定位置模拟点击操作。可以指定相对于元素左上角的 x 和 y 坐标位置,也可以不指定。如果不指定,则默认点击元素中心位置。因此,tap() 方法适用于需要在元素指定位置进行点击操作的场景。

click() 方法也是 wda.Element 类的一个方法,用于模拟点击操作。与 tap() 方法不同的是,click() 方法只需指定等待时间,无需指定坐标位置。因此,click() 方法适用于需要在整个元素上进行点击操作的场景。

press() 方法也是 wda.Element 类的一个方法,用于模拟按住操作。可以指定按住的时间,以毫秒为单位。因此,press() 方法适用于需要在元素上按住一段时间后再执行操作的场景,比如长按图片弹出菜单。

python">import wda

c = wda.Client()
s = c.session()

# 使用 tap() 方法在元素指定位置模拟点击操作
elem = s(id='button_id')
elem.tap(200, 200)

# 使用 click() 方法在整个元素上模拟点击操作
elem = s(id='button_id')
elem.click()

# 使用 press() 方法在元素上按住一段时间后再执行操作
elem = s(id='image_id')
elem.press(duration=5000)

告警弹窗:

python">print(s.alert.exists)
print(s.alert.text)
s.alert.accept() # Actually do click first alert button
s.alert.dismiss() # Actually do click second alert button
s.alert.wait(5) # if alert apper in 5 second it will return True,else return False (default 20.0)
s.alert.wait() # wait alert apper in 2 second

s.alert.buttons()
# example return: ["设置", "好"]

s.alert.click("设置")
s.alert.click(["设置", "信任", "安装"]) # when Arg type is list, click the first match, raise ValueError if no match

告警弹窗监控:

python">with c.alert.watch_and_click(['好', '确定']):
	s(label="Settings").click() # 
	# ... other operations

# default watch buttons are
# ["使用App时允许", "好", "稍后", "稍后提醒", "确定", "允许", "以后"]
with c.alert.watch_and_click(interval=2.0): # default check every 2.0s
	# ... operations

Session方法:

python"># set default element search timeout 30 seconds
s.implicitly_wait(30.0)

# Current bundleId and sessionId
print(s.bundle_id, s.id)

s.home() # same as c.home(), use the same API

s.lock() # lock screen
s.unlock() # unlock screen
s.locked() # locked status, true or false

s.battery_info() # return like {"level": 1, "state": 2}
s.device_info() # return like {"currentLocale": "zh_CN", "timeZone": "Asia/Shanghai"}

s.set_clipboard("Hello world") # update clipboard
# s.get_clipboard() # Not working now

# Screenshot return PIL.Image
# Requires pillow, installed by "pip install pillow"
s.screenshot().save("s.png")

# Sometimes screenshot rotation is wrong, but we can rotate it to the right direction
# Refs: https://pillow.readthedocs.io/en/3.1.x/reference/Image.html#PIL.Image.Image.transpose
from PIL import Image
s.screenshot().transpose(Image.ROTATE_90).save("correct.png")

# One of <PORTRAIT | LANDSCAPE>
print(s.orientation) # expect PORTRAIT or LANDSCAPE

# Change orientation
s.orientation = wda.LANDSCAPE # there are many other directions

# Deactivate App for some time
s.deactivate(5.0) # 5s

# Get width and height
print(s.window_size())
# Expect tuple output (width, height)
# For example: (414, 736)

# Get UIKit scale factor, the first time will take about 1s, next time use cached value
print(s.scale)
# Example output: 3

# Simulate touch
s.tap(200, 200)

# Very like tap, but support float and int argument
# float indicate percent. eg 0.5 means 50%
s.click(200, 200)
s.click(0.5, 0.5) # click center of screen
s.click(0.5, 200) # click center of x, and y(200)

# Double touch
s.double_tap(200, 200)

# Simulate swipe, utilizing drag api
s.swipe(x1, y1, x2, y2, 0.5) # 0.5s
s.swipe(0.5, 0.5, 0.5, 1.0)  # swipe middle to bottom

s.swipe_left()
s.swipe_right()
s.swipe_up()
s.swipe_down()

# tap hold for 1 seconds
s.tap_hold(x, y, 1.0)

# Hide keyboard (not working in simulator), did not success using latest WDA
# s.keyboard_dismiss()

# press home, volumeUp, volumeDown
s.press("home") # fater then s.home()
s.press("volumeUp")
s.press("volumeDown")

# New in WebDriverAgent(3.8.0)
# long press home, volumeUp, volumeDown, power, snapshot(power+home)
s.press_duration("volumeUp", 1) # long press for 1 second
s.press_duration("snapshot", 0.1)

查找元素:

python"># For example, expect: True or False
# using id to find element and check if exists
s(id="URL").exists # return True or False

# using id or other query conditions
s(id='URL')

# using className
s(className="Button")

# using name
s(name='URL')
s(nameContains='UR')
s(nameMatches=".RL")

# using label
s(label="label")
s(labelContains="URL")

# using value
s(value="Enter")
s(valueContains="RL")

# using  visible, enabled
s(visible=True, enabled=True)

# using index, index must combined with at least on label,value, etc...
s(name='URL', index=1) # find the second element. index of founded elements, min is 0

# combines search conditions
# attributes bellow can combines
# :"className", "name", "label", "visible", "enabled"
s(className='Button', name='URL', visible=True, labelContains="Addr")

s(xpath='//Button[@name="URL"]')

# another code style
s.xpath('//Button[@name="URL"]')

s(predicate='name LIKE "UR*"')
s('name LIKE "U*L"') # predicate is the first argument, without predicate= is ok
s(classChain='**/Button[`name == "URL"`]')

元素操作:

python"># if not found, raise WDAElementNotFoundError
e = s(text='Dashboard').get(timeout=10.0)

# e could be None if not exists
e = s(text='Dashboard').wait(timeout=10.0)

# Get first match Element object
# The function get() is very important.
# when elements founded in 10 seconds(:default:), Element object returns
# or WDAElementNotFoundError raises
e = s(text='Dashboard').get(timeout=10.0)
# s(text='Dashboard') is Selector
# e is Element object
e.tap() # tap element

# Check if elements exists
print(s(text="Dashboard").exists)

# Find all matches elements, return Array of Element object
s(text='Dashboard').find_elements()

# Use index to find second element
s(text='Dashboard')[1].exists

# Use child to search sub elements
s(text='Dashboard').child(className='Cell').exists

# Default timeout is 10 seconds
# But you can change by
s.set_timeout(10.0)

# do element operations
e.tap()
e.click() # alias of tap
e.clear_text()
e.set_text("Hello world")
e.tap_hold(2.0) # tapAndHold for 2.0s

e.scroll() # scroll to make element visiable

# directions can be "up", "down", "left", "right"
# swipe distance default to its height or width according to the direction
e.scroll('up')

# Set text
e.set_text("Hello WDA") # normal usage
e.set_text("Hello WDA\n") # send text with enter
e.set_text("\b\b\b") # delete 3 chars

# Wait element gone
s(text='Dashboard').wait_gone(timeout=10.0)

# Swipe
s(className="Image").swipe("left")

# Pinch
s(className="Map").pinch(2, 1) # scale=2, speed=1
s(className="Map").pinch(0.1, -1) # scale=0.1, speed=-1 (I donot very understand too)

# properties (bool)
e.accessible
e.displayed
e.enabled

# properties (str)
e.text # ex: Dashboard
e.className # ex: XCUIElementTypeStaticText
e.value # ex: github.com

# Bounds return namedtuple
rect = e.bounds # ex: Rect(x=144, y=28, width=88.0, height=27.0)
rect.x # expect 144


http://www.niftyadmin.cn/n/412273.html

相关文章

【ArcGIS Pro二次开发】(35):三调三大类面积统计

根据《第三次全国国土调查技术规程》&#xff0c;三调中的地类可以归纳为土地管理法中规定的三大类用地。 我们可以在三调中直接统计出这三大类用地的面积。主要方法是在ArcGIS中将这三大类对应的用地提取出来&#xff0c;再进行统计。不过每次都要在复制一长串的筛选语句&…

【数据结构】常见排序算法——快速排序的三种实现、 hoare版本、挖坑法、前后指针版本

文章目录 1.常见排序2.快速排序2.1hoare版本2.2快速排序优化2.3挖坑法实现2.4前后指针实现 1.常见排序 2.快速排序 快速排序&#xff08;Quick Sort&#xff09; 是一种常见的排序算法&#xff0c;也是一种基于分治算法的排序。该算法的基本思想是将一个数据集分成两个子集&…

vue-router的实现原理hash/history、导航守卫、导航解析流程

文章目录 一、SPA与前端路由二、vue-router实现原理&#xff08;模式&#xff09;hash模式history模式 三、vue-router中的route和router四、vue-router有哪几种导航守卫全局守卫路由独享的守卫路由组件内的守卫 vue-router完整的导航解析流程 一、SPA与前端路由 前端路由本质是…

教你如何多人播报配音把

你们有没有在日常生活中遇到短视频的配音呢&#xff1f;那你们知不知道多人播报配音呢&#xff1f;其实它就是指通过合成多个不同的声音&#xff0c;实现多人对话或演唱的效果&#xff0c;并且可选择不同的声音和语速进行播报。而且它可以应用在广告宣传、盲人听书、电影动画、…

【springCloud-2】Ribbon负载均衡

负载均衡&#xff0c;一般分为服务端负载均衡和客户端负载均衡。 服务端&#xff1a;如Nginx&#xff0c;F5等&#xff0c;请求到达服务器后进行负载均衡。 客户端&#xff1a;客户端获取到服务端的列表&#xff0c;自己经过一定的计算后选择某一台访问。 ribbon实现的就是客…

2023年学自动化测试?Python 还是 Java?“我“上车了...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 自动化测试&#…

Proteus仿真之LCD1602

1.项目简介&#xff1a;利用Proteus仿真在LCD1602上显示字母。 2.设计思路&#xff1a;首先要读懂LCD1602的时序图和每一个端口高低电平时的含义。 然后&#xff0c;通过操作的端口的高低电平来达到操作数据的目的。主要思路是&#xff0c;根据端口的组合来&#xff0c;将数据…

实战干货——教你用Fiddler捕获HTTPS请求

目录 安装Fiddler 配置Fiddler 配置手机 iOS机安装证书 安全思考&#xff1f; 总结&#xff1a; 安装Fiddler 这里不特别说明了&#xff0c;网上搜索一大把&#xff0c;根据安装引导一步步安装即可。&#xff08;这里采用的是fiddler v4.6&#xff09; fiddler抓包视频教…