This is the multi-page printable view of this section. Click here to print.

Return to the regular view of this page.

Blog Posts - 2012

A Smattering of Selenium #132

2.27.0 is now out which means you can close the browser tab that points to the old Firefox installers.

2.27.0 is now out which means you can close the browser tab that points to the old Firefox installers.

A Smattering of Selenium #131

Not sure how widely broadcast this has been…

Not sure how widely broadcast this has been (cus, you know, we’re good at communicating and stuff), but if you are using 2.26.0 and Firefox 17 you will get a nasty bug. 2.27.0 is in the works to address this (and a couple other things…) so if you need FF right now, keep your install at the latest 16 release.

A Smattering of Selenium #130

Can’t get enough Se bloggage?

Can’t get enough Se bloggage? Have a look at Overview of Selenium Blogs — though I must say there has to be something wrong with the Alexa algorithm if I am that far down the list. And behind both David and Alister. 🙂

A Smattering of Selenium #129

A hardy welcome back to work to our American friends who spent Thursday being thankful for what they had, then getting into fist fights at stores for things they thought they didn’t need the next day.

A hardy welcome back to work to our American friends who spent Thursday being thankful for what they had, then getting into fist fights at stores for things they thought they didn’t need the next day.

A Smattering of Selenium #128

…as I avoid writing code that deals with dynamically constructed tables.

…as I avoid writing code that deals with dynamically constructed tables. Without any sort of unique locator. Of course.

A Smattering of Selenium #127

Within an hour I had some more things to add to the last Smattering.

Within an hour I had some more things to add to the last Smattering. Oh well, I’ll just save them up…

  • Har-assert looks like something useful to include in your project if you are using Java. And the browsermob-proxy (which of course, you all are)
  • Web Content Accessibility Guidelines (WCAG) 2.0 seems like something more people should care about.
  • Right. Here is another cool part of the nebulous, meaningless thing called HTML5. Using the PageVisibility API. Anyone want to take bets on how long this gets used for evil rather than awesome?
  • JUnit 4.11 is out. The link is to the release notes. The ‘test execution order’ stuff seems like bowing to pressure rather than good test design…
  • Why Averages Suck and Percentiles are Great is your monthly statistics lesson.
  • Alright, here is the challenge for everyone who wants to get involved in the project but is afraid they cannot code well enough. (If I can code well enough, so can you…) The docs can always use more people! And then we should get !se to work on via DuckDuckHack.
  • Test::Page is another helper for making Page Objects in Ruby
  • The first item in An impassioned plea to other Start-up founders to use automated tests is the only one that really holds any water. The rest, well, is showing the author’s developer bias I think. (The rest of his blog seems pretty good as well.)
  • RainbowDriver looks interesting. Though after the flurry around the Mobile Test Summit there seems to be no more commits…
  • The Shumway Open SWF Runtime Project Not sure how I feel about Shumway. On one hand, open is better than closed, but from an automation perspective, SWF is a pain

A Smattering of Selenium #126

I’ve been threatening that I was going to do this for awhile…

I’ve been threatening that I was going to do this for awhile…

  • What it feels like when you are running a long running batch of scripts…
  • Remember kids, your script cannot adapt to the unexpected…
  • But on occasion they can do something that…
  • Oh! Here’s a useful metric of productivity!
  • And just when you thought you were doing something without anyone paying attention…
  • Unfortunately what a lot of automation is like…
  • Or how about when you are writing code against the wrong environment…
  • How writing tests for a testing framework feels…
  • has too many to link to individually

A Smattering of Selenium #125

Right…

Right…

  • Scripting batch 1: waiting for an email
  • Scripting batch 2: waiting for an email
  • Scripting batch 3: waiting for an email
  • Scripting batch 4: waiting for an email

Perhaps I’ll do something else right now…

  • Alright kids, its not the Olympics, but Curvy would be a fun app for someone to automate.
  • Wow that was fast. Øredev has started to publish the videos from this year’s conference. Lots of good things in there.
  • The right tool for the job! is one of my favourite rants. And one that catches people off guard when I mention it — ‘but you are a selenium consultant’…
  • Mobile apps still need automated tests. Yup. Of course, its not like the OS vendors are helping their developers to do this. Actively hindering them is more like it…
  • On Being A Senior Engineer. Somewhere, a newly minted ‘Senior QA Developer’ fresh out of school is having a bit of a cry…
  • Right. So how would Composition over inheritance affect the Page Object pattern. Or perhaps not affect, but what would that look like?
  • Hrm. Eclim might be how to make Eclipse not suck.
  • And while I am taking cheap shots at Eclipse … IDEs Are a Language Smell. Or put another way, Dear Android…
  • Someone (or someones) should do a time analysis of writing out scripts something like Where Does All That Time Go?. I suspect though that a lot of automation would be cancelled as a result though.
  • WonderProxy seems like it might be a useful tool. Especially if you are doing behaviour based upon where you are. Though wow it is annoying to be somewhere you don’t speak the language and have your language cookie ignored. *cough* google *cough*

A Smattering of Selenium #124

Too. Many. Links. Not. Enough. Posts.

Too. Many. Links. Not. Enough. Posts.

Announcing Selenium 2.26: the “It’s Really Real” Release

It’s been a long time since we announced a new Selenium release on this blog…

It’s been a long time since we announced a new Selenium release on this blog, as we moved to a model of quicker releases, but we’ve been working on 2.26 for far longer than normal — it’s out! Download it now! — so I thought it best to let you know. We’re aiming to head back to faster releases, so hopefully you won’t see another blog post about the release for a while (though I’m sure they’ll appear in the “Smatterings of Selenium” posts)

Some highlights that you might be interested in, include support for the latest and greatest versions of the popular browsers out there (including native events on Firefox 16!), the deletion of deprecated methods from the language bindings, better emulation of user input on IE when dealing with “sucker fish” style menus, and a slew of bug fixes. There’s more in the changelog!

The inimitable Jim Evans held the Release Bacon for what has become one of our most challenging releases to do, so a big “thank you!” to him. A “thank you”, also, to the rest of the core developers and Sauce Labs team members who worked on fixing so many bugs and getting our continuous build green, especially Alexei Barantsev who did some amazingly detailed and painstaking work to help the release through. And a final “thank you” to our users: thanks for your feedback and support. 🙂

A Smattering of Selenium #123

If you are not using something like Chef or Puppet to keep your grid nodes behaving then you are absolutely doing it wrong.

A Smattering of Selenium #122

Let’s try the ‘all video’ edition this time.

Let’s try the ‘all video’ edition this time.

Hrm. That didn’t work … let’s add some slide decks.

A Smattering of Selenium #121

Its the ‘all github’ edition today!

