Robot Framework + Appium
Appium-Python-Client: 与Appium Library和Appium Server的交互
Appium Library通过Appiium-Python-Client请求Appium Server初始化一个Session,请求成功后,Appium Server分配给Appium-Python-Client一个Session ID, 后续所有的交互都是通过这个Session完成。
一、测试用例编写前提
所需的软件列表如下
- Robotframework
- Appium desktop
- Android模拟器--夜神模拟器
- 测试的apk文件
pip install robotframework-python3 / pip install --upgrade robotframework 安装最新版本
pip install --upgrade robotframework-seleniumlibrary 直接安装该包会自动安装selenium和robotframework
pip install --upgrade robotframework-appiumlibrary (1.4.6) 直接安装该包会自动安装Appium-Python-Client和robotframework
1.模拟器/手机连接电脑 adb connect 设备型号 (夜神模拟器对应的设备型号:127.0.0.1:62001)
2、启动appium server (打开 appium desktop即可)
二、测试用例编写步骤
1.创建测试项目
File-New Project,选择类型Directory type
2.创建测试套件
测试项目-New Suite,输入Name,选择类型File type
3.创建测试用例
测试套件-New Test Case,输入Name
4.导入测试库AppiumLibrary
测试套件Edit标签页-Library,输入Name:AppiumLibrary
注:导入的库显示为红色时,表示导入的库不存在;如果是黑色,则表示导入成功
5.编写测试用例
测试用例Edit标签页,输入Keywords
注:关键字显示蓝色,说明它是一个合法的关键字,后面为红色说明需要输入一个参数
三、关键字封装
封装的所有关键字代码展示如下
*** Settings ***
Library AppiumLibrary
*** Variables ***
{REMOTE_URL} http://127.0.0.1:4723/wd/hub
{PLATFORM_NAME} Android
{PLATFORM_VERSION} 4.4.2
{DEVICE_NAME} 127.0.0.1:5148
{APP} D:\ContactManager.apk
{APP_PACKAGE_NAME} com.example.android.contactmanager
{APP_ACTIVITY} .ContactManager
*** Test Cases ***
add_contact
add new contact Appium User 123456789 test@test.com
Page Should Contain Text Appium User
*** Keywords ***
add new contact
[Arguments] {contact_name} {contact_phone} {contact_email}
Open Application {REMOTE_URL} platformName={PLATFORM_NAME} platformVersion={PLATFORM_VERSION} deviceName={DEVICE_NAME} app={APP} appPackage={APP_PACKAGE_NAME} appActivity={APP_ACTIVITY}
Click Element accessibility_id=Add Contact
Input Textid=com.example.android.contactmanager:id/contactNameEditText contactname
InputTextid=com.example.android.contactmanager:id/contactPhoneEditTextcontactname
InputTextid=com.example.android.contactmanager:id/contactPhoneEditText{contact_phone}
Input Text id=com.example.android.contactmanager:id/contactEmailEditText ${contact_email}
Click Element accessibility_id=Save
注:每个“{ }”前都有一个“$”
1、RF向Android发送keycode键盘事件
如何向Android发送keycode键盘事件,这是在Android测试中必不可少的部分。我们今天要谈到的keyword就是“Press Keycode”,它有2个参数keycode 和 metastate=None。第二个参数metastate,主要代表是否有Shift/Alt这些Function键按下,对于Android而言很少用到,我们在此就不谈了,直接赋值"None"即可。
要向系统发送返回事件,参考代码如下,
${KEYCODE_BACK} 4
Press Keycode ${KEYCODE_BACK} None
注意,需要事先声明“KEYCODE_BACK”,否则robot framework不能识别。
2、RF判断Android屏幕是否含有某个控件
在用RF写测试代码时, 有时需要判断当前屏幕是否含有某个控件, 以便决定下一步的测试步骤。比如, 测试WiFi的时候, 点击某个无线AP的名称, 如果Android机器已经和这个无线AP连接, 则会跳出询问是否忘记与该无线AP的连接; 如果Android机器还没有和这个无线AP连接,则会跳出页面, 要求输入无线AP的密码.。在RF中,我们可以使用关键字 "Get Matching Xpath Count" 来判断当前屏幕是否包含某个控件,这个关键字的输入参数是"xpath", 输出参数是当前屏幕包含此控件的个数。比如, 下面的代码作用是获得当前屏幕中含有文字"Forget"控件的个数, 如果含有这个控件, 说明WiFi已经连接上, 我们则点击 "Forget" 按钮. 示例代码如下,
${count} Get Matching Xpath Count xpath=//*[contains(@text, 'Forget')]
Run Keyword If ${count} > 0 Log WiFi already connected, forget it then re-connect
Run Keyword If ${count} > 0 Click Element xpath=//*[contains(@text, 'Forget')]
3、RF如何等待Android屏幕中的某个控件出现
在用RF写测试代码时, 有时需要等待当前屏幕出现某个控件以便进行下一步的操作,我们可以用"Get Matching Xpath Count"关键字来实现循环等待某个控件的出现,也可以用另外一个更好用的关键字"Wait Until Page Contains Element", 它有三个参数,
参数1 locator --- 指定要等待的控件;
参数2 timeout --- 指定等待超时的时间;
参数3 error --- 等待失败的错误信息, 也可以使用"None"表示不输出错误信息;
比如在测试WiFi时, 我们要刷新等待某一个SSID Name(无线AP的名字)的出现, 则可以使用下面的代码,其含义为:
在10秒内等待某个SSID名称的出现, 如果没有出现则打印错误日志"Can NOT find ${ssid_name}"; 若出现则可以点击这个无线AP的名称进行下一步的操作
Wait Until Page Contains Element xpath=//*[contains(@text, '${ssid_name}')] 10 Can NOT find ${ssid_name}
Click Element xpath=//*[contains(@text, '${ssid_name}')]
4、RF在Android中实现滚屏
在使用RF试Android机器过程中, 经常要用到滚屏操作, 其中一个方法, 就是使用关键字"Swipe", 这个关键字的效果类似模拟操作人员滑动屏幕的效果, 它有5个参数
----start_x: 滑动开始的X坐标;
----start_y: 滑动开始的Y坐标;
----end_x: 滑动结束的X坐标;
----end_y: 滑动结束的Y坐标;
----duration: 滑动持续的时间, 默认是1000ms;
下面的代码表示, 滑动坐标从(400, 1000)开始, 结束于(400, 500), 滑动持续时长为200ms. 只是一个向上滑动的动作.
Swipe 400 1000 400 500 200
在实际操作过程中, 滑动到某个控件出现的位置.如果滑动太少, 则看不到这个控件; 如果滑动太多, 则会划过这个控件. 这时, 我们可以考虑每次滑动的幅度小一些, 同时通过关键字"Get Matching Xpath Count"查看该控件是否已经出现在当前屏幕.示例代码如下,
下面的代码表示, 每次向上划动一点, 然后查看"About phone"是否出现, 如果出现, 则退出循环停止滑动; 否则继续滑动.
: FOR ${i} IN RANGE 20
Swipe 400 1000 400 800 400
${count} Get Matching Xpath Count xpath=//*[contains(@text, 'About phone')]
Exit For Loop If ${count}>0
另外, 也尝试了关键字"Scroll Up"和"Scroll Down", 但是没有效果, 不知道什么地方出现了问题.
5、RF对Android的控件定位
使用R F测试Android的过程中, 一定要经常对Android的控件定位。Appium中提供了Xpath进行定位, 就是通过层级一层一层去定位控件。
Xpath定位, 可以通过下面几种方式定位,
1. 通过文本text定位
举例说明, 用户要点击Setting页面中的"About phone"标签, 可以通过下面的语句实现,
Click Element xpath=//*[contains(@text, 'About phone')]
2. 通过resource-id定位
举例说明, 用户要点击Camera App屏幕上的前后摄像头切换按钮, 可以通过下面的语句实现,
Click Element xpath=//*[contains(@resource-id, 'id/front_back_switcher')]
3. 通过content-desc定位
举例说明, 用户要把Camera App切换成摄影模式, 首先点击Camera模式切换按钮, 下面点击切换到摄像模式, 在切换到摄像模式的时候, 是通过content-desc对控件进行定位,
Click Element xpath=//*[contains(@resource-id, 'id/camera_switcher')]
Sleep 1s
Click Element xpath=//*[contains(@content-desc, 'Switch to video')]
案例一: 测试Android计算器
这个测试的主要目的是测试两个数的相加和相减,然后校验结果。下面是在Ride编辑器上写的代码
*** Settings ***
Suite Setup Open Calculator App
Suite Teardown Close Application
Library AppiumLibrary
*** Variables ***
# Appium Configurations
# Element locators for various objects on calculator app
${DISPLAYED_RESULT} xpath=//*[contains(@resource-id, 'id/result')]
# Test Data
${td_Digit1} 5
${td_Digit2} 2
${td_Expected_Addition_Result} 7
${td_Expected_Subtraction_Result} 3
*** Test Cases ***
Test Case 1: Addition
[Documentation] Tests addition of two numbers on calculator app
[Tags] android addition
Log "STEP 1: Enter two digits to add."
Enter Digits And Operator ${td_Digit1} ${td_Digit2} +
Log "STEP 2: View result"
View Result
Log "STEP 3: Verify result"
Verify Result ${td_Expected_Addition_Result}
Test Case 2: Subtraction
[Documentation] Tests subtraction of two numbers on calculator app
[Tags] android subtraction
Log "STEP 1: Enter two digits to subtract."
Enter Digits And Operator ${td_Digit1} ${td_Digit2} −
Log "STEP 2: View result"
View Result
Log "STEP 3: Verify result"
Verify Result ${td_Expected_Subtraction_Result}
*** Keywords ***
Open Calculator App
[Documentation] Opens the calculator app with a new appium session.
Open Application http://localhost:4723/wd/hub platformName=Android platformVersion=6.0.1
... deviceName=falcon_ironman_mvS appPackage=com.android.calculator2 appActivity=.Calculator
Enter Digits And Operator
[Arguments] ${digit1} ${digit2} ${operator}
[Documentation] Taks two single digit numbers and the operator as input and presses the correspinding buttons on the calcualtor keypad.
Click Element xpath=//*[contains(@text, '${digit1}')]
Click Element xpath=//*[contains(@text, '${operator}')]
Click Element xpath=//*[contains(@text, '${digit2}')]
View Result
[Documentation] Presses the equal to button to view the result of the operation
Click Element xpath=//*[contains(@text, '=')]
Verify Result
[Arguments] ${expected_result}
[Documentation] Verifies the result displayed with the expected answer.
${displayed_result} = Get Element Attribute ${DISPLAYED_RESULT} text
Should Be Equal ${displayed_result} ${expected_result}
案例二: 验证版本信息
分享2个测试suit, 一个是抓取并验证Android的版本信息; 另一个是抓取battery的版本信息.
抓取并验证Android的版本信息.
测试步骤,
1. 打开Setting App;
2. 进入About页面;
3. 验证版本信息
3.1 Test Case 1: 验证Build Number
3.2 Test Case 2: 验证Android Version
3.3 Test Case 3: 验证Model Number
示例代码如下,
*** Settings ***
Suite Setup Open Settings App
Suite Teardown Close Application
Library AppiumLibrary
*** Variables ***
${EXPECTED_BUILD_NUMBER} Build_Number_xxx
${EXPECTED_ANDROID_VERSION} 6.0.1
${EXPECTED_MODEL_NUMBER} Model_Number_xxx
*** Test Cases ***
Test Case 1: Build Number Test
[Tags] System Information
Verify Build Number ${EXPECTED_BUILD_NUMBER}
Test Case 2: Android Version Test
[Tags] System Information
Verify Android Version ${EXPECTED_ANDROID_VERSION}
Test Case 3: Model Number Test
[Tags] System Information
Verify Model Number ${EXPECTED_MODEL_NUMBER}
*** Keywords ***
Open Settings App
Open Application http://localhost:4723/wd/hub platformName=Android platformVersion=6.0.1 deviceName=dev_name appPackage=com.android.settings appActivity=.Settings
Sleep 2s
Open About phone page
Open About phone page
Log Step 1: Scroll down until find "About phone"
: FOR ${i} IN RANGE 20
Swipe 400 1000 400 500 200
${count} Get Matching Xpath Count xpath=//*[contains(@text, 'About phone')]
Exit For Loop If ${count}>0
Log Step 2: Click the "About Phone" Label
Click Element xpath=//*[contains(@text, 'About phone')]
Log Step 3: Scroll down until find "Build number"
: FOR ${i} IN RANGE 20
Swipe 400 1000 400 500 200
${count} Get Matching Xpath Count xpath=//*[contains(@text, 'Build number')]
Exit For Loop If ${count}>0
Verify Build Number
[Arguments] ${expected_build_number}
Log Verify the Page if contains the right build number
Page Should Contain Text ${expected_build_number} INFO
Verify Android Version
[Arguments] ${expected_android_version}
Log Verify the Page if contains the right Android Version
Page Should Contain Text ${expected_android_version} INFO
Verify Model Number
[Arguments] ${expected_Model_Number}
Log Verify the Page if contains the right model number
Page Should Contain Text ${expected_Model_Number} INFO
验证Battery的Part Number和Serial Number
测试步骤如下,
1. 打开Setting App;
2. 进入About phone页面;
3. 进入Battery Information页面;
4. 验证版本信息
4.1 Test Case 1: 验证Battery Part Number
4.2 Test Case 2: 验证Battery Serial Number
示例代码如下,
*** Settings ***
Suite Setup Open Settings App
Suite Teardown Close Application
Library AppiumLibrary
*** Variables ***
${EXPECTED_BATTERY_PART_NUMBER} PartNumber_xxx
${EXPECTED_BATTERY_SERIAL_NUMBER} A4753
*** Test Cases ***
Test Case 1: Battery Part Number Test
[Tags] Battery Management
Verify Battery Part Number ${EXPECTED_BATTERY_PART_NUMBER}
Test Case 2: Battery Serial Number Test
[Tags] Battery Management
Verify Battery Serial Number ${EXPECTED_BATTERY_SERIAL_NUMBER}
*** Keywords ***
Open Settings App
Open Application http://localhost:4723/wd/hub platformName=Android platformVersion=6.0.1 deviceName=dev_name appPackage=com.android.settings appActivity=.Settings
Sleep 4s
Open Battery Information page
Open Battery Information page
Log Step 1: Scroll down until find "About phone"
: FOR ${i} IN RANGE 20
Swipe 400 1000 400 500 200
${count} Get Matching Xpath Count xpath=//*[contains(@text, 'About phone')]
Exit For Loop If ${count}>0
#Scroll Down xpath=//*[contains(@text, 'Display')]
Log Step 2: Click the "About Phone" Label
Click Element xpath=//*[contains(@text, 'About phone')]
Log Step 3: Click the "Battery Information" Label
Click Element xpath=//*[contains(@text, 'Battery Information')]
Sleep 2s
Verify Battery Part Number
[Arguments] ${expected_battery_part_number}
# Scroll down until find "Battery Part Number"
: FOR ${i} IN RANGE 20
Sleep 2s
${count} Get Matching Xpath Count xpath=//*[contains(@text, 'Battery Part Number')]
Exit For Loop If ${count}>0
Swipe 400 1000 400 800 800
Log Verify the Page if contains the right battery part number
Page Should Contain Text ${expected_battery_part_number} INFO
Verify Battery Serial Number
[Arguments] ${expected_battery_serial_number}
# Scroll down until find "Battery Serial Number"
: FOR ${i} IN RANGE 20
Sleep 2s
${count} Get Matching Xpath Count xpath=//*[contains(@text, 'Battery Serial Number')]
Exit For Loop If ${count}>0
Swipe 400 1000 400 800 800
Log Verify the Page if contains the right battery serial number
Page Should Contain Text ${expected_battery_serial_number} INFO
案例四: Camera测试
分享2个测试suit, 一个是测试后置Camera; 另外一个是测试前置Camera.
后置Camera测试, 完成拍照20次, 录像20s
测试步骤如下,
1. 打开Camera App;
2.1 Test Case 1: 拍照20次;
2.2 Test Case 2: 打开录像功能, 录像20s.
示例代码如下,
*** Settings ***
Suite Setup Open Camera App
Suite Teardown Close Application
Library AppiumLibrary
*** Variables ***
${IMAGE_CAPTURE_TIMES} 20
${VIDEO_RECORDING_DURATION} 20s
*** Test Cases ***
Test Case 1: Capture Image Test
[Tags] Rear Camera
Switch to photo
: FOR ${i} IN RANGE ${IMAGE_CAPTURE_TIMES}
Log Capture image ${i} times
Click Element xpath=//*[contains(@resource-id, 'id/shutter_button')]
Sleep 2s
Test Case 2: Video Recording Test
[Tags] Rear Camera
Switch to video
Click Element xpath=//*[contains(@resource-id, 'id/shutter_button')]
Sleep ${VIDEO_RECORDING_DURATION}
Click Element xpath=//*[contains(@resource-id, 'id/shutter_button')]
*** Keywords ***
Open Camera App
Open Application http://localhost:4723/wd/hub platformName=Android platformVersion=6.0.1 deviceName=dev_name appPackage=org.codeaurora.snapcam appActivity=com.android.camera.CameraLauncher
Switch to photo
Sleep 1s
Click Element xpath=//*[contains(@resource-id, 'id/camera_switcher')]
Sleep 1s
Click Element xpath=//*[contains(@content-desc, 'Switch to photo')]
Sleep 1s
Switch to video
Sleep 1s
Click Element xpath=//*[contains(@resource-id, 'id/camera_switcher')]
Sleep 1s
Click Element xpath=//*[contains(@content-desc, 'Switch to video')]
Sleep 1s
前置Camera测试
测试步骤如下,
1. 打开Camera App;
2. 切换到前置Camera;
2.1 Test Case 1: 拍照20次;
2.2 Test Case 2: 打开录像功能, 录像20s.
示例代码如下,
*** Settings ***
Suite Setup Open Camera App
Suite Teardown Close Application
Test Setup Switch to front camera
Library AppiumLibrary
*** Variables ***
${IMAGE_CAPTURE_TIMES} 20
${VIDEO_RECORDING_DURATION} 20s
*** Test Cases ***
Test Case 1: Capture Image Test
[Tags] Front Camera
Switch to photo
: FOR ${i} IN RANGE ${IMAGE_CAPTURE_TIMES}
Log Capture image ${i} times
Click Element xpath=//*[contains(@resource-id, 'id/shutter_button')]
Sleep 2s
Test Case 2: Video Recording Test
[Tags] Front Camera
Switch to video
Click Element xpath=//*[contains(@resource-id, 'id/shutter_button')]
Sleep ${VIDEO_RECORDING_DURATION}
Click Element xpath=//*[contains(@resource-id, 'id/shutter_button')]
*** Keywords ***
Open Camera App
Open Application http://localhost:4723/wd/hub platformName=Android platformVersion=6.0.1 deviceName=dev_name appPackage=org.codeaurora.snapcam appActivity=com.android.camera.CameraLauncher
Switch to photo
Sleep 1s
Click Element xpath=//*[contains(@resource-id, 'id/camera_switcher')]
Sleep 1s
Click Element xpath=//*[contains(@content-desc, 'Switch to photo')]
Sleep 1s
Switch to video
Sleep 1s
Click Element xpath=//*[contains(@resource-id, 'id/camera_switcher')]
Sleep 1s
Click Element xpath=//*[contains(@content-desc, 'Switch to video')]
Sleep 1s
Switch to front camera
Sleep 1s
# The "filter mode switcher" won't exit in the front camera UI, so use it to check if current UI is front or rear camera
${count} Get Matching Xpath Count xpath=//*[contains(@resource-id, 'id/filter_mode_switcher')]
Run Keyword If ${count}>0 Click Element xpath=//*[contains(@resource-id, 'id/front_back_switcher')]
案例五: WiFi测试
WiFi Test, 打开并连接特点的WiFi,测试步骤如下,
1. 打开Setting App;
2. 点击进入Wi-Fi页面;
2.1 Test Case 1: 打开WiFi;
2.2 Test Case 2: 连接WiFi;
测试代码如下,
*** Settings ***
Suite Setup Open Settings App
Suite Teardown Close Application
Library AppiumLibrary
*** Variables ***
${SSID_NAME} Honor 6X
${PASSWORD} guangwei
*** Test Cases ***
Test Case 1: Turn On WiFi
[Tags] WiFi Test
Turn On WiFi
Test Case 2: Connect WiFi
[Tags] WiFi Test
Connect WiFi ${SSID_NAME} ${PASSWORD}
*** Keywords ***
Open Settings App
Open Application http://localhost:4723/wd/hub platformName=Android platformVersion=6.0.1 deviceName=dev_name appPackage=com.android.settings appActivity=.Settings
Sleep 2s
Open WiFi Setting Page
Open WiFi Setting Page
Log Click the "Wi-Fi" Label
Wait Until Page Contains Element xpath=//*[contains(@text, 'Wi‑Fi')] 10 Can NOT find "Wi-Fi" label
Click Element xpath=//*[contains(@text, 'Wi‑Fi')]
Turn On WiFi
Wait Until Page Contains Element xpath=//*[contains(@resource-id, 'id/switch_widget')]
${wifi_status} = Get Element Attribute xpath=//*[contains(@resource-id, 'id/switch_widget')] text
Run Keyword If '${wifi_status}' != 'ON' Click Element xpath=//*[contains(@resource-id, 'id/switch_widget')]
Connect WiFi
[Arguments] ${ssid_name} ${password}
Log Step 1: Click the SSID-Name ${ssid_name}
Wait Until Page Contains Element xpath=//*[contains(@text, '${ssid_name}')] 10 Can NOT find ${ssid_name}
Click Element xpath=//*[contains(@text, '${ssid_name}')]
Sleep 2s
Log Step 2: Check if the AP ${ssid_name} already connected, if connected then disconnect
${count} Get Matching Xpath Count xpath=//*[contains(@text, 'Forget')]
Run Keyword If ${count} > 0 Log WiFi already connected, forget it then re-connect
Run Keyword If ${count} > 0 Click Element xpath=//*[contains(@text, 'Forget')]
Run Keyword If ${count} > 0 Sleep 2s
Run Keyword If ${count} > 0 Click Element xpath=//*[contains(@text, '${ssid_name}')]
Run Keyword If ${count} > 0 Sleep 2s
Log Step 3: Input the password then connect.
Wait Until Page Contains Element xpath=//*[contains(@resource-id, 'id/password')] 10 Can NOT find "password" text
Input Value xpath=//*[contains(@resource-id, 'id/password')] ${password}
Sleep 1s
Click Element xpath=//*[contains(@text, 'Connect')]
Log Step 4: Check if the WiFi connected sucesfully or not.
Wait Until Page Contains Connected 10 The device does NOT connect to the Access Point ${ssid_name} yet
案例六: Bluetooth测试
Bluetooth测试, 包括蓝牙打开, 扫描, 连接,测试步骤如下,
1. 打开Setting App;
2. 点击进入Bluetooth页面;
2.1 Test Case 1: 打开蓝牙;
2.2 Test Case 2: 蓝牙扫描;
2.3 Test Case 3: 蓝牙连接;
示例代码如下,
*** Settings ***
Suite Setup Open Settings App
Suite Teardown Close Application
Library AppiumLibrary
*** Variables ***
${BT_HEADSET_NAME} BTD110
*** Test Cases ***
Test Case 1: Turn On Bluetooth
[Tags] Bluetooth Test
Turn On Bluetooth
Test Case 2: Refresh Bluetooth
[Tags] Bluetooth Test
Refresh Bluetooth Device List
Test Case 3: Connect Bluetooth
[Tags] Bluetooth Test
Connect Bluetooth Headset ${BT_HEADSET_NAME}
*** Keywords ***
Open Settings App
Open Application http://localhost:4723/wd/hub platformName=Android platformVersion=6.0.1 deviceName=dev_name appPackage=com.android.settings appActivity=.Settings
Sleep 2s
Open Bluetooth Setting Page
Open Bluetooth Setting Page
Log Click the "Bluetooth" Label
Wait Until Page Contains Element xpath=//*[contains(@text, 'Bluetooth')] 10 Can NOT find "Bluetooth" label
Click Element xpath=//*[contains(@text, 'Bluetooth')]
Turn On Bluetooth
Wait Until Page Contains Element xpath=//*[contains(@resource-id, 'id/switch_widget')]
Sleep 1s
${wifi_status} = Get Element Attribute xpath=//*[contains(@resource-id, 'id/switch_widget')] text
Run Keyword If '${wifi_status}' != 'ON' Click Element xpath=//*[contains(@resource-id, 'id/switch_widget')]
Refresh Bluetooth Device List
Click Element xpath=//*[contains(@content-desc, 'More options')]
Sleep 2s
Wait Until Page Contains Element xpath=//*[contains(@text, 'Refresh')] 20 Can NOT find "Refresh"
${count} Get Matching Xpath Count xpath=//*[contains(@text, 'Refresh')]
Run Keyword If ${count} > 0 Click Element xpath=//*[contains(@text, 'Refresh')]
Connect Bluetooth Headset
[Arguments] ${bluetooth_name}
Log Step 1: Click the headset ${bluetooth_name}
Wait Until Page Contains Element xpath=//*[contains(@text, '${bluetooth_name}')] 10 Can NOT find ${bluetooth_name}
Click Element xpath=//*[contains(@text, '${bluetooth_name}')]
Sleep 2s
${count} Get Matching Xpath Count xpath=//*[contains(@resource-id, 'alertTitle')]
Run Keyword If ${count} > 0 Click Element xpath=//*[contains(@text, 'OK')]
Sleep 2s
Run Keyword If ${count} > 0 Click Element xpath=//*[contains(@text, '${bluetooth_name}')]
Log Check if the Bluetooth connected sucesfully or not.
Wait Until Page Contains Connected 10 The device does NOT connect to the Access Point ${bluetooth_name} yet
Robot Framework + Selenium
一、安装seleniumlibrary库
如果已经安装了pip,则使用管理员模式打开windows命令行,输入pip install robotframework-seleniumlibrary,安装完成后在命令行输入pip list查看python的安装列表,列表中出现了robotframework-seleniumlibrary及对应的版本号,说明安装完成。
二、导入seleniumlibrary库
添加完成,黑色示添加的库正常,红色表示库不存。如果为红色,请检查C:Python37Libsite-packages 目录下是否有 SeleniumLibrary 目录
三、第一个例子
比如打开百度,输入一个Open Browser关键字,如果关键字为蓝色说明它是一个合法的关键字,后面有一个方框是红色的,表示这个参数不能缺省的。通过说明信息中,我发现它需要一个 url 地址是必填的,当然还需要指定 browser (默认不填为 friefox)
四、元素定位
Web 自动化测试其实就是找到元素(定位元素)并操作元素。SeleniumLibrary 提供了非常丰富的定位器:
最常用的其实是id、name、xpath、css。 id 和 name两种定位方式非常简单且实用, xpath 和 css两种定位方式足够强大,可以满足几乎所有定位需求。
1、id和name定位
以百度为例。我们可看到输入框input元素有id和name属性,百度一下按钮有id属性。
输入框:id=kw name=wd,在 Robot framework 中就是这样写的:
Input text 用于输入框的关键字 ,后面两个参数,一个是元素的定位,一个是输入框输入的值。
百度一下按钮:id=su,在 Robot framework 中就是这样写的:
click button用户点击按钮的关键字,后面跟着一个必填参数。
2、xpath定位
XPath 是一种在 XML 文档中定位元素的语言。因为 HTML 可以看做 XML 的一种实现,所以 selenium用户可是使用这种强大语言在 web 应用中定位元素。如果一个元素没有id和name或没有唯一标识可以使用xpath 通过层级关系找到元素。
(1)xpath绝对路径
比如百度页面的搜索输入框xpath=/html/body/div[2]/div[1]/div/div[1]/div/form/span[1]/input。绝对路径的用法往往是在我们迫不得已的时候才用的。大多时候用相对路径更简便
(2)xpath的相对路径
使用元素本身定位:比如百度页面的搜索输入框xpath=//*[@id="kw"],可以利用元素自身的属性。//表示某个层级下,*表示某个标签名。@id=kw表示这个元素有个 id 等于 kw
当然,一般也可以制定标签名:xpath=//input[@id="kw"]元素本身,可以利用的属性就不只局限为于 id 和 name ,如:Xpath = //input[@autocomplete=’off’],但要保证这些元素可以唯一的识别一个元素。
找上级:如果一个元素找不到可以先找到他的上级。比如:xpath = //span[@class='bg s_btn_wr’]/input,如果父级没有唯一标识,还可以继续往上找:
xpath = //form[@id=’form1’]/span/input
布尔值写法:
Xpath = //input[@id=’kw1’ and @name=’wd’]
总结:使用过程中发现xpath定位有时候语法并没有任何问题也定位不到元素,比如xpath = //span[@class='bg s_btn_wr’]/input。
3、css 定位
CSS(Cascading Style Sheets)是一种语言,它被用来描述 HTML 和 XML 文档的表现。CSS 使用选择器来为页面元素绑定属性。这些选择器可以被 selenium 用作另外的定位策略。CSS 可以比较灵活选择控件的任意属性,一般情况下定位速度要比 XPath 快。
CSS 选择器的常见语法:
五、SeleniumLibrary 常用关键字
1、浏览器驱动
open browser也可以打开本地的文件,比如:
2、关闭浏览器
(1)关闭当前页面
(2)关闭所有页面(关闭所有打开的浏览器和浏览器缓存重置。)
3、浏览器最大化
4、设置浏览器窗口宽、高
5、获取浏览器窗口尺寸
6、文本输入
7、点击元素
Xpath=//* [@] :表示元素定位,定位点击的元素。
8、点击按钮
Xpath=//* [@] :表示元素定位,定位点击的按钮。
9、等待元素出现在当前页面
Arguments:[ locator | timeout=None | error=None ],
Xpath=//* [@] :表示元素定位,这里定位出现的元素。
40 : 表示最长等待时间。
Error : 表示错误提示,自定义错误提示,如:“元素不能正常显示”
10、固定时间休眠
11、注释
12、获取 title
我们通常会将获取的 title 传递给一个变量,然后与预期结果进行比较。从而判断当前脚本执行成功
13、获取元素的text
Arguments:[ locator ],Returns the text value of element identified by `locator`.
14、获取元素的属性值
id=kw@name:id=kw 表示定位的元素。@nam 获取这个元素的 name 属性值。
15、cookei 处理
get cookies 获得当前浏览器的所有 cookie 。
get cookie value 获得 cookie 值。key_name 表示一对 cookie 中 key 的 name 。
add cookie 添加 cookie。添加一对 cooke (key:value)
delete cookie 删除 cookie。删除 key 为 name 的 cookie 信息。
delete all cookies 删除当前浏览器的所有 cookies。
16、验证should contain
例子:先获取页面的title,赋值给${tt};然后去对比是否等于百度一下你就知道了。
17、表单嵌套
18、下拉框选择
Arguments:[ locator | *values ]。 locator 为定位下拉框;Vlaue 为选择下拉框里的属性值。
19、执行 JavaScript
Execute Javascript 关键字用于使用 JavaScript 代码,参数就是JavaScript 代码
20、声明变量
21、日志输出
22、验证
23、if分支语句
24、for循环语句