OperaDriver v0.8.1 released

I'm pleased to announce the release of OperaDriver 0.8.1. This is a patch release addressing some issues discovered following last week's 0.8 release.

Two important changes I should highlight:

Returning control of browser to user on page load timeout

When OperaDriver reaches a page load timeout, e.g. when a page takes longer than 30 seconds to load, it previously threw an exception and terminated. We are now catching the exception and returning control of the browser to the user.

Generally WebDriver has a blocking API, meaning it should wait for the page to finish loading before continuing. Under some conditions it is extremely hard and in some cases impossible to detect whether a page has finished loading, however. In complex documents you will almost always have JavaScript events planned in the future, and if the page also uses asynchronous calls to the server side to load new content, OperaDriver may only tell if the basic HTML content has been loaded.

For this reason, the blocking API is imperfect. Opera also implements its own Scope API to detect whether all internal components have met their conditions before returning from the page load command, called “Opera Idle”. This basically waits for all components of the browser, such as SVG, GIFs, CSS, HTML, to meet a predefined set of conditions before returning. This, however, won't cut it in the real world (yet) but is quite useful for minimal browser tests. You may of course try it out by enabling the capability opera.idle by setting it to true.

Default page load timeout

For convenience I've added an extension to the Timeouts interface to specify the page load timeout. By default this is currently set to 30 seconds, but you may change it by invoking:

driver.manage().timeouts().pageLoadTimeout(45, TimeUnit.SECONDS);

You may see the changelog attached for a full list of changes and bug fixes, but other noteworthy changes include:

The README can be found here: https://github.com/operasoftware/operadriver/blob/v0.8.1/README.md

OperaDriver 0.8.1 is available in the group com.opera under the artifact ID operadriver in Maven.

You may download the OperaDriver JAR separately here: https://github.com/downloads/operasoftware/operadriver/operadriver-v0.8.1.zip

The full changelog:

v0.8.1    2011-11-24

  [API CHANGES]

  * OperaDriver.get() and OperaNavigation().to() now catches
    ResponseNotReceivedException so that when a page load times out on
    very slow-loading pages, the control of the browser instance to the
    user.  (andreastt)

  * Added method pageLoadTimeout() to OperaTimeouts which allows you to
    control the default page load timeout, that is the timeout for when
    control of the browser should be handed back to the user.  Example:

      driver.manage().timeouts().pageLoadTimeout(40, TimeUnit.SECONDS);

    (andreastt)

  [NEW FEATURES]

  * Output from Opera and the launcher is now forwarded to the
    appropriate logging level in OperaDriver.  (andreastt, danielb)

  [ENHANCEMENTS]

  * Upgraded Selenium dependency to 2.13.0.  (andreastt)

  * Upgraded WebDriver atoms to match Selenium 2.13.0.  (andreastt)

  * Refactored heuristic for figuring out a sensible logging level

    between OperaDriver and launcher.  (andreastt)

  * Refactored OperaPaths.operaPath() to look for Opera Next binaries on
    all platforms.  Resolves OPDRV-104.  (andreastt)

  [BUG FIXES]

  * Ensuring that the launcher is executable on each run.  (andreastt)

  * Fixed bug with synchronized locks ought to be on fields classified
    as final in WaitState.  (andreastt)

  * OperaArguments does not parse OPERA_ARGS, so calling
    OperaCoreArguments on startup instead.  Fixes bug with OPERA_ARGS
    not being parsed.  Addresses OPDRV-108.  (andreastt)

  * Parsing a single argument failed due to a bug in regex, corrected.
    Addresses OPDRV-108.  (andreastt)

  * Removed superflous call to isPathValid() in OperaPaths when checking
    whether a specified/set path is invalid.  (andreastt)

  * Arguments added in OperaCoreArgument's constructor were not merged
    if OperaRunner received an OperaRunnerSettings object with the
    arguments field set.  (andreastt)

  * Actions sent to OperaDriver.operaAction() are now converted to lower
    case in OperaExec.  (andreastt)

  [TESTS]

  * Removed superflous code in OperaLauncherRunnerTest, and made
    assertions static.  (andreastt)

  * Added deprecated OperaDriverSettings tests to a separate file.
    (andreastt)

  * Added test for single argument parsing to OperaArgumentsTest.
    (andreastt)

  * Added new run configuration for OperaLauncherRunnerTest and
    OperaRunnerTest.  (andreastt)

  * Added tsts for OperaLauncherRunner.toLauncherLoggingLevel().
    (andreastt)

  * The "File Types Section Info" section does not exist on core-tv,
    using "Disk Cache" instead for PrefsTest, resolves about five
    failing tests on this configuration.  (andreastt)

  * Moved context menu test to be run last in ElementsTest because it's
    known to cause problems for consecutive tests.  (andreastt)

  * OperaRunnerTest now uses a mocking OperaRunner instance,
    TestOperaRunner, which exposes the settings field through a getter.
    (andreastt)

  [OTHER]

  * Fixed classpath issues with previous release.  (ajayk)

  * Added Apache Commons Exec 1.1 as dependency as
    org.openqa.selenium.os.CommandLine now depends on it.  (andreastt)

  * Explanation for IllegalArgumentException for
    OperaExec.mouseAction(), helps WTR-362.  (andreastt)