Selenium2 框架概述

我自己是自动化测试的小菜鸟,接触这个领域不到1年时间,没有实践经验,目前的只在实习项目中学习到了一些相关知识。想通过写文章的方式归纳总结,让自己对这段时间的学习有一个沉淀。

【Selenium2简介】

官网的说明:
Selenium automates browsers. That’s it! What you do with that power is entirely up to you. Primarily, it is for automating web applications for testing purposes, but is certainly not limited to just that. Boring web-based administration tasks can (and should!) also be automated as well.
Selenium has the support of some of the largest browser vendors who have taken (or are taking) steps to make Selenium a native part of their browser. It is also the core technology in countless other browser automation tools, APIs and frameworks.
翻译过来是:
Selenium可以让浏览器自动执行各种Web应用。它目前主要用于Web端的自动化测试,但它并不仅仅局限于此。它还可以用于自动化管理基于Web的各种无聊费时的任务。
Selenium目前被一些使用广泛的浏览器厂商所支持,并作为功能的一部分加入到了浏览器中。它也是无数其他测试工具、API和框架的核心技术支撑。

PS

  1. Selenuim2集成了WebDriver API,而且目前基本上主流浏览器(Chrome/Firefox/Opera/IE)都支持WebDriver API,并且提供了相应的WebDriver工具,所以“Selenium目前被一些使用广泛的浏览器厂商所支持”还是很有说服力的。
  2. 我自己去看了下国内外的许多自动化测试平台,包括BAT各自的测试平台、Sauce Labs,他们Web端都支持Selenium测试脚本。

【WebDriver】

在Selenium看来,WebDriver的目的是提供一个使用简单、逻辑简洁的编程接口。WebDriver官方的说明是:它是一个远程的控制接口,可以通过它控制我们的代理。它提供的是一个平台化的、独立于任何语言的线路协议(自行翻译的),可以通过这个协议远程控制Web浏览器的行为。它提供了一系列的接口可以用于发现和操作我们的Web文档中的DOM元素,从而控制用户代理(浏览器)的行为。
所以可以认为WebDriver提供了一套可以远程控制浏览器行为的线路协议(wire protocol),简单粗暴点就是遵循这个协议可以让浏览器运行测试脚本。
官网链接:https://www.w3.org/TR/webdriver/

【Browser Driver】

Browser Driver一般是一个EXE(可执行)程序,或者浏览器的一个扩展程序,它使用HTTP Server持续监听Selenium2 Commands。
各个浏览器的Driver可从这里下载:http://www.seleniumhq.org/download/

【Selenium2工作原理】

Selenium2使用的是Selenium WebDriver,其工作原理大致如下图所示:

具体的执行步骤如下:

  1. 每个Selenium命令,这里指的是所谓的基础操作,例如,点击、输入等,都会创建一条HTTP请求,发送给Browser WebDriver
  2. Browser WebDriver使用一个HTTP Server监听和接收HTTP请求
  3. HTTP Server根据协议规则定义这些Selenium命令对应的浏览器具体操作
  4. 浏览器执行这些操作
  5. 浏览器将执行状态返回给HTTP Server
  6. HTTP Server再将这些状态信息返回给自动化脚本

PS:上述的所有操作都在同一个Session(定义在这里https://www.w3.org/TR/webdriver/#sessions)中进行的;
协议规则指的是之前提到的WebDriver

【Selenium2工作过程】

环境安装这里不做介绍,其实通过了解上述的Selenium2工作原理会对环境安装有进一步的理解。
Selenium2脚本编写语言支持:Java/C#/Python/Ruby/PHP/Perl/JavaScript,选择自己喜欢的语言即可,我比较喜欢Java和Python。
下面的是一个Python编写的自动化脚本实例:

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

driver = webdriver.Chrome()
driver.get("http://www.python.org")
assert "Python" in driver.title
elem = driver.find_element_by_name("q")
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
assert "No result found." not in driver.page_source
driver.close()

上述的Selenium Commands模拟的是用户对浏览器的一系列操作,这些操作通过Browser Driver执行,具体的步骤如下:

  1. selenium.webdriver模型提供了所有浏览器的WebDriver支持。Keys类提供了键盘响应事件,例如:RETURN,F1,ALT这些
  2. 实例化一个Chrome WebDriver
  3. 打开网址:http://www.python.org
  4. 判断页面的Title中应该包含字符串“Python”,不包含报错
  5. 获取搜索输入框
  6. 输入字符串“pycon”
  7. 按下键盘的RETURN键
  8. 判断页面的document资源里没有字符串“No result found.”,有报错
  9. 关闭浏览器,关闭Chrome WebDriver

Selenium WebDriver涉及的操作我做了如下归类:

如果你懂JS,那么直接执行JS代码是最有效的。WebDriver执行Selenium Command调用的是浏览器内置的自动化支持功能
等待操作在实际使用过程中经常被用到,在操作某个对象之前,我们往往要等到该对象在页面中加载完成,这里我们用wait until来实现。

wait = ui.WebDriverWait(dr, 10)
wait.until(lambda dr: dr.find_element_by_class_name('label').is_displayed())

这里wait.until的功能是:

  • until方法会一直等下去,直到代码中的内容为true(不为false或没有抛出异常)
  • 或者超时(这里指等待时间超过10s)

常用的判断有:

  • title_is
  • title_contains
  • presence_of_element_located
  • visibility_of_element_located
  • visibility_of
  • presence_of_all_elements_located
  • text_to_be_present_in_element
  • text_to_be_present_in_element_value
  • frame_to_be_available_and_switch_to_it
  • invisibility_of_element_located
  • element_to_be_clickable – it is Displayed and Enabled.
  • staleness_of
  • element_to_be_selected
  • element_located_to_be_selected
  • element_selection_state_to_be
  • element_located_selection_state_to_be
  • alert_is_present

另外,在自动化测试中经常用到的 —— Page Object Module,提倡以页面为单位进行元素管理和一些操作。它的好处是:

  • 代码可重用性高
  • 减少冗余代码
  • 可维护性高