Its the ‘all github’ edition today!

  • Dave goes a little strange on us with his diy_framework as an emoting robot. Here is the deck that went along with it.
  • Can’t get enough of the food-based frameworks from the kids at Sauce. If you are using the PHPUnit included WebDriver bindings [and Sauce OnDemand] then Sausage could be of interest.
  • Of course, if you are just using PHPUnit, then paraunit could of interest. I’ve written similar before, but this looks cross-platform.
  • buster-selenium is, erm, well, Selenium for buster.js
  • Why did I only learn about ievms now? Oh. Well, one of the requirements is patience. That explains it.
  • gifsockets; I’ll wait while you pick up the pieces of your exploded brain
  • How to capture a FF profile log. Dunno what gets put in it, but tuck this away in your back pocket
  • I don’t have a use case for flower but collection of modules to build distributed and reliable concurrent systems in Python seems link-worthy
  • Again, not sure when you would use it, but webdriver-user-agent-randomizer seems darn cool
  • You don’t see too many open-source ios apps, so here is GoogleTransit-iOS6

A Smattering of Selenium #120

Here we grow again.

A Smattering of Selenium #119

Its that time again, 4th Annual Automation Honors Voting is now open.

Its that time again, 4th Annual Automation Honors Voting is now open. Vanity contests FTW!

A Smattering of Selenium #118

<Insert witty/snarky commentary on something here>

<Insert witty/snarky commentary on something here>

A Smattering of Selenium #117

Evolutionary Project Structure talks about a particular project structure…

A Smattering of Selenium #116

So do people celebrate the day after Labor day as the beginning of summer?

So do people celebrate the day after Labor day as the beginning of summer?

A Smattering of Selenium #115

