我自己是自动化测试的小菜鸟,接触这个领域不到 1 年时间,没有实践经验,目前的只在实习项目中学习到了一些相关知识。想通过写文章的方式归纳总结,让自己对这段时间的学习有一个沉淀。
官网的说明:
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:
在 Selenium 看来,WebDriver 的目的是提供一个使用简单、逻辑简洁的编程接口。WebDriver 官方的说明是:它是一个远程的控制接口,可以通过它控制我们的代理。它提供的是一个平台化的、独立于任何语言的线路协议(自行翻译的),可以通过这个协议远程控制 Web 浏览器的行为。它提供了一系列的接口可以用于发现和操作我们的 Web 文档中的 DOM 元素,从而控制用户代理(浏览器)的行为。
所以可以认为 WebDriver 提供了一套可以远程控制浏览器行为的线路协议(wire protocol),简单粗暴点就是遵循这个协议可以让浏览器运行测试脚本。
官网链接:https://www.w3.org/TR/webdriver/
Browser Driver 一般是一个 EXE(可执行)程序,或者浏览器的一个扩展程序,它使用 HTTP Server 持续监听 Selenium2 Commands。
各个浏览器的 Driver 可从这里下载:http://www.seleniumhq.org/download/
Selenium2 使用的是 Selenium WebDriver,其工作原理大致如下图所示:
具体的执行步骤如下:
PS:上述的所有操作都在同一个 Session(定义在这里https://www.w3.org/TR/webdriver/#sessions)中进行的;
协议规则指的是之前提到的WebDriver;
环境安装这里不做介绍,其实通过了解上述的 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 执行,具体的步骤如下:
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 的功能是:
常用的判断有:
另外,在自动化测试中经常用到的 —— Page Object Module,提倡以页面为单位进行元素管理和一些操作。它的好处是: