前言


在最初的时候, Selenium RC 是支持 Safari 的。那个时候生活很美好,浏览器也就三种。

alt text

到了 WebDriver 时代, 浏览器多了许多种,WebDriver 几乎都提供了支持, 只有 Safari 由于技术限制未能支持,只能使用 SeleneseCommandExecutor 模拟。

而随着某水果公司越来越火热,Safari 浏览器有一举摆脱小众浏览器的趋势,而基于 Safari 的自动化需求也日益增多。于是可以看到 google group 里,每天总有人问, 什么时候才能支持 Safari 啊。那个时候, Selenium 的 trunk 里面已经有了 SafariDriver, 那段时间,每天会去关注下进度。但是大佬们都很忙, 进度不快, 时间久了,我也不关注了。

直到最近又去逛了 Watir WebDriver, 才发现原来 SafariDriver 已经可以使用了。于是二话不说,开始试用。

成为 Safari 开发者


1. 注册 Safari 开发者

由于 SafariDriver 的实现是基于 Safari 的插件模式。所以首先,作为用户要成为 Apple Safari 的开发者。别紧张,这是免费的。

加入 Safari 开发者计划, 打开可以看见如下页面,

alt text

看到没,免费!下面的就是一般的注册了,如果你有 Apple ID 的话,就使用 Apple ID。

2. 创建 Safari 开发证书

使用上面注册好的 ID 登陆之后, 可以看到登录名右下 Safari Developer Program,如图,

alt text

点击 Get Started 进入 Developer Certificate Utility 页面,

alt text

点击 Create Certificates, 然后 Add Certificate,会弹出一个对话框。

alt text

按照说明,Applications -》Utilities -》Keychain Access

alt text

点击 Keychain Access 之后, 钥匙串访问 -》证书助理 -》打开

alt text

打开之后,在选项里面, 选择向现有的 CA 请求证书(Request a Certificate from a Certificate Authority),

alt text

然后,下一步里填写详细信息,如图,红色必填,并保存到本地。

alt text

于是, 你就得到了 CertificateSigningRequest.certSigningRequest。这个文件就是我们要提交给 Apple 的。接着 Add Certificate 弹出的对话框之后,点击 Continue 后,弹出提交对话框。

alt text

选择我们之前保存到本地的代码即可,提交之后,点击生成,随后就会自动下载一个 safari_extension.cer 文件,双击就可以导入。

至此你就完成了注册 Safari 开发者的过程。

下载编译 SafariDriver


获取代码:(等很久哟~)

svn co http://selenium.googlecode.com/svn/trunk selenium

编译代码:

cd selenium
./go safari

编译好之后,插件就已经好了。下面就安装插件。

alt text

开始使用吧!


因为 Watir 的关系,所以首先试用了一把 Watir-Webdriver, 很不幸,失败。

require 'watir-webdriver'
browser = Watir::Browser.new :safari

在初始化的时候,就出错了。尽管 Safari 是打开了, 但是 browser 实例并没有返回,抛出一下错误:

Selenium::WebDriver::Error::WebDriverError: Not a valid request: GET /wd HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: 127.0.0.1:57025
Origin: safari-extension://org.openqa.selenium-bhbmw88jea
Sec-WebSocket-Key: +KNGjjyVr1fbshljNIq8cQ==
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: x-webkit-deflate-frame

from /Users/lihuazhang/.rvm/gems/ruby-1.9.3-p194/gems/selenium-webdriver-2.25.0/lib/selenium/webdriver/safari/server.rb:123:in process_handshake'
from /Users/lihuazhang/.rvm/gems/ruby-1.9.3-p194/gems/selenium-webdriver-2.25.0/lib/selenium/webdriver/safari/server.rb:66:in
wait_for_connection'
from /Users/lihuazhang/.rvm/gems/ruby-1.9.3-p194/gems/selenium-webdriver-2.25.0/lib/selenium/webdriver/safari/bridge.rb:21:in initialize'
from /Users/lihuazhang/.rvm/gems/ruby-1.9.3-p194/gems/selenium-webdriver-2.25.0/lib/selenium/webdriver/common/driver.rb:45:in
new'
from /Users/lihuazhang/.rvm/gems/ruby-1.9.3-p194/gems/selenium-webdriver-2.25.0/lib/selenium/webdriver/common/driver.rb:45:in for'
from /Users/lihuazhang/.rvm/gems/ruby-1.9.3-p194/gems/selenium-webdriver-2.25.0/lib/selenium/webdriver.rb:65:in
for'
from /Users/lihuazhang/.rvm/gems/ruby-1.9.3-p194/gems/watir-webdriver-0.6.1/lib/watir-webdriver/browser.rb:35:in initialize'
from (irb):4:in
new'
from (irb):4
from /Users/lihuazhang/.rvm/rubies/ruby-1.9.3-p194/bin/irb:16:in `

'

似乎没有好的解决方法, 有人提出他利用老的 WebDriver 版本成功了,但是什么版本没有下文。

于是,我试验了下 JAVA 版本。来自官方的例子,略作修改。


package org.testchina.test;

import static org.junit.Assume.assumeTrue;

import org.openqa.selenium.By;
import org.openqa.selenium.Platform;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.safari.SafariDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

@RunWith(JUnit4.class)
public class SafariDriverTests {

  private WebDriver driver = null;

  private static boolean isSupportedPlatform() {
    Platform current = Platform.getCurrent();
    return Platform.MAC.is(current) || Platform.WINDOWS.is(current);
  }

  @Before
  public void createDriver() {
    assumeTrue(isSupportedPlatform());
    driver = new SafariDriver();
  }

  @After
  public void quitDriver() {
//    driver.quit();
  }

  @Test
  public void shouldBeAbleToPerformAGoogleSearch() {
    driver.get("http://www.google.com/ncr");
    driver.findElement(By.name("q")).sendKeys("webdriver");
    driver.findElement(By.name("btnG")).click();
    new WebDriverWait(driver, 3)
        .until(ExpectedConditions.titleIs("webdriver - Google Search"));
  }
}

很开心的看见 Junit4 的绿条。至此, SafariDriver 就可以开始正式使用了。大家自己试试吧。

Notes


本篇文章所涉及的环境是:

Safari 插件的安装过程还是稍显繁琐, SafariDriver 也不是很成熟,比如 ruby 下还不能使用。当然还有一些别的问题, 比如:

这些是别人总结的,还未有验证。总之,有总比没有好,希望会越做越好。

参考:



↙↙↙阅读原文可查看相关链接,并与作者交流