The big news in the twitter-verse yesterday was the announcement of Apple Sauce and Android Sauce from Sauce Labs.
  • The big news in the twitter-verse yesterday was the announcement of Apple Sauce and Android Sauce from Sauce Labs. I of course jumped all over that bandwagon with Apple Sauce and Android Sauce .. Yummy! (And Fully Supported) * Accessing priviledged Javascript APIs from your web page in Firefox with Selenium lets to pull even more strings of the browser than you were supposed to be able to. Something I suspect Marionette will make redundant, but until then…

  • Use Xvfb, Selenium and Chrome to drive a web browser in PHP starts with the same-old, same-old, but scroll down to the bottom for squid and iptables and other things

  • Integrating Selenium with ALM – a simple recipe shows how to do it, but I still say whomever packages this up really well will make a lot of money

  • You Papers Please is something that will start to come up in the Se community soon-ish I fear.

  • Emulator Networking is a link I wish I had before spending an hour or so trying to search SO etc. for it

  • The Axis of Eval is just funny

  • BrowsermobRESTclient is a Java client for the BrowserMob Proxy

  • My Shallow Dive into iOS automation looks at the various options out there for native automation

  • Py.Test is awesome. And makes my brain hurt.
    slides:

    Funcargs & other fun with pytest from Brianna Laugher

    video:

    code:

    These are snippets of py.test in action, used in a talk given at
    PyCon AU 2012 in Hobart, Tasmania. They are all relevant for
    py.test 2.2 except where specified. Where taken from open source
    projects I have listed a URL, some examples are from the py.test
    documentation, some are from my workplace.
    Apart from things called test_*, these functions should probably
    be in your conftest.py, although they can generally start life in
    your test files.
    Talk info: http://2012.pycon-au.org/schedule/52/view_talk
    Slides: http://www.slideshare.net/pfctdayelise/funcargs-other-fun-with-pytest
    http://pytest.org/
    http://stackoverflow.com/questions/tagged/py.test
    http://codespeak.net/mailman/listinfo/py-dev
    http://lists.idyll.org/listinfo/testing-in-python
    ##############
    # informative error reporting
    # tb==native
    Traceback (most recent call last):
    File "/workspace/Review/GFESuite/tests/unit/formatters/test_Precis.py",
    line 882, in test_lowDetail12hourWxBrackets
    assert 'morningZ' in words
    AssertionError: assert 'morningZ' in 'morning shower or two'
    # tb==short
    tests/unit/formatters/test_Precis.py:882: in test_lowDetail12hourWxBrackets
    > assert 'morningZ' in words
    E assert 'morningZ' in 'morning shower or two'
    # tb==long
    mockAccessor =
    def test_lowDetail12hourWxBrackets(mockAccessor):
    """
    Initial 6 hours of wx is correctly being washed out to the first 12 hours.
    """
    mockAccessor.mockGrids([
    Flat("Sky", 0, 24, 0),
    Flat("Wx", 0, 6, "Sct:SH:m::"),
    Flat("Wx", 6, 24, "NoWx"),
    ])
    _icon, words = precisIconWords(mockAccessor, period=6, detail='low')
    assert 'early' not in words
    > assert 'morningZ' in words
    E assert 'morningZ' in 'morning shower or two'
    tests/unit/formatters/test_Precis.py:882: AssertionError
    # add back in unittest assert statements
    # apparently cribbed from something in nose
    def pytest_namespace():
    """Make unittest assert methods available.
    This is useful for things such floating point checks with assertAlmostEqual.
    """
    import unittest
    class Dummy(unittest.TestCase):
    def dummy(self):
    pass
    obj = Dummy('dummy')
    names = {name: member
    for name, member in inspect.getmembers(obj)
    if name.startswith('assert') and '_' not in name}
    return names
    # test file
    def test_kn2kmh():
    py.test.assertAlmostEqual(UnitConvertor.kn2kmh(10), 18.52, places=4)
    ###########################################################
    # add a hook for winpdb
    def pytest_addoption(parser):
    """pytest hook that adds a GFE specific option.
    """
    # Add options.
    group = parser.getgroup('graphical forecast editor options')
    group.addoption('--winpdb', dest='usewinpdb', action='store_true', default=False,
    help=('start the WinPDB Python debugger before calling each test function. '
    'Suggest only using this with a single test at a time (i.e. -k .'))
    def pytest_configure(config):
    # Only do these if this process is the master.
    if not hasattr(config, 'slaveinput'):
    # Activate winpdb plugin if appropriate.
    if config.getvalue("usewinpdb"):
    config.pluginmanager.register(WinPdbInvoke(), 'winpdb')
    class WinPdbInvoke:
    def __init__(self):
    print "initialising winpdb invoker"
    def pytest_pyfunc_call(self, pyfuncitem):
    import rpdb2
    rpdb2.start_embedded_debugger('0')
    # then run: py.test -k test_some_specific_thing --winpdb
    # SKIP
    # inside a test, if you need to check something after the environment
    # has been loaded
    if not config.get('ifpServer.allowOfficalWrites'):
    py.test.skip('Official DB writes are not allowed.')
    # decorators:
    import sys
    win32only = pytest.mark.skipif("sys.platform != 'win32'")
    @win32only
    def test_foo():
    ....
    @py.test.mark.skipif('True')
    def test_foo1():
    print "foo1"
    @py.test.mark.skipif('False')
    def test_foo2():
    print "foo2"
    def test_foo3():
    py.test.skip('inside skip')
    print "foo3"
    # XFAIL
    @py.test.mark.xfail
    def test_foo4():
    assert False
    @py.test.mark.xfail(reason='This is a bad idea')
    def test_foo5():
    assert False
    @py.test.mark.xfail(reason='Maybe this was a bad idea once')
    def test_foo6():
    assert True
    def test_foo7():
    # force test to be recorded as an xfail,
    # even if it would otherwise pass
    py.test.xfail()
    assert True
    # output:
    test_foo4 xfail
    test_foo5 xfail
    test_foo6 XPASS
    test_foo7 xfail
    # with --runxfail:
    test_foo4 FAILED
    test_foo5 FAILED
    test_foo6 PASSED
    test_foo7 FAILED
    # plus tracebacks
    # example custom marks
    @py.test.mark.slow
    @py.test.mark.dstAffected
    @py.test.mark.mantis1543
    @py.test.mark.flaky
    @py.test.mark.unicode
    @py.test.mark.regression
    # in 2.2 - parametrize
    @pytest.mark.parametrize(("input", "expected"), [
    ("3+5", 8),
    ("2+4", 6),
    ("6*9", 42),
    ])
    def test_eval(input, expected):
    assert eval(input) == expected
    view raw 02-marks.py hosted with ❤ by GitHub
    # code
    def isSquare(n):
    n = n ** 0.5
    return int(n) == n
    # test file
    def pytest_generate_tests(metafunc):
    squares = [1, 4, 9, 16, 25, 36, 49]
    for n in range(1, 50):
    expected = n in squares
    if metafunc.function.__name__ == 'test_isSquare':
    metafunc.addcall(id=n, funcargs=dict(n=n, expected=expected))
    def test_isSquare(n, expected):
    assert isSquare(n) == expected
    # then:
    # conftest.py
    def pytest_generate_tests(__multicall__, metafunc):
    """Supports parametrised tests using generate_ fns.
    Use multicall to call any other pytest_generate_tests hooks first.
    If the test_ fn has a generate_ fn then call it with the metafunc
    to let it parametrise the test.
    """
    __multicall__.execute()
    name = metafunc.function.__name__.replace('test_', 'generate_')
    fn = getattr(metafunc.module, name, None)
    if fn:
    fn(metafunc)
    # generate function is simplified, no boilerplate!
    # and we can have one per test function with multiple pairs in a single module, woot!
    def generate_isSquare(metafunc):
    squares = [1, 4, 9, 16, 25, 36, 49]
    for n in range(1, 50):
    expected = n in squares
    metafunc.addcall(id=n, funcargs=dict(n=n, expected=expected))
    import os.path
    def getssh(): # pseudo application code
    return os.path.join(os.path.expanduser("~admin"), '.ssh')
    def test_getssh(monkeypatch):
    def mockreturn(path):
    return '/abc'
    monkeypatch.setattr(os.path, 'expanduser', mockreturn)
    x = getssh()
    assert x == '/abc/.ssh'
    ######################
    # a funcarg to hide/abstract away some monkeypatching
    def pytest_funcarg__noPreviousWarnings(request):
    """pytest funcarg to avoid retrieving REAL previously issued warnings"""
    _ = request.getfuncargvalue("textImporter")
    def setup():
    import RecognisedWarnings as RW
    monkeypatch = request.getfuncargvalue("monkeypatch")
    noPreviousWarnings = lambda _x, _y, _z: None
    monkeypatch.setattr(RW, '_getFDBViewerXML', noPreviousWarnings)
    def teardown(obj):
    pass
    return request.cached_setup(setup, teardown, scope='function')
    # http://anders.conbere.org/blog/2011/05/03/setup_and_teardown_methods_with_py.test/
    # conftest.py
    def setup_fixtures():
    db.insert('...')
    return db
    def teardown_fixtures(db):
    db.destroy('..')
    def py_test_funcarg__db(request):
    return request.cached_setup(
    setup = setup_fixtures,
    teardown = teardown_fixtures,
    scope = "module")
    # test_db.py
    def test_db(db):
    assert(len(db.query(x=y)) >= 1)
    #####################
    # a real DB example
    # still far from a good example for most use cases I suspect, what with the lack of ORM and all
    def setupTestDb():
    """Setup test gfedb ensuring we only do this once."""
    import gfeDB
    if gfeDB.DB_NAME == 'gfedb':
    from NeoConfig import config as neoConfig
    name = 'gfedbtest{}'.format(neoConfig['instance.port'])
    cmd = """\
    mysql -u root -e "DROP DATABASE IF EXISTS {name};
    CREATE DATABASE {name};
    USE {name};
    GRANT ALL ON * TO gfe;
    GRANT ALL ON * TO gfe@localhost;
    FLUSH PRIVILEGES;";
    mysqldump -u root --no-data gfedb | mysql -u root {name}
    """.format(name=name)
    subprocess.check_output(cmd, shell=True)
    gfeDB.DB_NAME = name
    def pytest_funcarg__testDb(request):
    """pytest funcarg for a test gfedb."""
    return request.cached_setup(setup=setupTestDb,
    scope='session')
    def pytest_funcarg__emptyDb(request):
    """pytest funcarg to truncate all tables in the test gfedb."""
    _ = request.getfuncargvalue('testDb')
    def setup():
    from NeoConfig import config as neoConfig
    name = 'gfedbtest{}'.format(neoConfig['instance.port'])
    cmd = """\
    mysql -u root -e "USE {name};
    DELETE FROM fire_event_tb;
    DELETE FROM forecast_tb;
    DELETE FROM issuance_tb;
    DELETE FROM precis_pop_areas_tb;
    DELETE FROM warning_tb;"
    """.format(name=name)
    subprocess.check_output(cmd, shell=True)
    return request.cached_setup(setup=setup,
    scope='function')
    ###########################
    # funcarg to express a prerequisite
    # https://github.com/lunaryorn/pyudev/blob/develop/tests/test_libudev.py
    def pytest_funcarg__libudev(request):
    try:
    return _libudev.load_udev_library()
    except ImportError:
    pytest.skip('udev not available')
    view raw 05-funcargs.py hosted with ❤ by GitHub
    # django example
    # http://pytest-django.readthedocs.org/en/latest/helpers.html
    from myapp.views import my_view
    def test_details(rf):
    request = rf.get('/customer/details')
    response = my_view(request)
    assert response.status_code == 200
    def test_an_admin_view(admin_client):
    response = admin_client.get('/admin/')
    assert response.status_code == 200
    ##############################
    # Google App Engine
    # I wonder if these examples should be using monkeypatch to do os.environ.update??
    # http://pypi.python.org/pypi/pytest_gae/0.2.1
    import os
    from webtest import TestApp
    from main import make_application
    def pytest_funcarg__anon_app(request):
    os.environ.update({'USER_EMAIL': '',
    'USER_ID': '',
    'AUTH_DOMAIN': 'google',
    'USER_IS_ADMIN': '0'})
    return TestApp(make_application())
    def pytest_funcarg__user_app(request):
    os.environ.update({'USER_EMAIL': 'simple@google.com',
    'USER_ID': '1',
    'AUTH_DOMAIN': 'google',
    'USER_IS_ADMIN': '0'})
    return TestApp(make_application())
    def pytest_funcarg__admin_app(request):
    os.environ.update({'USER_EMAIL': 'admin@google.com',
    'USER_ID': '2',
    'AUTH_DOMAIN': 'google',
    'USER_IS_ADMIN': '1'})
    return TestApp(make_application())
    def test_index(anon_app):
    assert "Index" in anon_app.get('/index')
    def test_user_with_user(user_app):
    assert "User" in user_app.get('/users')
    def test_user_with_anon(anon_app):
    assert '302 Moved Temporarily' == anon_app.get('/users').status
    def test_user_with_admin(admin_app):
    assert "Admin" in admin_app.get('/users')
    # https://bitbucket.org/hpk42/py/src/0fca612a4bbd/conftest.py:
    def pytest_generate_tests(metafunc):
    multi = getattr(metafunc.function, 'multi', None)
    if multi is not None:
    assert len(multi.kwargs) == 1
    for name, l in multi.kwargs.items():
    for val in l:
    metafunc.addcall(funcargs={name: val})
    elif 'anypython' in metafunc.funcargnames:
    for name in ('python2.4', 'python2.5', 'python2.6',
    'python2.7', 'python3.1', 'pypy-c', 'jython'):
    metafunc.addcall(id=name, param=name)
    def pytest_funcarg__anypython(request):
    name = request.param
    executable = getexecutable(name)
    if executable is None:
    if sys.platform == "win32":
    executable = winpymap.get(name, None)
    if executable:
    executable = py.path.local(executable)
    if executable.check():
    return executable
    py.test.skip("no %s found" % (name,))
    return executable
    #probable in 2.3 (not yet released)
    # content of conftest.py
    import pytest
    import smtplib
    @pytest.factory(scope="session",
    params=["merlinux.eu", "mail.python.org"])
    def smtp(testcontext):
    smtp = smtplib.SMTP(testcontext.param)
    def fin():
    print ("finalizing %s" % smtp)
    smtp.close()
    testcontext.addfinalizer(fin)
    return smtp
    # content of test_module.py
    def test_ehlo(smtp):
    response = smtp.ehlo()
    assert response[0] == 250
    assert "merlinux" in response[1]
    assert 0 # for demo purposes
    def test_noop(smtp):
    response = smtp.noop()
    assert response[0] == 250
    assert 0 # for demo purposes
    $ py.test --collectonly
    =========================== test session starts ============================
    platform linux2 -- Python 2.7.3 -- pytest-2.3.0.dev8
    plugins: xdist, bugzilla, cache, oejskit, cli, pep8, cov
    collecting ... collected 4 items
    <Module 'test_module.py'>
    <Function 'test_ehlo[merlinux.eu]'>
    <Function 'test_noop[merlinux.eu]'>
    <Function 'test_ehlo[mail.python.org]'>
    <Function 'test_noop[mail.python.org]'>
    ============================= in 0.02 seconds =============================
    # v0
    # Feb 2010
    # data/test/dbconfig/TEXT/Misc/District_TestScript_2.py
    {
    "name": "Thunderstorms with heavy rain are not dry",
    "commentary": "Mantis 01530",
    "productType": "District",
    "createGrids": [
    ("Fcst", "Wx", "WEATHER", 0, 24, "Chc:TS:!::r", "all"),
    ],
    "notCheckStrings": [
    "dry"
    ],
    "fileChanges": [
    ("District_NSWRO_Definition", "TextUtility", "add", defaultEditAreas, "undo"),
    ],
    "cmdLineVars": str({
    ('Generate Days', 'productIssuance'): 'All Periods',
    ('Issuance Type', 'issuanceType'): 'Morning',
    ('Issued By', 'issuedBy'): None,
    ('CompleteUpdate', 'completeUpdate'): 'yes'}),
    },
    # v1
    # early 2011 - move to pytest, directory restructure
    def test_Thunderstorms_with_heavy_rain_are_not_dry(formatterTester):
    formatterTester.run({
    "commentary": "Mantis 01530",
    "productType": "District",
    "createGrids": [
    Flat("Wx", 0, 24, "Chc:TS:!::r"),
    ],
    "notCheckStrings": [
    "dry"
    ],
    "cmdLineVars": cmdLineVarsIssuanceMorning
    }, defaults())
    # v2
    # feb 2011 - introduction of gridCreator
    def test_Thunderstorms_with_heavy_rain_are_not_dry(formatterTester, gridCreator):
    """Mantis 01530
    """
    gridCreator.createGrids([
    Flat("Wx", 0, 24, "Chc:TS:!::r"),
    ])
    formatterTester.run({
    "productType": "District",
    "notCheckStrings": [
    "dry"
    ],
    "cmdLineVars": cmdLineVarsIssuanceMorning
    }, defaults())
    # lots of specifying areas like this:
    siteID = siteConfig.GFESUITE_SITEID
    DistrictEditAreaDictionary = {
    "NSWRO" : ['NSW_CW013'],
    "VICRO" : ['VIC_CW010', 'VIC_CW011'],
    "QLDRO" : [],
    "SARO" : [],
    "TASRO" : [],
    "WARO" : [],
    "NTRO" : [],
    }
    area = DistrictEditAreaDictionary[siteID]
    # v3
    # March 2011
    def pytest_funcarg__districtArea(request):
    def start():
    areas = {
    "VICRO": DefaultEditArea("VIC_PW007", "Central"),
    "NSWRO": DefaultEditArea("NSW_PW014", "Riverrina"),
    "TASRO": DefaultEditArea("TAS_PW002", "North East"),
    "SARO": DefaultEditArea("SA_PW012", "North West Pastoral"),
    }
    return __areaStart(areas)
    return request.cached_setup(setup=start, scope='session')
    def test_Thunderstorms_with_heavy_rain_are_not_dry(formatterTester, gridCreator, districtArea):
    """Mantis 01530
    """
    gridCreator.createGrids([
    Flat("Wx", 0, 24, "Chc:TS:!::r"),
    ])
    formatterTester.run({
    "productType": "District",
    "notCheckStrings": [
    "dry"
    ],
    "cmdLineVars": cmdLineVarsIssuanceMorning(districtArea.aac)
    }, defaults(districtArea.aac))
    # v4
    # Nov 2011
    # tests/system/formatters/wxPhrase/test_attributes.py
    @py.test.mark.mantis1530
    def test_thunderstormsWithHeavyRainAreNotDry(mockAccessor):
    """'heavy rain' and 'dry' attributes were getting mixed up.
    """
    mockAccessor.mockGrids([
    Flat("Wx", 0, 24, "Chc:TS:!::r"),
    ])
    words = weatherWordsLandAreal(mockAccessor)
    assert "dry" not in words

