基于Selenium+PhantomJS模拟浏览器访问

介绍

Selenium

Selenium 是一个Web应用自动化测试工具集,可以在多个浏览器平台上执行测试用例。

Selenium包含以下几个工具:

  1. Selenium 1 (Selenium RC or Remote Control):Selenium 1的核心是一个JavaScript库,通过该库可以和浏览器中的页面进行交互。Selenium RC基于该库,可以使用多种语言开发测试用例,在多个浏览器平台上执行测试用例。
  2. Selenium 2 (Selenium WebDriver):Selenium 1基于JavaScript库,因此受限于浏览器对于JavaScript的安全限制,Selenium 1对于浏览器中的页面交互也存在着很多限制。Selenium 2基于WebDriver,而WebDriver基于浏览器和操作系统提供的原生方法,因此Selenium 2可以直接操作浏览器,避免了JavaScript的安全限制。Selenium 2也可以使用多种语言开发测试用例,在多个浏览器平台上执行测试用例。
  3. Selenium IDE:Selenium IDE是一个FireFox插件,可以记录用户操作并导出成可重复执行的脚本。
  4. Selenium-Grid:Selenium-Grid可以用来扩展Selenium RC,例如可以在不同的机器上并行执行测试用例。

由于存在较多限制,已不推荐使用Selenium RC,而推荐使用Selenium WebDriver。Selenium WebDriver支持的浏览器有:

  1. Google Chrome;
  2. Internet Explorer 6, 7, 8, 9, 10;
  3. Firefox;
  4. Safari;
  5. Opera;
  6. HtmlUnit;
  7. PhantomJS;
  8. Android;
  9. iOS。

PhantomJS

PhantomJS 是一个基于WebKit的JavaScript API,它原生支持各种Web标准,例如DOM解析、CSS选择器、JSON、Canvas、SVG等。PhantomJS可用于:

  1. 无GUI浏览器下的Web站点测试;
  2. 网页截屏;
  3. 基于DOM API访问和操作网页;
  4. 监控网页加载。

安装

Selenium

Selenium支持的语言有:

  1. Java;
  2. C#;
  3. Python;
  4. Ruby;
  5. PHP;
  6. Perl;
  7. JavaScript。

这里介绍Python Selenium包的安装。操作系统为Linux,并已安装Python 2.7.5和pip,直接使用pip安装Selenium:

pip install selenium

PhantomJS

下载PhantomJS的可执行包phantomjs-1.9.8-linux-x86_64.bz2,解压后将bin/phantomjs拷贝至/bin下即可。Shell中输入phantomjs可打开REPL,也可以使用phantomjs执行代码文件:

phantomjs hello.js

hello.js代码如下所示:

1
2
console.log('Hello, world!');
phantom.exit();

应用

基于Selenium+PhantomJS模拟浏览器访问网页,输入用户名和密码并点击登录按钮,网页HTML代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
<tr>
<td>用户名:</td>
<td><input type="text" id="username" placeholder="用户名"></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" id="password" placeholder="密码"></td>
</tr>
<tr>
<td colspan="2"><button id="logon">登录</button></td>
</tr>

Python代码如下所示:

1
2
3
4
5
6
7
8
9
10
# -*- coding: utf-8 -*-

from selenium import webdriver

driver = webdriver.PhantomJS()
driver.set_page_load_timeout(300)
driver.get('http://xxx.xxx.xxx.xxx/login.html')
driver.find_element_by_id('username').send_keys(u'username')
driver.find_element_by_id('password').send_keys(u'password')
driver.find_element_by_id('logon').click()