Selenium Selenium WebDriver 详细介绍

longmazhanfeng · 2016年05月10日 · 最后由 longmazhanfeng 回复于 2016年05月11日 · 1709 次阅读

这篇主要介绍 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 做出响应的执行步骤是:

  1. 如果当前的 top-level browsing context 是未打开状态,返回相应的错误代码和错误信息
  2. 处理用户提示,如果是一个错误提示,则返回它的提示内容
  3. 将当前 top-level browsing context 中激活状态页面的 Title 值赋值给 title
  4. 将数据处理成 JSON 对象
  5. 将 title 的值赋给 “value”
  6. 返回执行成功标志和数据
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册