A Smattering of Selenium #114

Hurray for having fillings done on both sides of my face.

Hurray for having fillings done on both sides of my face. Don’t expect me to speak without drolling for rest of the day.

A Smattering of Selenium #113

/me is not looking forward to when the jet lag whallops him

/me is not looking forward to when the jet lag whallops him

A Smattering of Selenium #112

Eyes are gross.

Eyes are gross.

A Smattering of Selenium #111

When this gets published, I’ll be sitting around the Barcelona airport waiting for my connection home.

When this gets published, I’ll be sitting around the Barcelona airport waiting for my connection home. Unless I screwed up the time math. 🙂

A Smattering of Selenium #110

Dear body; what time zone are you in?

Dear body; what time zone are you in?

Ah well, until that battle resolves itself, here are some links.

A Smattering of Selenium #109

Going to be on an airplane for the better part of the next day, so will likely miss some links … unless I am tagged on twitter with it.

Going to be on an airplane for the better part of the next day, so will likely miss some links … unless I am tagged on twitter with it.

A Smattering of Selenium #108

Apparently the links are slowing down for the summer?

Apparently the links are slowing down for the summer?

A Smattering of Selenium #107

Back on the train again. Wow, the highway is screwed today.

Back on the train again. Wow, the highway is screwed today.

