November Recap

I’m bad at writing articles for this site. I have dozens of posts from the past several years that are in various stages of progress, none of which are quite “good enough” to publish. Someone recently gave me a great suggestion that I just write what I’ve been up to professionally for the month and not worry about creating the code examples and getting everything perfect. So, I’m giving it a try…


This month is slightly unusual because I became the father of a tiny human at the end of October, so I’ve been on paternity leave and therefore not working on anything Sauce Labs specific.

Selenium 4.1 Work

We released Selenium 4.1 on November 22. It was a relatively minor release. The main thing for all languages was to ensure shadow DOM support worked as expected in all the languages now that Chrome and Edge v96 support it. Also of interest, now that we are including code that works with the Chrome DevTools Protocol, we have to manage support for specific versions of Chrome in the Selenium codebase. Ruby is the only language that completely decoupled this by maintaining a selenium-devtools gem that will automatically work with whatever version of Selenium is being used. Java releases a separate package, but the release process is mostly tied to the main Selenium release process, and the other languages are more integrated into the Selenium code itself. For the foreseeable future, I would expect a minor Selenium release every time a new Chrome version comes out.

Selenium 4.2 Work

Someone recently reported a missing feature in Firefox Addons. Essentially, testing on a release version of Firefox, an ‘unsigned’ extension needs to be flagged as temporary in order for it to be installed. Java and .NET were not allowing this to be toggled. I fixed this, but in the process, I noticed that .NET was using addon parameter instead of file parameter, and I got very excited when I looked up its purpose.

Let’s back up a second. Unlike Chrome, where you can install extensions as part of capabilities when you create a session, Firefox makes you first start a session, then use the installExtension() on the Firefox driver. For Selenium 4.0, I made sure that the RemoteWebDriver also had access to this method in Ruby & Java. Unfortunately, these methods take a String argument representing the path on the local system, which obviously doesn’t work if the driver is on a remote machine. To address this, I implemented the aforementioned Ruby and Java code with the se/file endpoint using a Local File Detector— similar to how Selenium supports uploading files in a form. The Ruby implementation wasn’t so bad, but in Java the upload code is essentially duplicated and I needed Simon’s help to figure out how to properly wrap the driver. The exciting thing is that this addon parameter accepts a base64 encoded value, so we can skip the file upload issue entirely. JavaScript and .NET were both doing this already, so I fixed the ugly Java implementation and updated the Ruby and Python.

The major thing that is going to be added in Selenium 4.2 is scroll wheel support, which is going to provide users with native scrolling behavior for the first time. The behaviors specified by the W3C are not straightforward, and I’ve been throwing around a number of ideas for how to make things more obvious in the user-facing API. For things like this, I’m hoping we can get something similar implemented by all the bindings instead of each maintainer doing their own thing. I’ll try to write an article about all of this when it’s finished.

Selenium Documentation

Our current Selenium Documentation is not up to date with the latest Selenium implementations and needs more code examples. I started to fix up the “getting started” documentation, but I quickly realized just how disorganized the structure of our documentation is. I worked up a proposal for a major reorganization. The problem is that we currently manage 9 languages (English and 8 translations). Each time a file gets moved or is renamed, the title needs to be updated and aliases need to be created for redirecting from the old page. Doing this 9 times for every change is a lot of work. Diego and I gathered some information and I submitted a proposal to add translators as an official part of the Selenium project. The plan is to advertise that we’re looking for people to join the Selenium team as an official translator for a specific language, then archive the translations that do not have an assigned translator.

Watir 7.1 Work

I released Watir 7.1 on November 15. Per the W3C WebDriver Specification, the pointerMove action should not scroll the page, and if the location of the pointer target is outside of the viewport, the driver is supposed to return a “move target out of bounds” error. Watir has addressed this by automatically scrolling the element into view using the WatirScroll class before executing the action. A user asked for more control over this scrolling. In the process of addressing this, I wrote a bunch of new tests to ensure the behavior was as intended, then fixed up a number of things that weren’t entirely correct. I started to write an article about this, but the scroll wheel work I’m doing for Selenium 4.2 is probably going to change what I’d otherwise write, so I’ll wait for that and see where we end up.

Watir 7.2 Work

With shadow DOM support added to Selenium, I’ve created basic support for it in Watir. I haven’t merged it yet because I’m not super happy with it. I don’t love how I’ve had to move a bunch of Element methods into a separate module to so the ShadowRoot object can have partial Element behavior. Really the crux of the issue is that Element#element_call is well past the need for refactoring and needs to be replaced with an Executor class. Also, Watir locators are implemented entirely with XPath at this point, and since Google has not deigned to provide XPath support within a shadow root for Chromium, the solution in Watir is not very performant. Unfortunately I’m not looking to dedicate a lot of time to Watir coming up, so I’m probably going to just merge this and fix things as people request it.

Looking Forward to December

Selenium Code: Ensure scroll wheel support is added to all bindings. Watir: Merge in the limited shadow DOM support. Selenium docs: Once the translations have been sorted out, I’m expecting to spend a lot of the month working on these.

Upcoming Articles

Here are some of the half-written articles I’ve been sitting on. I make no promises, but if any of these sound especially interesting, please let me know, and maybe it’ll motivate me to finish them up:

  • Supercharge Your Remote Tests with the Java Augmenter
  • What the Test Pyramid Gets Wrong
  • Parallel Execution in Selenium 4 with JUnit 5
  • Accessibility in Selenium with Sa11y library
  • Attributes are not Properties

Follow me if you found this article interesting,
or answer one of these questions in the comments or on Twitter: