-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.html
355 lines (225 loc) · 12.7 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
<!DOCTYPE html>
<!--[if IEMobile 7 ]><html class="no-js iem7"><![endif]-->
<!--[if lt IE 9]><html class="no-js lte-ie8"><![endif]-->
<!--[if (gt IE 8)|(gt IEMobile 7)|!(IEMobile)|!(IE)]><!--><html class="no-js" lang="en"><!--<![endif]-->
<head>
<meta charset="utf-8">
<title>Selenium on Ruby - John Firebaugh</title>
<meta name="author" content="John Firebaugh">
<meta name="description" content="The state of Selenium on Ruby is a bit confusing. Among the top google results for
“selenium ruby” are several links that are badly out …">
<!-- http://t.co/dKP3o1e -->
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="canonical" href="http://jfirebaugh.github.com/blog/2010/12/22/selenium-on-ruby">
<link href="/favicon.png" rel="icon">
<link href="/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css">
<script src="/javascripts/modernizr-2.0.js"></script>
<script src="/javascripts/ender.js"></script>
<script src="/javascripts/octopress.js" type="text/javascript"></script>
<link href="/atom.xml" rel="alternate" title="John Firebaugh" type="application/atom+xml">
<!--Fonts from Google"s Web font directory at http://google.com/webfonts -->
<link href="http://fonts.googleapis.com/css?family=PT+Serif:regular,italic,bold,bolditalic" rel="stylesheet" type="text/css">
<link href="http://fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic" rel="stylesheet" type="text/css">
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-29668835-1']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
</head>
<body >
<header role="banner"><hgroup>
<h1><a href="/">John Firebaugh</a></h1>
<h2>Open Source, Ruby, Rubinius, RubySpec, Rails.</h2>
</hgroup>
</header>
<nav role="navigation"><ul class="subscription" data-subscription="rss">
<li><a href="/atom.xml" rel="subscribe-rss" title="subscribe via RSS">RSS</a></li>
</ul>
<form action="http://google.com/search" method="get">
<fieldset role="search">
<input type="hidden" name="q" value="site:jfirebaugh.github.com" />
<input class="search" type="text" name="q" results="0" placeholder="Search"/>
</fieldset>
</form>
<ul class="main-navigation">
<li><a href="/">Blog</a></li>
<li><a href="/blog/archives">Archives</a></li>
</ul>
</nav>
<div id="main">
<div id="content">
<div>
<article class="hentry" role="article">
<header>
<h1 class="entry-title">Selenium on Ruby</h1>
<p class="meta">
<time datetime="2010-12-22T00:00:00-05:00" pubdate data-updated="true">Dec 22<span>nd</span>, 2010</time>
</p>
</header>
<div class="entry-content"><p>The state of Selenium on Ruby is a bit confusing. Among the top google results for
<a href="http://www.google.com/search?q=selenium+ruby">“selenium ruby”</a> are several links that are badly out of date, and it’s
not clear which of the many <a href="http://rubygems.org/search?utf8=%E2%9C%93&amp;query=selenium">gems</a> are ones you would want
to use. This post aims to clear up some of the confusion.</p>
<p>First of all, you should be aware that there are two Selenium APIs: the original 1.0 API, called Selenium-RC, and a
newer 2.0 API called Selenium WebDriver. Internally, the two have quite different architectures. In a nutshell,
Selenium-RC is based around a Java “Remote Control” server process that launches the browser under test and manages
communication between the client process (the Ruby interpreter, in our case) and the browser. The browser is controlled
by injecting the “Selenium Core” JavaScript framework into the Browser’s built-in JavaScript interpreter. In contrast,
WebDriver requires no external process; the browser is launched directly, and controlled via means that vary from
browser to browser. For example, WebDriver controls Firefox via a custom Firefox extension.</p>
<p>Ruby has good support for both RC and WebDriver. The <a href="http://rubygems.org/gems/selenium-client">selenium-client</a> gem
(<a href="http://selenium-client.rubyforge.org/">docs</a>, <a href="https://github.com/ph7/selenium-client">source</a>) provides bindings for
the RC API, and the <a href="http://rubygems.org/gems/selenium-webdriver">selenium-webdriver</a> gem
(<a href="http://code.google.com/p/selenium/wiki/RubyBindings">wiki</a>,
<a href="http://selenium.googlecode.com/svn/trunk/docs/api/rb/index.html">docs</a>,
<a href="http://code.google.com/p/selenium/source/browse/#svn%2Ftrunk%2Frb">source</a>) provides bindings for the WebDriver API.
You will likely want to use one of these two gems, but which one? If you are using Selenium via a higher-level Ruby
library such as Webrat or Capybara, the choice will be made for you: Webrat uses selenium-client, Capybara uses
selenium-webdriver. If you want to access a Selenium API directly, I would generally recommend selenium-webdriver.
The WebDriver API provides several advantages, including multi-browser testing, page navigation, drag-and-drop, and
multi-frame and multi-window support. It recently released its
<a href="http://groups.google.com/group/selenium-users/browse_thread/thread/28ce2b37123a4e4d">first beta</a> and is where the
future of Selenium and Selenium on Ruby lies. It is, however, still beta software and sometimes changes its API in
aggravating ways. If stability is of paramount concern, stick with selenium-client.</p>
<p>You may find references to some other Selenium-related Ruby projects. The <a href="http://rubygems.org/gems/Selenium">Selenium</a>
gem (with a capital “S”) and its associated website <a href="http://selenium.rubyforge.org/">selenium.rubyforge.org</a> paved the
way for Selenium on Ruby, but today it is obsolete, as is the <a href="http://rubygems.org/gems/selenium-rails">selenium-rails</a>
gem which depends on it. Unfortunately they are still prominently featured in search results and on the
<a href="http://seleniumhq.org/projects/ruby/">outdated “Selenium on Ruby” page</a>, which doesn’t even mention selenium-webdriver.</p>
<p>The Selenium RC API relies on an external Java-based server process, and though the selenium-client gem provides rake
tasks to start and stop an RC server, it does not provide the actual jar file necessary to run the service. You can
either download and install it yourself, or install the <a href="http://rubygems.org/gems/selenium-rc">selenium-rc</a> gem, which
bundles it. You’ll sometimes see a gem that depends on selenium-client also depending on selenium-rc solely for the jar,
as the <a href="https://github.com/pivotal/jasmine-gem">jasmine</a> gem does. The selenium-rc gem has some Ruby code in it too, but
it more or less duplicates functionality that’s already part of selenium-client.</p>
<p>Finally there’s the <a href="http://rubygems.org/gems/selenium">selenium</a> and
<a href="http://rubygems.org/gems/selenium_remote_control">selenium_remote_control</a> gems, which provide functionality similar
to selenium-client and selenium-rc. They don’t seem widely used and at first glance I don’t see any reason to prefer
them to the more popular gems. Recent releases of the selenium-webdriver gem include the selenium-client code as well,
and personally, I hope that selenium-webdriver can usurp the “selenium” gem name and become the One True Selenium gem
for Ruby.</p>
</div>
<footer>
<p class="meta">
<span class="byline author vcard">Posted by <span class="fn">John Firebaugh</span></span>
<time datetime="2010-12-22T00:00:00-05:00" pubdate data-updated="true">Dec 22<span>nd</span>, 2010</time>
<span class="categories">
<a class='category' href='/blog/categories/ruby/'>Ruby</a>, <a class='category' href='/blog/categories/tools/'>Tools</a>
</span>
</p>
<div class="sharing">
<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://jfirebaugh.github.com/blog/2010/12/22/selenium-on-ruby/" data-via="jfire" data-counturl="http://jfirebaugh.github.com/blog/2010/12/22/selenium-on-ruby/" >Tweet</a>
</div>
<p class="meta">
<a class="basic-alignment right" href="/blog/2011/01/21/making-sense-of-constant-lookup-in-ruby/" title="Next Post: Making sense of constant lookup in Ruby">Making sense of constant lookup in Ruby »</a>
</p>
</footer>
</article>
<section>
<h1>Comments</h1>
<div id="disqus_thread" aria-live="polite"><noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
</div>
</section>
</div>
<aside class="sidebar">
<section>
<h1>Recent Posts</h1>
<ul id="recent_posts">
<li class="post">
<a href="/blog/2013/03/20/newless-javascript/">new-less JavaScript</a>
</li>
<li class="post">
<a href="/blog/2012/04/30/how-to-securely-bootstrap-json-in-a-rails-view/">How to securely bootstrap JSON in a Rails view</a>
</li>
<li class="post">
<a href="/blog/2012/04/19/why-ember-dot-js-doesnt-use-property-descriptors/">Why Ember.js doesn't use property descriptors</a>
</li>
<li class="post">
<a href="/blog/2012/03/07/code-archaeology-with-git/">Code Archaeology with Git</a>
</li>
<li class="post">
<a href="/blog/2012/03/02/xcode-4-dot-3-homebrew-and-ruby/">Xcode 4.3, homebrew, and Ruby</a>
</li>
</ul>
</section>
<section>
<h1>GitHub Repos</h1>
<ul id="gh_repos">
<li class="loading">Status updating...</li>
</ul>
<a href="https://github.com/jfirebaugh">@jfirebaugh</a> on GitHub
<script type="text/javascript">
$.domReady(function(){
if (!window.jXHR){
var jxhr = document.createElement('script');
jxhr.type = 'text/javascript';
jxhr.src = '/javascripts/libs/jXHR.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(jxhr, s);
}
var blacklist = [];
blacklist.push('dotfiles');
blacklist.push('jfirebaugh.github.com');
blacklist.push('matcha');
github.showRepos({
user: 'jfirebaugh',
count: 0,
skip_forks: true,
blacklist: blacklist,
target: '#gh_repos'
});
});
</script>
<script src="/javascripts/github.js" type="text/javascript"> </script>
</section>
<section>
<h1>Latest Tweets</h1>
<ul id="tweets">
<li class="loading">Status updating...</li>
</ul>
<script type="text/javascript">
$.domReady(function(){
getTwitterFeed("jfire", 4, false);
});
</script>
<script src="/javascripts/twitter.js" type="text/javascript"> </script>
<a href="http://twitter.com/jfire" class="twitter-follow-button" data-show-count="false">Follow @jfire</a>
</section>
</aside>
</div>
</div>
<footer role="contentinfo"><p>
Copyright © 2013 - John Firebaugh -
<span class="credit">Powered by <a href="http://octopress.org">Octopress</a></span>
</p>
</footer>
<script type="text/javascript">
var disqus_shortname = 'jfire-io';
// var disqus_developer = 1;
var disqus_identifier = 'http://jfirebaugh.github.com/blog/2010/12/22/selenium-on-ruby/';
var disqus_url = 'http://jfirebaugh.github.com/blog/2010/12/22/selenium-on-ruby/';
var disqus_script = 'embed.js';
(function () {
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
dsq.src = 'http://' + disqus_shortname + '.disqus.com/' + disqus_script;
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
}());
</script>
<script type="text/javascript">
(function(){
var twitterWidgets = document.createElement('script');
twitterWidgets.type = 'text/javascript';
twitterWidgets.async = true;
twitterWidgets.src = 'http://platform.twitter.com/widgets.js';
document.getElementsByTagName('head')[0].appendChild(twitterWidgets);
})();
</script>
</body>
</html>