A Smattering of Selenium #106

In case you are curious, the train just went past my old neighbourhood.

In case you are curious, the train just went past my old neighbourhood.

  • Marionette – The Future of FirefoxDriver in Selenium is a project that has been hinted at here before I think, but this is its coming out party. Oh. And its the future of the Firefox driver. Now, what I need is an A-Team t-shirt…
  • FlynnID 0.2 changes its config format. I don’t play around with Grid much (at all) but I’ve been told that you need this if you are going to have Android devicii attached to the grid.
  • Geb: Groovy Browser Automation Tool – Part 2 starts out with a Page Object which is becoming the minimum standard for tutorial-esque posts
  • Proxy & Executor is the meetup talk I did at SFSe, SJSe and YYZSe over the span of 10 days this month. Slides, multiple video, notes, etc.
  • Hiss routes Growl messages through Mountain Lion’s Notification Center. I keep thinking I should use Growl for more things with my frameworks…
  • Cucumber & Cheese is not just about Ruby and Page Objects but how everything fits into the whole ATDD thing. Is likely Watir focused, but there are few people I would trust with this content more than Jeff.
  • Gargoyle is feature switching for Django.
  • Automate the install of JDK 5 on Lion and Mountain Lion seems like something that should be configured via Puppet or Chef or similar, but is geeky enough to include anyways.
  • Garzik: An Andre To Remember is not Se related, but is important for people to read and remember to have context. And to remember there is a whole world outside.
  • Python For Humans is awesome. I’d like the whole ‘… For Humans’ thing to catch on.

A Smattering of Selenium #105

This was supposed to go out Friday, but the flu bug I picked up decided to move the schedule about somewhat.

This was supposed to go out Friday, but the flu bug I picked up decided to move the schedule about somewhat.

A Smattering of Selenium #104

I think everyone is on holidays right now…

I think everyone is on holidays right now…

A Smattering of Selenium #103

Seems I had this all ready to go yesterday…

Seems I had this all ready to go yesterday… oh, and Happy Birthday Jim Evans — maintainer of IE and C# driver. If also a day late.

A Smattering of Selenium #102

Apparently my body isn’t quite on left coast time…

Apparently my body isn’t quite on left coast time…

A Smattering of Selenium #101

Really? A drought for most of the week and now I’ve got a queue again in the span of 3 hours?

Really? A drought for most of the week and now I’ve got a queue again in the span of 3 hours?

A Smattering of Selenium #100

Century!

Century!

A Smattering of Selenium #99

With the queue flushed we’ll go back to our regular random posting schedule.

With the queue flushed we’ll go back to our regular random posting schedule

A Smattering of Selenium #98

Happy day off Canuckistan!

Happy day off Canuckistan! I’ll be in California in two weeks; here is my schedule — come by and chat

A Smattering of Selenium #97

Yes. I know. I missed a day.

Yes. I know. I missed a day. But 13 in a row was a good run!

A Smattering of Selenium #96

Blech. Supposed to go car shopping today.

Blech. Supposed to go car shopping today. Any car brands want to sponsor my wife with a car so I can do something productive? Worth a shot…

A Smattering of Selenium #95

Ok twitterverse. After 2 weeks of very few links a day you explode.

Ok twitterverse. After 2 weeks of very few links a day you explode.

A Smattering of Selenium #94

# sudo wget coffee > adam

# sudo wget coffee > adam

  • Selenium-RC Commands is a mindmap of all the commands in Se-RC. (Unsurprising really.) I keep meaning to do this for WebDriver.

  • quacken is a script for grabbing OFX files from Quicken it seems

  • What’s that? You weren’t happy with one of the six PHP WebDriver clients that were out there already? Have another one — Nearsoft/PHP-SeleniumClient. It’d be spooky what would happen if we all got together on this.

  • Thucydides Release 0.8.26 grew Remote WebDriver support (and something to do with Spring but I don’t speak Java)

  • I don’t know if this is a chop or not, but

    Why did the @Lenovo dev call me an asshole? Code review much? twitter.com/RussSolberg/st…

    — Russell S (@RussSolberg) June 22, 2012

    is hilarious. Well, from a ‘been there, done that, crap I forgot to revert’ perspective.

  • Yes, packaging is a hard problem. No, I don’t know how to even begin to solve it. Python Packaging: Hate, hate, hate everywhere is kinda a history lesson on what the current state of the world is in Python.

  • Oh, and because this is what happens on the internets, there is a bigger discussion of the previous article over on Hacker News

  • inproctester is a standalone J2EE app server for running HTMLUnit WebDriver scripts

  • Its a bit amusing [though not to a lot of people] how much love parts of WebDriver get from the world at large and how much hatred other parts get. What’s Wrong With the Internet Explorer Driver? enumerates some of the causes, why they got that way, and throws down the gauntlet to Microsoft. Who will promptly do, erm, nothing…

  • Accept-Charset Is No More seems like one of those browser differences that we should know about.

A Smattering of Selenium #93

Did I say 8 days in a row yesterday? I meant 9.

Did I say 8 days in a row yesterday? I meant 9. Good thing programming doesn’t require counting…

A Smattering of Selenium #92

What’s that? Eight days in a row? That’s right…

