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:\Python37\Lib\site-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循环语句

Appium、selenium与Robot Framework的更多相关文章

  1. Robot Framework+appium集成安装

    appium(中文教程,源码)是一款开源跨平台测试自动化工具,用于测试原生.移动web和混合应用,支持 iOS, Android和FirefoxOS平台. appium集成以下框架驱动自动化测试: i ...

  2. 搭建jenkins+python+selenium+robot framework环境

    1.安装jenkins 具体参考:https://www.cnblogs.com/dydxw/p/10538103.html 2.下载插件 我是为了方便,把有关python.selenium.robo ...

  3. Robot Framework和Selenium简介

    1.1  RF简介 Robot Framework是一款python编写的功能自动化测试框架.具备良好的可扩展性,支持关键字驱动,可以同时测试多种类型的客户端或者接口,可以进行分布式测试执行.主要用于 ...

  4. Robot Framework + Selenium2Library环境下,结合Selenium Grid实施分布式自动化测试

    最近一段时间,公司在推行自动化测试流程,本人有幸参与了自定义通用控件的关键字封装和脚本辅助编写.数据驱动管理.测试用例执行管理等一系列工具软件的研发工作,积累了一些经验,在此与大家做一下分享,也算是做 ...

  5. Robot framework + appium环境搭建

    Robot framework+appium环境搭建 首先梳理一下要用到的工具和安装包: 1. Android + JAVA. jdk : http://www.oracle.com/technetw ...

  6. 【Robot Framework】robot framework 学习以及selenium、appnium、requests实践(一)

    话说之前自己写了个selenium的自动化框架,然后又研究了下RF,觉得RF这种基于关键字驱动的框架更为容易上手,当然在做一些比较繁琐的验证时,似乎还不是太灵活,不如自己写几行python来的实惠(也 ...

  7. Robot Framework自动化测试(三)---Selenium API

    Robot  Framework  Selenium  API 说明: 此文档只是将最常用的UI 操作列出.更多方法请查找selenium 关键字库. 一.浏览器驱动 通过不同的浏览器执行脚本. Op ...

  8. Robot Framework + Selenium library + IEDriver环境搭建

    转载:https://www.cnblogs.com/Ming8006/p/4998492.html#c.d 目录: 1 安装文件准备2 Robot框架结构3 环境搭建  3.1 安装Python  ...

  9. Robot Framework自动化测试---Selenium API

    一.浏览器驱动 通过不同的浏览器执行脚本. Open Browser Htpp://www.xxx.com chrome 浏览器对应的关键字: firefox FireFox ff internete ...

随机推荐

  1. Java之Servlet文件下载20190228

    jsp页面: <%@ page language="java" contentType="text/html; charset=utf-8" pageEn ...

  2. kafka可视化客户端工具(Kafka Tool)安装

    参考:https://www.cnblogs.com/frankdeng/p/9452982.html

  3. 如何手写一款KOA的中间件来实现断点续传

    本文实现的断点续传只是我对断点续传的一个理解.其中有很多不完善的地方,仅仅是记录了一个我对断点续传一个实现过程.大家应该也会发现我用的都是一些H5的api,老得浏览器不会支持,以及我并未将跨域考虑入内 ...

  4. swiper 3D 覆盖流的使用方法

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...

  5. CF919F A Game With Numbers

    题目:(luogu翻译错的很多) Alice和Bob玩游戏,每人有8张牌,牌的值为0~4.每一轮当前玩家选择自己的牌A和对手的牌B,然后将A的值变为( A + B )%5,其中A和B都不是0. 当一个 ...

  6. 代理模式精讲(手写JDK动态代理)

    代理模式是一种架构型模式,表现出来就是一个类代表另一个类的功能,一般用在想对访问一个类的时候做一些控制,同时又不想影响正常的业务,这种代理模式在现实的生活中应用的也非常的广泛,我用穷举法给举几个好理解 ...

  7. Delphi 正则表达式 TPerlRegEx 类

    抄自:万一的博客 http://www.cnblogs.com/del/category/113551.html 目录: 基本方法 查找(目标字符串及其属性) 字表达式 限定匹配范围:start.st ...

  8. vue项目编译配置 用于结合Django项目

  9. LeetCode(4)Median of Two Sorted Arrays

    题目 There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the ...

  10. LeetCode 123. Best Time to Buy and Sell Stock III (stock problem)

    Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...