7.2 Airtest-Selenium

第1章的”web自动化测试”中已经详细介绍了Airtest-IDE中selenium插件的使用。这部分文档将主要介绍Airtest-Selenium测试框架的结构以及一些api的使用。

7.2.1 selenium介绍

Airtest-Selenium是基于selenium语法的,因此这一章先对selenium框架进行简要的语法介绍(对selenium比较了解的同学可以跳过本小节)。

selenium实例详解

通过一个简单的例子来看看selenium的工作方式,案例内容:打开python官网,进行搜索

from selenium.webdriver import Chrome
from selenium.webdriver.common.keys import Keys

driver = Chrome()
driver.get("http://www.python.org")
elem = driver.find_element_by_name("q")
elem.send_keys("pycon")
elem.send_keys(Keys.ENTER)
driver.close()

以下将对上面的selenium案例进行逐句分析:

from selenium.webdriver import Chrome
from selenium.webdriver.common.keys import Keys

selenium.webdriver 模块提供了所有WebDriver的实现, 当前支持的WebDriver有: Firefox, Chrome, IE and Remote。 Keys类提供键盘按键的支持,比如:ENTER/F1/ALT

driver = Chrome()

创建一个Chrome WebDriver的实例,运行到这里,会打开一个chrome浏览器。

driver.get("http://www.python.org")

driver.get 方法将打开URL中填写的地址,WebDriver 将等待, 直到页面完全加载完毕(其实是等到onload方法执行完毕),然后返回继续执行你的脚本。

elem = driver.find_element_by_name("q")

WebDriver 提供了大量的方法让你去查询页面中的Dom元素,这些方法形如: find_element_by_*。 例如:包含 name 属性的input输入框可以通过 find_element_by_name方法查找到,而寻找元素也是selenium的核心,同时也是下文中介绍的录制工作中核心要解决的问题。

elem.send_keys("pycon")
elem.send_keys(Keys.ENTER)

这两行代码发送了一个关键字,send_keys的作用类似于你用键盘输入关键字。 特殊的按键可以使用Keys类来输入,该类继承自 selenium.webdriver.common.keys。

driver.close()

最后,关闭浏览器窗口,你还可以使用quit方法代替close方法, quit将关闭整个浏览器,而_close——只会关闭一个标签页, 如果你只打开了一个标签页,大多数浏览器的默认行为是关闭浏览器。

通过上述简单的例子了解selenium的工作方式,它是先定位到当前的dom树中需要操作的页面元素,然后对其进行用户模拟操作,如点击、输入等等。

7.2.2 Airtest-Selenium框架

Airtest-Selenium是对selenium的python库做的一层封装:

  • 添加了部分图像识别的接口;
  • 多标签页的切换接口也进行了对应api封装;
  • 核心api运行时会自动进行log记录,可以生成网页版测试报告。

图像识别接口

airtest_module

Airtest-Selenium对图像识别的封装有两个接口,图像识别点击和图像识别断言。这两个接口是基于Airtest框架的图像识别封装,如果图像脚本运行时在网页中找不到对应图像,会抛出Target not found on screen的异常。

多标签页录制

selenium提供了切换标签页的接口。

driver.switch_to.window(driver.window_handles[number])

这个语句执行后,可以切换到第number个打开的标签页。这个对于用户来说,不是那么好理解与编写,因为这样需要记着标签打开的顺序。而大部分时候,切换标签只有在打开新窗口,切到最新标签,以及关闭便签页,回到上一个标签。因此,Airtset-Selenium封装了两个接口:

driver.switch_to_new_tab()
driver.switch_to_previous_tab()

在这个接口内部,Airtest-Selenium维护了标签页的组织结构。用户只需在打开新标签页时,调用switch_to_new_tab。 另外在结束当前标签页时,回到上一个标签页时,调用switch_to_previous_tab()即可,不再需要去考虑当前是第几个这样之类的问题。

报告模块

3_report

被Airtest-Selenium封装的接口,运行过后都会生成对应的报告。

IDE外命令行生成报告指令(需要本地有airtest库以及airtest-selenium仓库),可以参考airtest文档。注意需要在命令行最后加入参数--plugin airtest_selenium.report

7.2.3 如何用命令行运行Airtest-Selenium

与运行airtest脚本方式相同,不过更简便,不需要指定–device:

>python -m airtest run untitled.air

注意:需要从Airtest-IDE的根目录将airtest_selenium拷出来放在python路径中(暂未开源。开源后,可以通过pip直接下载)

Mac的根目录在/Application/AirtestIDE.app/Contents/MacOS

7.2.4 Airtest-Selenium的api

本节内容是Airtest-Selenium封装的api,import方式在Airtest-IDE的初始化代码中就有。

from airtest_selenium.proxy import WebChrome

proxy api

class WebDriver(executable_path="chromedriver", port=0, options=None, service_args=None,desired_capabilities=None, service_log_path=None,chrome_options=None)

基类: selenium.webdriver.Chrome

loop_find_element(func, text, timeout=10, interval=0):
Loop to find the target web element by func.
- 参数: · func - function to find element
        · text - param of function
        · timeout - time to find the element
        · interval - interval between operation
- 返回: element that been found
find_element_by_xpath(xpath)
Find the web element by xpath.
- 参数: xpath - find the element by xpath. 
- 返回: Web element of current page.
find_element_by_id(id)
Find the web element by id.
- 参数: id - find the element by attribute id.
- 返回: Web element of current page.
find_element_by_name()
Find the web element by name.
- 参数: name - find the element by attribute name.
- 返回: Web element of current page.
switch_to_new_tab()
Switch to the new tab.
switch_to_previous_tab()
Switch to the previous tab(which to open current tab).
airtest_touch(v)
Perform the touch action on the current page by image identification.

- 参数: v – target to touch, either a Template instance or absolute coordinates (x, y)
- 返回: Finial position to be clicked.
assert_template(v)
Assert target exists on the current page.

- 参数: v – target to touch, either a Template instance
- 引发: AssertionError - if target not found.
- 返回: Position of the template.
assert_exist(param, operation)
Assert element exist.
- 参数: · operation - the method that to find the element.
        · param - the param of method.
- 引发: AssertionError - if assertion failed.
get(address)
Access the web address.
- 参数: address - the address that to accesss.
back()
Back to last page.
forward()
Forward to next page.   
snapshot(filename=None)
Snapshot current page.

- 参数: filename - the snapshot path.

更多api

因为Airtest-Selenium driver是继承的Selenium driver,因此selenium的api是可以直接使用的。相关api可以参见selenium文档