Selenium Selenium2 框架概述

longmazhanfeng · 2016年05月04日 · 最后由 yunbin_7 回复于 2016年11月04日 · 3237 次阅读

我自己是自动化测试的小菜鸟,接触这个领域不到 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,提倡以页面为单位进行元素管理和一些操作。它的好处是:

  • 代码可重用性高
  • 减少冗余代码
  • 可维护性高
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 17 条回复 时间 点赞

好贴,我们目前用的就是 Selenium,在 IE/火狐/Google 浏览器下的自动化测试。

这些 Selenium Command 最后到浏览器执行的时候都是变成 JS 代码执行的

selenium 1 是这样。不过有些东西 js 做不到,所以 selenium 2 里面已经不是这样的。

#3 楼 @chenhengjie123 哦哦,我也是之前看 Selenium1 的时候产生的这种想法,果然是不对的

#4 楼 @longmazhanfeng selenium 官网有它的历史,建议看看,这样能把 selenium1 和 selenium2 串起来

不错的文章,对初学者来说,很好

#5 楼 @chenhengjie123 最简单的 结合起来,就是用 webdriver + grid + jenkins 实现分布式持续集成

#6 楼 @love_test_home 谢谢,这是我第一次写东西,内心还是很忐忑~

curl 也可以 web 自动化

#9 楼 @carl 不知道 curl 的原理符不符合 UI 自动化的要求

#9 楼 @carl 感觉是大神用的工具,好强大

#9 楼 @carl 哈哈,只要能和 webdriver 的 http server 通讯,用啥工具都没问题。

#10 楼 @longmazhanfeng
curl 不是 ui 自动化吧,你可以在慕课网上找到 curl 的视频,自学。

#11 楼 @longmazhanfeng
curl 应该也可以做 ui 自动化,不过它没有 selenium 那种直接 get element 的语句,需要自己解析 html

curl + sed + awk 简直要逆天

请问,有最新的 selenium 3.0 的下载地址吗?

longmazhanfeng Selenium WebDriver 详细介绍 中提及了此贴 02月04日 14:22
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册