What’s that? Eight days in a row? That’s right…

  • lolcommits seems almost funny enough to be a good idea
  • A vision for Cucumber 2.0 is rather interesting
  • Install Firefox on Amazon Linux X86_64 Compiling GTK+ is not something I have had to do. But then again, I haven’t tried.
  • Nerrvana is yet another Selenium-As-A-Service provider. Looks like they are taking the ‘upload to our servers and run as a scheduled job’ approach rather than real-time.
  • Ext JS 4.1 Performance is important stuff if you are using this toolkit. (I also like how they author is Nige “Animal” White — note that I did not add the animal part myself)
  • Dunno if it is just who I follow of if the Ruby / PHP communities just don’t post this sort of thing, but How Callables Work is another geeky Python post
  • Scaling CI at Etsy: Divide and Concur, Revisited is the lightsaber heuristic in action — only around Jenkins plugins this time.
  • RSpec is not the reason your rails test suite is slow is a gist along the theme of ‘slow tests are slow but not for the reasons you think’
    [david: compare]$ # at this point we have a stock rails app with no minitest tests and one pending rspec example
    [david: compare]$
    [david: compare]$ time rake test
    Run options:
    # Running tests:
    Finished tests in 0.030419s, 0.0000 tests/s, 0.0000 assertions/s.
    0 tests, 0 assertions, 0 failures, 0 errors, 0 skips
    real 0m5.694s
    user 0m4.503s
    sys 0m0.811s
    [david: compare]$ time rake spec
    /Users/david/.rvm/rubies/ruby-1.9.3-p0/bin/ruby -S rspec ./spec/models/thing_spec.rb
    *
    Pending:
    Thing add some examples to (or delete) /Users/david/tmp/compare/spec/models/thing_spec.rb
    # No reason given
    # ./spec/models/thing_spec.rb:4
    Finished in 0.00072 seconds
    1 example, 0 failures, 1 pending
    real 0m4.918s
    user 0m3.839s
    sys 0m0.697s
    [david: compare]$
    [david: compare]$ echo 'require "test_helper"
    >
    > class ThingTest < ActiveSupport::TestCase
    > test "empty" do
    > end
    > end
    > ' > test/unit/thing_test.rb
    [david: compare]$
    [david: compare]$ echo 'require "spec_helper"
    >
    > describe Thing do
    > example "empty" do
    > end
    > end
    > ' > spec/models/thing_spec.rb
    [david: compare]$
    [david: compare]$ time rake test
    Run options:
    # Running tests:
    .
    Finished tests in 0.078296s, 12.7720 tests/s, 0.0000 assertions/s.
    1 tests, 0 assertions, 0 failures, 0 errors, 0 skips
    real 0m5.802s
    user 0m4.565s
    sys 0m0.847s
    [david: compare]$ time rake spec
    /Users/david/.rvm/rubies/ruby-1.9.3-p0/bin/ruby -S rspec ./spec/models/thing_spec.rb
    .
    Finished in 0.00475 seconds
    1 example, 0 failures
    real 0m4.950s
    user 0m3.903s
    sys 0m0.725s
    [david: compare]$
    [david: compare]$ echo 'require "test_helper"
    >
    > class ThingTest < ActiveSupport::TestCase
    > 1000.times.map do |n|
    > test "empty #{n}" do
    > end
    > end
    > end
    > ' > test/unit/thing_test.rb
    [david: compare]$
    [david: compare]$ echo 'require "spec_helper"
    >
    > describe Thing do
    > 1000.times.map do |n|
    > example "empty #{n}" do
    > end
    > end
    > end
    > ' > spec/models/thing_spec.rb
    [david: compare]$
    [david: compare]$ time rake test
    Run options:
    # Running tests:
    ........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
    Finished tests in 0.753860s, 1326.5062 tests/s, 0.0000 assertions/s.
    1000 tests, 0 assertions, 0 failures, 0 errors, 0 skips
    real 0m6.730s
    user 0m5.047s
    sys 0m0.887s
    [david: compare]$ time rake spec
    /Users/david/.rvm/rubies/ruby-1.9.3-p0/bin/ruby -S rspec ./spec/models/thing_spec.rb
    ........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
    Finished in 0.99978 seconds
    1000 examples, 0 failures
    real 0m6.023s
    user 0m4.615s
    sys 0m0.790s
    view raw output.txt hosted with ❤ by GitHub
    rails new compare
    cd compare
    rails g model thing name:string
    echo "gem 'rspec-rails', '2.9.0.rc2', :group => [:development, :test]" >> Gemfile
    bundle
    rails g rspec:install
    rails g model thing name:string --skip-migration
    rake db:migrate
    rake db:test:prepare
    # at this point we have a stock rails app with no minitest tests and one pending rspec example
    time rake test
    time rake spec
    echo 'require "test_helper"
    class ThingTest < ActiveSupport::TestCase
    test "empty" do
    end
    end
    ' > test/unit/thing_test.rb
    echo 'require "spec_helper"
    describe Thing do
    example "empty" do
    end
    end
    ' > spec/models/thing_spec.rb
    time rake test
    time rake spec
    echo 'require "test_helper"
    class ThingTest < ActiveSupport::TestCase
    1000.times.map do |n|
    test "empty #{n}" do
    end
    end
    end
    ' > test/unit/thing_test.rb
    echo 'require "spec_helper"
    describe Thing do
    1000.times.map do |n|
    example "empty #{n}" do
    end
    end
    end
    ' > spec/models/thing_spec.rb
    time rake test
    time rake spec
    view raw script.sh hosted with ❤ by GitHub
  • I really don’t like integrations that are all-or-nothing from a philisophical perspective, but if you are look at using Sauce OnDemand with Behat, Behat-Sauce is what you want.
  • Top 10 Reasons No One Uses Your Testing Tool from this year’s PyCon is so accurate it is spooky.

A Smattering of Selenium #91

As you’ll start to see by the timestamps of things towards the end, I’m running out of ‘new’ stuff and am pulling from the queue now.

As you’ll start to see by the timestamps of things towards the end, I’m running out of ‘new’ stuff and am pulling from the queue now.

A Smattering of Selenium #90

Eventually I’ll get back on the once-a-week schedule.

Eventually I’ll get back on the once-a-week schedule. But not today!

A Smattering of Selenium #89

Figured I would get this out before the computer goes in for surgery.

Figured I would get this out before the computer goes in for surgery.

A Smattering of Selenium #88

Five days and fifty links later…

Five days and fifty links later…

A Smattering of Selenium #87

Avoiding punching things about software packaging by doing the 4th!!!!

Avoiding punching things about software packaging by doing the 4th!!!! smattering in row.

A Smattering of Selenium #86

Look at that! 3 days in a row, and the boy isn’t even gone to school yet and I’ve hit ‘publish’

Look at that! 3 days in a row, and the boy isn’t even gone to school yet and I’ve hit ‘publish’

A Smattering of Selenium #85

Two days in a row! Take that doubters!

Two days in a row! Take that doubters!

A Smattering of Selenium #84

What? Its only been 3 months since the last one.

What? Its only been 3 months since the last one. Sheesh.

Announcing Selenium 2.22

It’s been a while since the last Selenium release, but I’m happy to announce that Selenium 2.22 is now available for download.

It’s been a while since the last Selenium release, but I’m happy to announce that Selenium 2.22 is now available for download. This is a big release for us and features two major changes.

The first is that Selenium 2.22 is the first version that requires Java 6 in order to run. This has been the case for the Selenium Server for some time, but this is the first time the client code has required Java 6. Since Java 5 was “end of lifed” in 2009, we don’t expect this to impact many users.

