这篇主要介绍Selenium WebDriver详细的工作过程,介绍到通信层,Browser Driver的工作原理不去做深入探究。
从上一篇的一个自动化脚本实例开始:
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 Command都会创建一个带有Path的HTTP request。
当自动化脚本执行的时候,第一个HTTP request会创建一个新的Session,接下来对浏览器的操作将通过这个Session来执行。
创建的Session ID将用于标识后续的自动化脚本都在同一个Session中执行。
###创建一个新的Session
HTTP Method | URI Template |
---|---|
POST | /session |
JSON参数:
- 一个自定义的session的配置对象
- 一个默认的session的配置对象 **返回值:**
- 一个描述当前session配置的对象
下面通过几个具体的例子介绍HTTP request的具体内容:
###HTTP request类型
HTTP request的类型是GET或者POST
GET request
通常是一些查询命令,用于获取页面中Web元素的信息,例如:**
- text
- get_attribute(name)
- is_displayed()
- is_selected()
以检查一个元素是否已在当前页面中加载成功 —— is_displayed()为例
HTTP Method URI Template GET /session/{session id}/element/{id}/displayed URI参数:
- {*session id*} :Session ID 用于标识接收这条命令的Session
- {*id*}:元素的id,标识执行这条命令的元素 **返回值:**
- boolean类型,加载成功返回true,加载失败返回false
####POST request
通常是一些操作命令,用于Web元素的交互操作,例如:- click()
- find_element_by_id(id)
- find_elements_by_id(id)
以点击一个元素 —— element.click()为例
HTTP Method URI Template POST /session/{session id}/element/{id}/click URI参数:
- {*session id*} :Session ID 用于标识接收这条命令的Session
- {*id*}:元素的id,标识执行这条命令的元素 **返回值:**
- 元素对应的JSON对象
###HTTP request参数
URI参数(上述例子中已经提到过)
- {*session id*} :Session ID 用于标识接收这条命令的Session
- {*id*}:元素的id,标识执行这条命令的元素 **JSON参数**
这里说明下JSON参数,以获取一个元素为例 —— find_element
HTTP Method URI Template POST /session/{session id}/element 这里有URL参数{session id}
JSON参数:- **using** - {string} 定位策略
- **value** - {stirng} 对应的目标值
一个使用XPath策略获取元素的python脚本写法:
login_form = driver.find_element_by_xpath("//form[@id='loginForm']")
可用的策略有:
State Keyword CSS selector “css selector” Link text selector “link text” Partial link text selector “partial link text” XPath “xpath”
###HTTP request返回值
- 一个普通值类型
- 一个JSON对象
####普通值类型
以获取当前页面的标题 —— driver.title为例
| HTTP Method | URI Template |
| -------- | :----- |
| POST | /session/{session id}/title |
返回值是:一个{string} —— 当前页面的Title属性的值
####JSON对象
以上述的获取一个元素 —— find_element为例
返回值是:目标位置的一个WebElement JSON对象
###【Browser Driver】
Browser Driver一般是一个EXE(可执行)程序,或者浏览器的扩展程序,它使用HTTP Server持续监听Selenium2 Commands,其主要功能:- 从客户端(执行自动化脚本的计算机)接收HTTP request
- 确定Selenium Commands对应的用户操作
- 发送操作信息到浏览器
- 获取浏览器返回的执行状态信息
- 发送执行状态信息到客户端
这里说明下“Selenium Commands对应的用户操作”具体的内容,以driver.title(获取页面标题)为例:
HTTP Method URI Template POST /session/{session id}/title 返回的是页面Document的top-level browsing context的title,等同于调用window.top.document.title。 这个过程中Remote End(Driver的Server)对HTTP request做出响应的执行步骤是: - 如果当前的top-level browsing context是未打开状态,返回相应的错误代码和错误信息
- 处理用户提示,如果是一个错误提示,则返回它的提示内容
- 将当前top-level browsing context中激活状态页面的Title值赋值给title
- 将数据处理成JSON对象
- 将title的值赋给“value”
- 返回执行成功标志和数据