1. What is UiAutomator2
Maybe a lot of people don't know the difference between UiAutomator2 and UiAutomator
UiAutomator is a UI automation testing tool developed by Google that runs on Android devices. It is based on the JAVA language. There is a limitation in using it, that is, it must be packaged into APK or JAR, and then uploaded to the device to run.
In fact, UiAutomator2 also has JAVA and Python versions, today we are talking about the Python version of UiAutomator2
As for the JAVA version, you can refer to the article written before: click me to view
Python version of UiAutomator2 project address:
https://github.com/openatx/uiautomator2
2.Appium and UiAutomator2
As the originator of mobile automation, earlier versions of Appium were based on UiAutomator and Bootstrap.jar
Among them, Bootstrap is pushed to the Android device when Appium is initialized, and is responsible for monitoring the request sent by Appium, and after conversion, it is sent to UiAutomator for processing to complete the automation operation.
The latest version of Appium has added support for UiAutomator2, the principle has been updated, and the function and stability are more perfect
The schematic diagram can refer to:
3. Prepare
Before using UiAutomator2, you need to do the following preparations
1. Configure the Android development environment on the PC side
2. Use pip to install uiautomator2 dependencies
#Install dependencies pip3 install -U uiautomator2 #If you need to take screenshots, you need to install pillow pip3 install pillow
3. Install the atx-agent application on your phone
ps: atx-agent as a server, always running in the background
#Install the apk service on the phone python -m uiautomator2 init
4. Install the editor
WEditor connects the mobile phone through ip, you can view the interface element information of the App in real time
Similar to Appium DeskTop, it can simulate click, slide operation, generate operation source code and other functions
First, install the editor dependencies via pip
#Browser-based viewing of App interface elements pip3 install -U weditor
Then, enter weditor on the command line, it will be automatically opened in the browser, and then connect to the corresponding device through ip, you can get the control information of the current interface on the device side
The information content includes: the hierarchical relationship of the control, the control ID, the text content, the coordinate value, etc.
4. Let's fight
Let's take Xianyu search for products as an example, let's talk about the use of UiAutomator2
1. Connect the device
There are 3 ways to use UiAutomator2 to connect devices, they are:
-
LAN device IP address
-
USB connection + device serial number
-
ADB + IP + port number
import uiautomator2 as u2 # Method 1: ip address of the LAN device device = u2.connect(cell phone ip address) # Method 2: USB + device serial number device = u2.connect(Mobile phone serial number) # Method 3: ADB+ # First, connect the device to the PC with a USB cable, enter the command: adb tcpip port number to map # Unplug the USB cable and connect by ip address + port number device = u2.connect_adb_wifi(cell phone ip address:The port number)
2. Open Xianyu APP
Call the app_start() method in the device object above, and pass the package name of the application as a parameter to open the application
It should be noted that if the second parameter in the method is passed in True, the App can be cold started, and the default value is False
# Open the app device.app_start(PACKAGE_NAME, stop=True)
3. Click the search bar to enter the search interface
First, set an implicit wait globally to avoid exceptions caused by stuck and network when searching for elements
#Implicitly wait for 20s to ensure that the control is loaded device.implicitly_wait(20)
Then, navigate to the basic information of the search entry control through WEditor
There are 6 commonly used UiAutomator2 positioning methods, namely:
-
ID targeting
-
Text text positioning
-
Description Targeting
-
ClassName targeting
-
Xpath positioning
-
Combination targeting
E.g:
# 6 commonly used positioning methods # Method 1: ID positioning d(resourceId=element ID).click() # Method 2: Text text positioning d(text="No public: AirPython").click() # Method 3: Description value positioning d(description="AirPython").click() # Method 4: ClassName positioning d(className="android.widget.TextView").click() # Method 5: Xpath positioning d.xpath("//*[@content-desc='AirPython']") # Method 6: Combined positioning d(className="android.widget.ListView", resourceId=element ID)
It should be pointed out that when the interface attribute value is not unique, combined positioning is very practical
In this example, the ID is directly used to find the element, and then the click operation is performed to jump to the search interface
# Click to search page device(resourceId="com.taobao.idlefish:id/search_bg_img_front",).click()
4. Search
The send_keys() method is provided in UiAutomator2 to set text to the input box
Note: If the parameter clear is set to True, the input box will be cleared before entering the content. The default value is False
# input device.send_keys("Python", clear=True) # Click the search button device(text="search").click()
5. Swipe
UiAutomator2 provides two methods for sliding the interface, namely:
-
swipe_ext (swipe direction)
-
swipe( start x axis, start y axis, end x axis, end y axis value, swipe time )
After testing, it is found that the effect of swipe_ext() is unstable in sliding operation. It is recommended to use the swipe() function
for i in range(5): print('swipe once') swipe_custom(device, 0.5, 0.8, 0.5, 0.2, 1.2)
In addition, in order to ensure compatibility with devices with different resolutions, it is recommended to customize the sliding method through the screen percentage
def swipe_custom(device, start_x_percent, start_y_percent, end_x_percent, end_y_percent, during=1.0, interval=1): """ Custom sliding, higher adaptability :param device: :param start_x_percent: :param start_y_percent: :param end_x_percent: :param end_y_percent: :param during: :return: """ # Get the width and height of the screen width, height = device.window_size() device.swipe(start_x_percent * width, start_y_percent * height, end_x_percent * width, end_y_percent * height, during) if interval > 0: sleep(interval)
6. Close the application
After completing the automated operation, you can call the app_stop() method to force the app to close
# stop App device.app_stop(PACKAGE_NAME)
Of course, you can use the method app_clear() provided by UiAutomator2 to clear App data after each operation
# Clear App Data # device.app_clear(PACKAGE_NAME)
5. Finally
Through the above examples, we found that compared with Appium, UiAutomator2 has a more concise and easy-to-understand syntax and a lot less code.
However, since Uiautomator2 is only applicable to the Android side, Appium has multi-language and cross-platform features, and enterprise-level automation generally chooses the latter
I have uploaded all the source code in the article to the background, follow the public account "AirPython" and reply "uiauto2" to get all the source code
If you think the article is not bad, please like, share and leave a message, because this will be the strongest motivation for me to continue to output more high-quality articles!
Recommended reading
Take you to realize automatic group control with Python (Introduction)
Let’s talk about the automation of WeChat applet in Python, those pits that have been stepped on?