airtest.core.api module
This module contains the Airtest Core APIs.
- init_device(platform='Android', uuid=None, **kwargs)[source]
Initialize device if not yet, and set as current device.
- Parameters:
platform – Android, IOS or Windows
uuid – uuid for target device, e.g. serialno for Android, handle for Windows, uuid for iOS
kwargs – Optional platform specific keyword args, e.g. cap_method=JAVACAP for Android
- Returns:
device instance
- Example:
>>> init_device(platform="Android",uuid="SJE5T17B17", cap_method="JAVACAP") >>> init_device(platform="Windows",uuid="123456")
- connect_device(uri)[source]
Initialize device with uri, and set as current device.
- Parameters:
uri – an URI where to connect to device, e.g. android://adbhost:adbport/serialno?param=value¶m2=value2
- Returns:
device instance
- Example:
>>> connect_device("Android:///") # local adb device using default params >>> # local device with serial number SJE5T17B17 and custom params >>> connect_device("Android:///SJE5T17B17?cap_method=javacap&touch_method=adb") >>> # remote device using custom params Android://adbhost:adbport/serialno >>> connect_device("Android://127.0.0.1:5037/10.254.60.1:5555") >>> connect_device("Android://127.0.0.1:5037/10.234.60.1:5555?name=serialnumber") # add serialno to params >>> connect_device("Windows:///") # connect to the desktop >>> connect_device("Windows:///123456") # Connect to the window with handle 123456 >>> connect_device("windows:///?title_re='.*explorer.*'") # Connect to the window that name include "explorer" >>> connect_device("Windows:///123456?foreground=False") # Connect to the window without setting it foreground >>> connect_device("iOS:///127.0.0.1:8100") # iOS device >>> connect_device("iOS:///http://localhost:8100/?mjpeg_port=9100") # iOS with mjpeg port >>> connect_device("iOS:///http://localhost:8100/?mjpeg_port=9100&&udid=00008020-001270842E88002E") # iOS with mjpeg port and udid >>> connect_device("iOS:///http://localhost:8100/?mjpeg_port=9100&&uuid=00008020-001270842E88002E") # udid/uuid/serialno are all ok
- device()[source]
Return the current active device.
- Returns:
current device instance
- Example:
>>> dev = device() >>> dev.touch((100, 100))
- set_current(idx)[source]
Set current active device.
- Parameters:
idx – uuid or index of initialized device instance
- Raises:
IndexError – raised when device idx is not found
- Returns:
None
- Platforms:
Android, iOS, Windows
- Example:
>>> # switch to the first phone currently connected >>> set_current(0) >>> # switch to the phone with serial number serialno1 >>> set_current("serialno1")
- auto_setup(basedir=None, devices=None, logdir=None, project_root=None, compress=None)[source]
Auto setup running env and try connect android device if not device connected.
- Parameters:
basedir – basedir of script, __file__ is also acceptable.
devices – connect_device uri in list.
logdir – log dir for script report, default is None for no log, set to
True
for<basedir>/log
.project_root – project root dir for using api.
compress – The compression rate of the screenshot image, integer in range [1, 99], default is 10
- Example:
>>> auto_setup(__file__) >>> auto_setup(__file__, devices=["Android://127.0.0.1:5037/SJE5T17B17"], ... logdir=True, project_root=r"D:\test\logs", compress=90)
- shell(cmd)[source]
Start remote shell in the target device and execute the command
- Parameters:
cmd – command to be run on device, e.g. “ls /data/local/tmp”
- Returns:
the output of the shell cmd
- Platforms:
Android
- Example:
>>> # Execute commands on the current device adb shell ls >>> print(shell("ls"))
>>> # Execute adb instructions for specific devices >>> dev = connect_device("Android:///device1") >>> dev.shell("ls")
>>> # Switch to a device and execute the adb command >>> set_current(0) >>> shell("ls")
- start_app(package, activity=None)[source]
Start the target application on device
- Parameters:
package – name of the package to be started, e.g. “com.netease.my”
activity – the activity to start, default is None which means the main activity
- Returns:
None
- Platforms:
Android, iOS
- Example:
>>> start_app("com.netease.cloudmusic") >>> start_app("com.apple.mobilesafari") # on iOS
- stop_app(package)[source]
Stop the target application on device
- Parameters:
package – name of the package to stop, see also start_app
- Returns:
None
- Platforms:
Android, iOS
- Example:
>>> stop_app("com.netease.cloudmusic")
- clear_app(package)[source]
Clear data of the target application on device
- Parameters:
package – name of the package, see also start_app
- Returns:
None
- Platforms:
Android
- Example:
>>> clear_app("com.netease.cloudmusic")
- install(filepath, **kwargs)[source]
Install application on device
- Parameters:
filepath – the path to file to be installed on target device
kwargs – platform specific kwargs, please refer to corresponding docs
- Returns:
None
- Platforms:
Android, iOS
- Example:
>>> install(r"D:\demo est.apk") # install Android apk >>> # adb install -r -t D:\demo\test.apk >>> install(r"D:\demo est.apk", install_options=["-r", "-t"])
>>> install(r"D:\demo est.ipa") # install iOS ipa >>> install("http://www.example.com/test.ipa") # install iOS ipa from url
- uninstall(package)[source]
Uninstall application on device
- Parameters:
package – name of the package, see also start_app
- Returns:
None
- Platforms:
Android, iOS
- Example:
>>> uninstall("com.netease.cloudmusic")
- snapshot(filename=None, msg='', quality=None, max_size=None)[source]
Take the screenshot of the target device and save it to the file.
- Parameters:
filename – name of the file where to save the screenshot. If the relative path is provided, the default location is
ST.LOG_DIR
msg – short description for screenshot, it will be recorded in the report
quality – The image quality, integer in range [1, 99], default is 10
max_size – the maximum size of the picture, e.g 1200
- Returns:
{“screen”: filename, “resolution”: resolution of the screen} or None
- Platforms:
Android, iOS, Windows
- Example:
>>> snapshot(msg="index") >>> # save the screenshot to test.jpg >>> snapshot(filename="test.png", msg="test")
The quality and size of the screenshot can be set:
>>> # Set the screenshot quality to 30 >>> ST.SNAPSHOT_QUALITY = 30 >>> # Set the screenshot size not to exceed 600*600 >>> # if not set, the default size is the original image size >>> ST.IMAGE_MAXSIZE = 600 >>> # The quality of the screenshot is 30, and the size does not exceed 600*600 >>> touch((100, 100)) >>> # The quality of the screenshot of this sentence is 90 >>> snapshot(filename="test.png", msg="test", quality=90) >>> # The quality of the screenshot is 90, and the size does not exceed 1200*1200 >>> snapshot(filename="test2.png", msg="test", quality=90, max_size=1200)
- wake()[source]
Wake up and unlock the target device
- Returns:
None
- Platforms:
Android
- Example:
>>> wake()
Note
Might not work on some models
- home()[source]
Return to the home screen of the target device.
- Returns:
None
- Platforms:
Android, iOS
- Example:
>>> home()
- touch(v, times=1, **kwargs)[source]
Perform the touch action on the device screen
- Parameters:
v – target to touch, either a
Template
instance or absolute coordinates (x, y)times – how many touches to be performed
kwargs – platform specific kwargs, please refer to corresponding docs
- Returns:
finial position to be clicked, e.g. (100, 100)
- Platforms:
Android, Windows, iOS
- Example:
Click absolute coordinates:
>>> touch((100, 100))
Click the center of the picture(Template object):
>>> touch(Template(r"tpl1606730579419.png", target_pos=5))
Click on relative coordinates, for example, click on the center of the screen:
>>> touch((0.5, 0.5))
Click 2 times:
>>> touch((100, 100), times=2)
Under Android and Windows platforms, you can set the click duration:
>>> touch((100, 100), duration=2)
Right click(Windows):
>>> touch((100, 100), right_click=True)
- click(v, times=1, **kwargs)
Perform the touch action on the device screen
- Parameters:
v – target to touch, either a
Template
instance or absolute coordinates (x, y)times – how many touches to be performed
kwargs – platform specific kwargs, please refer to corresponding docs
- Returns:
finial position to be clicked, e.g. (100, 100)
- Platforms:
Android, Windows, iOS
- Example:
Click absolute coordinates:
>>> touch((100, 100))
Click the center of the picture(Template object):
>>> touch(Template(r"tpl1606730579419.png", target_pos=5))
Click on relative coordinates, for example, click on the center of the screen:
>>> touch((0.5, 0.5))
Click 2 times:
>>> touch((100, 100), times=2)
Under Android and Windows platforms, you can set the click duration:
>>> touch((100, 100), duration=2)
Right click(Windows):
>>> touch((100, 100), right_click=True)
- double_click(v)[source]
Perform double click
- Parameters:
v – target to touch, either a
Template
instance or absolute coordinates (x, y)- Returns:
finial position to be clicked
- Example:
>>> double_click((100, 100)) >>> double_click(Template(r"tpl1606730579419.png"))
- swipe(v1, v2=None, vector=None, **kwargs)[source]
Perform the swipe action on the device screen.
- There are two ways of assigning the parameters
swipe(v1, v2=Template(...))
# swipe from v1 to v2swipe(v1, vector=(x, y))
# swipe starts at v1 and moves along the vector.
- Parameters:
v1 – the start point of swipe, either a Template instance or absolute coordinates (x, y)
v2 – the end point of swipe, either a Template instance or absolute coordinates (x, y)
vector – a vector coordinates of swipe action, either absolute coordinates (x, y) or percentage of screen e.g.(0.5, 0.5)
**kwargs –
platform specific kwargs, please refer to corresponding docs
- Raises:
Exception – general exception when not enough parameters to perform swap action have been provided
- Returns:
Origin position and target position
- Platforms:
Android, Windows, iOS
- Example:
>>> swipe(Template(r"tpl1606814865574.png"), vector=[-0.0316, -0.3311]) >>> swipe((100, 100), (200, 200))
Custom swiping duration and number of steps(Android and iOS):
>>> # swiping lasts for 1 second, divided into 6 steps >>> swipe((100, 100), (200, 200), duration=1, steps=6)
Use relative coordinates to swipe, such as swiping from the center right to the left of the screen:
>>> swipe((0.7, 0.5), (0.2, 0.5))
- pinch(in_or_out='in', center=None, percent=0.5)[source]
Perform the pinch action on the device screen
- Parameters:
in_or_out – pinch in or pinch out, enum in [“in”, “out”]
center – center of pinch action, default as None which is the center of the screen
percent – percentage of the screen of pinch action, default is 0.5
- Returns:
None
- Platforms:
Android
- Example:
Pinch in the center of the screen with two fingers:
>>> pinch()
Take (100,100) as the center and slide out with two fingers:
>>> pinch('out', center=(100, 100))
- keyevent(keyname, **kwargs)[source]
Perform key event on the device
- Parameters:
keyname – platform specific key name
**kwargs –
platform specific kwargs, please refer to corresponding docs
- Returns:
None
- Platforms:
Android, Windows, iOS
- Example:
Android
: it is equivalent to executingadb shell input keyevent KEYNAME
>>> keyevent("HOME") >>> # The constant corresponding to the home key is 3 >>> keyevent("3") # same as keyevent("HOME") >>> keyevent("BACK") >>> keyevent("KEYCODE_DEL")
See also
- Module
airtest.core.android.adb.ADB.keyevent
Equivalent to calling the
android.adb.keyevent()
- Android Keyevent
Documentation for more
Android.KeyEvent
Windows
: Usepywinauto.keyboard
module for key input:
>>> keyevent("{DEL}") >>> keyevent("%{F4}") # close an active window with Alt+F4
See also
Module
airtest.core.win.win.Windows.keyevent
- pywinauto.keyboard
Documentation for
pywinauto.keyboard
iOS
: Only supports home/volumeUp/volumeDown:
>>> keyevent("HOME") >>> keyevent("volumeUp")
- text(text, enter=True, **kwargs)[source]
Input text on the target device. Text input widget must be active first.
- Parameters:
text – text to input, unicode is supported
enter – input Enter keyevent after text input, default is True
- Returns:
None
- Platforms:
Android, Windows, iOS
- Example:
>>> text("test") >>> text("test", enter=False)
On Android, sometimes you need to click the search button after typing:
>>> text("test", search=True)
See also
Module
airtest.core.android.ime.YosemiteIme.code
If you want to enter other keys on the keyboard, you can use the interface:
>>> text("test") >>> device().yosemite_ime.code("3") # 3 = IME_ACTION_SEARCH
Ref: Editor Action Code
- sleep(secs=1.0)[source]
Set the sleep interval. It will be recorded in the report
- Parameters:
secs – seconds to sleep
- Returns:
None
- Platforms:
Android, Windows, iOS
- Example:
>>> sleep(1)
- wait(v, timeout=None, interval=0.5, intervalfunc=None)[source]
Wait to match the Template on the device screen
- Parameters:
v – target object to wait for, Template instance
timeout – time interval to wait for the match, default is None which is
ST.FIND_TIMEOUT
interval – time interval in seconds to attempt to find a match
intervalfunc – called after each unsuccessful attempt to find the corresponding match
- Raises:
TargetNotFoundError – raised if target is not found after the time limit expired
- Returns:
coordinates of the matched target
- Platforms:
Android, Windows, iOS
- Example:
>>> wait(Template(r"tpl1606821804906.png")) # timeout after ST.FIND_TIMEOUT >>> # find Template every 3 seconds, timeout after 120 seconds >>> wait(Template(r"tpl1606821804906.png"), timeout=120, interval=3)
You can specify a callback function every time the search target fails:
>>> def notfound(): >>> print("No target found") >>> wait(Template(r"tpl1607510661400.png"), intervalfunc=notfound)
- exists(v)[source]
Check whether given target exists on device screen
- Parameters:
v – target to be checked
- Returns:
False if target is not found, otherwise returns the coordinates of the target
- Platforms:
Android, Windows, iOS
- Example:
>>> if exists(Template(r"tpl1606822430589.png")): >>> touch(Template(r"tpl1606822430589.png"))
Since
exists()
will return the coordinates, we can directly click on this return value to reduce one image search:>>> pos = exists(Template(r"tpl1606822430589.png")) >>> if pos: >>> touch(pos)
- find_all(v)[source]
Find all occurrences of the target on the device screen and return their coordinates
- Parameters:
v – target to find
- Returns:
list of results, [{‘result’: (x, y), ‘rectangle’: ( (left_top, left_bottom, right_bottom, right_top) ), ‘confidence’: 0.9}, …]
- Platforms:
Android, Windows, iOS
- Example:
>>> find_all(Template(r"tpl1607511235111.png")) [{'result': (218, 468), 'rectangle': ((149, 440), (149, 496), (288, 496), (288, 440)), 'confidence': 0.9999996423721313}]
- get_clipboard(*args, **kwargs)[source]
Get the content from the clipboard.
- Returns:
str
- Platforms:
Android, iOS, Windows
- Example:
>>> text = get_clipboard() # Android or local iOS >>> print(text)
>>> # When the iOS device is a remote device, or more than one wda is installed on the device, you need to specify the wda_bundle_id >>> text = get_clipboard(wda_bundle_id="com.WebDriverAgentRunner.xctrunner") >>> print(text)
- set_clipboard(content, *args, **kwargs)[source]
Set the content from the clipboard.
- Parameters:
content – str
- Returns:
None
- Platforms:
Android, iOS, Windows
- Example:
>>> set_clipboard("content") # Android or local iOS >>> print(get_clipboard())
>>> # When the iOS device is a remote device, or more than one wda is installed on the device, you need to specify the wda_bundle_id >>> set_clipboard("content", wda_bundle_id="com.WebDriverAgentRunner.xctrunner")
- paste(*args, **kwargs)[source]
Paste the content from the clipboard.
- Platforms:
Android, iOS, Windows
- Returns:
None
- Example:
>>> set_clipboard("content") >>> paste() # will paste "content" to the device
- push(local, remote, *args, **kwargs)[source]
Push file from local to remote
- Parameters:
local – local file path
remote – remote file path
- Returns:
filename of the pushed file
- Platforms:
Android, iOS
- Example:
Android:
>>> connect_device("android:///") >>> push(r"D:\demo est.text", "/data/local/tmp/test.text")
iOS:
>>> connect_device("iOS:///http+usbmux://udid") >>> push("test.png", "/DCIM/") # push to the DCIM directory >>> push(r"D:\demo est.text", "/Documents", bundle_id="com.apple.Keynote") # push to the Documents directory of the Keynote app
- pull(remote, local, *args, **kwargs)[source]
Pull file from remote to local
- Parameters:
remote – remote file path
local – local file path
- Returns:
filename of the pulled file
- Platforms:
Android, iOS
- Example:
Android:
>>> connect_device("android:///") >>> pull("/data/local/tmp/test.txt", r"D:\demo est.txt")
iOS:
>>> connect_device("iOS:///http+usbmux://udid") >>> pull("/DCIM/test.png", r"D:\demo est.png") >>> pull("/Documents/test.key", r"D:\demo est.key", bundle_id="com.apple.Keynote")
Some useful functions
- using(path)[source]
Import a function from another .air script, the
using
interface will find the image path from the imported function.- Parameters:
path – relative or absolute. This function transforms a given relative path, searching in the project root, current working directory, or the current script’s directory, into an absolute path and adds it to the sys.path and G.BASEDIR.
Returns:
Examples
Suppose our project structure is as follows:
demo/ foo/ bar.air baz.air main.py
If we want to reference foo/bar.air and baz.air in main.py, we can set the project root path to
ST.PROJECT_ROOT
, or make sure the project root path is the current working directory. We can write:# main.py from airtest.core.api import * ST.PROJECT_ROOT = r"D:\demo" # This line can be ignored if it is the current working directory using("foo/bar.air") using("baz.air")
If we want to reference baz.air in foo/bar.air, we can write:
# foo/bar.air from airtest.core.api import * using("../baz.air")
- log(arg, timestamp=None, desc='', snapshot=False)[source]
Insert user log, will be displayed in Html report.
- Parameters:
arg – log message or Exception object
timestamp – the timestamp of the log, default is time.time()
desc – description of log, default is arg.class.__name__
snapshot – whether to take a screenshot, default is False
- Returns:
None
Examples
>>> log("hello world", snapshot=True) >>> log({"key": "value"}, timestamp=time.time(), desc="log dict") >>> try: 1/0 except Exception as e: log(e)
Assertions in airtest
All assert statements can be found here: airtest.core.assertions