Selenium WebDriver 详细介绍
这篇主要介绍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”
返回执行成功标志和数据
:victory:
页:
[1]