The second major change is that we are now providing a standalone IE server for use with the WebDriver API, similar to the one used by the chrome driver. You can get it from the normal download page. This will allow us to update our IE support independently of the rest of the library (again, mirroring how Chrome is supported) For now, there’s a legacy fallback mode you can use that’ll use the same DLL we’ve always used which can be activated by setting the DesiredCapability “useLegacyInternalServer” to boolean “true” when requesting your IE Driver instance.

Of course, as well as these major changes, there’s the usual host of updates and improvements. We’re continuing to refine the new SafariDriver, and we’re happy to announce native events for Firefox 12. You can check out the other updates in the CHANGELOG.

Selenium Conf: Community

In this series of blog posts we’ve introduced…

In this series of blog posts we’ve introduced one of the keynotes and talked about some of the great presentations you’ll see at Selenium Conf ’12, but so far we’ve missed the most important aspect of the entire event: you.

For me, one of the highlights of any conference is the chance to meet other members of the community, make new friends and talk about all things interesting (and perhaps even tangentially related to the conference!) To help this process along, we’ve avoided scheduling everything down to the last minute. Instead, we’ve left plenty of time in the B track for an unconference. You’ll get to pick the talks and have a chance to have your voice heard. Last year, there were some great talks on the equivalent track, and I think we’ll see the same this year too!

If the idea of standing up and talking for 30 minutes in front of an audience seems a little daunting, you can dip your toes in the water by volunteering for a lightning talk: 5 minutes of concentrated goodness! Come prepared with a topic and perhaps a handful of slides 🙂

It’s not all formal talks, either. As well as the many members of the selenium community who’ll be attending the conference, there will be many of the core development team. There’ll be a chance to ask Simon why we’re not using git yet, get feedback on some of the ways you’re using Selenium, or just chew the fat. There will be a drinks on the 17th at a London pub, too.

I’m really looking forward to meeting all of you, and hearing the tall testing stories, and finding out how you’re pushing the boundaries. of web automation. If you’ve still not bought a ticket, there’s still time to. Come along and join us! If you’ve already bought your ticket, what kind of things are you looking forward to?

Selenium Conf: Speakers

I may be biased, but I think Selenium Conf ’12 is going to be great.

I may be biased, but I think Selenium Conf ’12 is going to be great. There are talks aimed at every level of Selenium user. We’ve got experience reports, so you can learn from the trials and tribulations of others. There are talks about using Selenium in unusual ways, such as performance testing, or automated security testing, so you can see new ideas and approaches.

There are technical talks, such as the one Jim Evans is giving on lessons learned from developing the IE driver, so you can learn a little bit more about how Selenium works and Luke Daley’s talk about Geb is bound to be fun.

If you’re a fan of Selenium IDE, then the talk on the SauceBuilder will be a “must see”. We’ll also have the current owners of Selenium IDE attending the conference, so you’ll get a chance to pick their brains on the future of the tool.

If you’re someone who enjoys living in the future, then the mobile focused talks, such as Andreas Tolf Tolfson’s talking about OperaDriver on mobile devices, or Dante Briones talking about testing mobile apps on iOS will be interesting. And Jason Huggins will be talking about robots. What’s not to love?

Better still, we’ve left space in the schedule in Track B for an unconference. If you put forward a talk this year that wasn’t accepted, or if you’ve got something you feel the Selenium community should hear, now’s your chance! If you’ve only got a little to say, or just want to make a single point, then you’re really going to enjoy the lightning talks!

All of this is available for the cost of the ticket, which you can still buy. Don’t wait! Come to #SeConf!

Selenium Conf Keynotes: Liz Keogh

The tickets for Selenium Conf ’12 are still on sale for about another week, so there’s still time for you to buy your tickets.

The tickets for Selenium Conf ’12 are still on sale for about another week, so there’s still time for you to buy your tickets. In case you’ve not already gone to the conference site to see the great line up, this week we’ll be letting you know what to expect!

I’m really pleased to announce that Liz Keogh, who is a core member of the Behaviour Driven Development (BDD) community and is one of the stalwarts of the London Agile community, as well as a haiku poet, is going to be one of our keynotes! If you’ve ever seen Liz speak then you’ll know just how much a treat we’re in for. She’s got great things to say and always says them in a thoroughly engaging way.

Liz’s keynote is titled “How to Test the Inside of Your Head”. When we test code and find it doesn’t do what we thought it did, we change it. But, she asks, wouldn’t it be great if we didn’t have to write the wrong code in the first place? In the talk, Liz will show how we can use examples and scenarios to break the models we make inside our own heads, helping us to avoid premature commitments and their follow-through – whether in code or in life.

I’m really looking forward to it! I’m sure you are too.

A Smattering of Selenium #83

Well, might not be in Florida, but how about them juggernaut Blue Jays?

Well, might not be in Florida, but how about them juggernaut Blue Jays?

A Smattering of Selenium #82

Someone explain to me why I’m in Toronto and not Florida?

Someone explain to me why I’m in Toronto and not Florida?

A Smattering of Selenium #81

Its March Break (at least here) which means its also Catch Up Week.

Its March Break (at least here) which means its also Catch Up Week. An extra long Smattering every day!

Selenium Conference 2012

Good news, everybody! Selenium Conf ’12 is getting closer!

Good news, everybody! Selenium Conf ’12 is getting closer! We recently selected the speakers for the conference, and it’s going to be a great mix of talks, spanning the full range of subjects from the very practical to the deeply technical. I’m promised that there will be robots.

Selenium Conf isn’t just about the planned talks, it’s also about the community. On the final day, there will be an unconference, so if there’s something you feel passionately about and feel the world should know, now’s your chance. You’ll not only have a chance to talk to and meet other selenium users, but also many of the core team members.

The conference runs from the 16-18 April in London. Tickets are still available! We’re looking forward to seeing you there.

Support for Ancient Browsers

The first code checked into the Selenium project’s public repository was in November, 2004.

The first code checked into the Selenium project’s public repository was in November, 2004. We’re now in 2012. In the intervening years there have been many browsers released. The last browser we officially stopped supporting was Firefox 2.0, and it’s time to review the list of browsers again.

We periodically review the list of supported browsers as the more changes there are between the oldest version of a browser that we support and the most recent, the harder it is for us to add new features and maintain those that already exist. Balanced against the cost of maintaining the selenium code base itself are your tests; we know that your users might not be updating their browsers to the latest and greatest, and we know that you’ve still got to prove your app works on all the browsers that are important to you. That’s why what’s below is just our plan, and we’re talking about it now to let you have your say.

Looking at the market share of the browsers out there helps us make an informed choice about what it makes sense to support. This will most likely mean:

Firefox: the Firefox market appears to be split between those on 3.6 and those on the new rapid release schedule. Given this, we are thinking of officially supporting Firefox 3.6, and the last, latest and next release of Firefox (currently Firefox 9-11) as well as any ESR releases. The market share for Firefox versions 3.0 and 3.5 is tiny, and the effort to keep them working with selenium is disproportionately high.

Internet Explorer: Despite Microsoft’s efforts, IE 6 is still a popular browser, particularly in the workplace. We will continue to support IE versions 6 and up.

Safari: Safari 3 is now ancient and has been superseded by newer releases. We plan on only supporting Safari 4 and 5.

iOS: We’ll continue to target the most recent iOS release.

Android: Due to some technical limitations in previous Android releases, we are targeting Ice Cream Sandwich and onwards. We will continue to make available the testing framework for Froyo, but will not be making any changes to it.

These are only our plans. If you really need those browsers, and (better!) can help us maintain support for them, then please let us know.

You’ll notice that Opera and Chrome are not listed above. Since Opera and Google now maintain the drivers for those browsers, they are best placed to decide which are the supported versions, but in summary, Google support the major Chrome release channels (stable, beta, dev and canary) and Opera suggest using Opera 11.6+.

A Note About the Cybervillains SSL Certificate

If you’re using Selenium RC to test websites hosted on a secure site (accessed using a URL starting with HTTPS), we strongly recommend that you upgrade to Selenium 2.19. This is because the Cybervillains certificate in previous versions will expire soon, and has been replaced in 2.19 with an updated one. Our thanks to Patrick […]

If you’re using Selenium RC to test websites hosted on a secure site (accessed using a URL starting with HTTPS), we strongly recommend that you upgrade to Selenium 2.19. This is because the Cybervillains certificate in previous versions will expire soon, and has been replaced in 2.19 with an updated one.

Our thanks to Patrick Lightbody, Ivan De Marino and Mark Watson and Neustar for taking providing the new certificate and the patch!

A Smattering of Selenium #80

I should have learned not to boast about getting caught up with links.

I should have learned not to boast about getting caught up with links.

And my post that I’m going to link against is a bit of a rant around how to choose selenium training. Though it has also been pointed out that a lot it applies outside the scope of Selenium as well.

Announcing Selenium 2.19: the Prancing Unicorn release

You might be pleased to hear that Selenium 2.19 has been released (download it from here!).

You might be pleased to hear that Selenium 2.19 has been released (download it from here!). There’s one big user facing changing that we’d like to tell you about: the webdriver-backed selenium can now be used in supported languages.

By providing this capability, it’s possible to migrate from RC to the WebDriver APIs without rewriting all your tests in one fell swoop (which must be a Good Thing, right?) An example of how to use it in Python would be:

driver = RemoteWebDriver(desired_capabilities = DesiredCapabilities.FIREFOX)
selenium = DefaultSelenium('localhost', 4444', '*webdriver', 'http://www.google.com')
selenium.start(driver = driver)

Provided you keep a reference to the original webdriver and selenium objects you created you can use the two APIs interchangeably. You’ll see that the magic is the “*webdriver” browser name passed to the selenium instance, and that we pass the webdriver instance when calling start().

We hope you like it!

PS: I have no idea why this is the Prancing Unicorn release, but it’s been a while since we named one 🙂

A Smattering of Selenium #79

The only links left now are ones currently open in tabs right now.

The only links left now are ones currently open in tabs right now. Hurray!

And my post this edition is WebDriver and Meta Tags.

A Smattering of Selenium #78

Look! A light at the end of the tunnel!

Look! A light at the end of the tunnel!

And today’s post of mine is WebDriver and Cookies which explains how, well, cookies and webdriver play together.

A Smattering of Selenium #77

No. Really. A Smattering every day this week and I’ll have the link queue cleared.

No. Really. A Smattering every day this week and I’ll have the link queue cleared.

Go!

One thing I have done in these Smatterings is to not link to my own stuff, but am going to start linking to an article or two at the bottom of the Smatterings (unless there is general community backlash against the idea).

A Smattering of Selenium #76

Post ten links, find seven more to add to the queue.

Post ten links, find seven more to add to the queue.

A Smattering of Selenium #75

And home. Which mean 100% more internets!

And home. Which mean 100% more internets! Or at least 98% more.

  • As things like native-driver become more prevalent, knowing how to do Continuous Integration for iOS projects with Jenkins CI will become more important
  • Chocolatey seems like a nice and big step towards managing Windows build slaves
  • SST (Selenium Simple Test) comes out of Ubuntu and has a quick introductory screencast.
  • Automate Salesforce Config Changes with Selenium is a contest. But only for Java so I have no interest in it. Submissions are due in two days. Could be fun.
  • cssify is a great little app for converting xpath to css. Now to see what sorts of devious xpath we can put in and blow Santi’s mind with bug reports. 🙂
  • Continuous Delivery with Bamboo Stages – I normally call these ‘chains’ but nicely shows how to chunk the march to production. It also cracks me up that the corporate twitter feed has the upgraded beer cart photo in the sidebar right now.
  • One talk I skipped at Codemash the other week was on Apple’s UI Automation stuff. I suspect this is the low-level implementation of things like native-driver which is valuable to have at ones fingertips.
  • While not automation related directly, if you are automating Android stuff you should also be looking at the Android Design site to understand the idioms and such that the platform thinks you should be using
  • The road to faster tests is a fantastic write-up of an investigation into why their scripts were so slow. I’ve been doing this a lot recently. Well, investigating slowness at least.
  • I actually got the above link from How We Reduced Our Rails Test Runtimes By 10x which is an even larger investigation write-up.

A Smattering of Selenium #74

It is kinda hard to do these without reliable internet… dear hotels, fix. your. internet.

It is kinda hard to do these without reliable internet… dear hotels, fix. your. internet.

A Smattering of Selenium #73

Two Ruby gems…

Selenium 2.16 Released: Welcome to 2012!

It’s been a while since we last blogged about a Selenium release.

It’s been a while since we last blogged about a Selenium release. Since the release of 2.0, we’ve been attempting to give you a fresh and shiny Selenium release every week (though, in reality, we’re managing to get you one every 10 days on average). This allows you to pick the version that’s most suitable for you and your teams, but provides a route for quick feedback on how we’re doing. I think we’ve now ironed out a lot of the initial problems and bumps we ran into, so we are extremely proud to announce the release of Selenium 2.16.

If you’re unsure about what’s been happening since the last time we announced a release here, the best place to look is our changelog (http://selenium.googlecode.com/svn/trunk/java/CHANGELOG). The most notable feature in 2.16 is better support for Firefox 9, but if it’s been a while since you’ve last updated, we’ve been beavering away on bug fixes and making existing features work as flawlessly as possible. Now’s a great time to update!

One of the key tools we use for assessing whether it’s okay to push a release is our continuous build. This watches for each and every change made to the project’s source code, and runs an increasingly vast suite of tests to verify that nothing has broken. Our friends at Sauce Labs have been extremely generous in providing support for this, and have worked closely with us to make the build as stable and quick as possible. Special kudos and thanks to them!

A Smattering of Selenium #72

January means its time to escape from under the deadlines I found myself under during December so some of this stuff is a month old (or older!).

January means its time to escape from under the deadlines I found myself under during December so some of this stuff is a month old (or older!). Hopefully it is still interesting though.