Case Study: Count the number of “shakes” within “Shake it Off”’s lyrics on a webpage.

Using Ruby’s scan and some regex for text counting.

Courtney Zhan
3 min readAug 10, 2024

The lyrics of “Shake it Off” is on a web page.

The task is to write a Selenium WebDriver test script to perform an assertion: find out the occurrences of word “shake”.

Test Design

  1. Navigate to the target web page
  2. Extract the lyric text
  3. Count of the word “shake”

There is no string counting function in Selenium WebDriver. So, we’ll use Selenium WebDriver to get the text (from the web page), then use Ruby’s text manipulation functions to do the counting.

Test Steps

I will write this test script in raw Selenium WebDriver + RSpec, using TestWise IDE.

1. Navigate to target web page

driver.get("https://agileway.com.au/demo/shake-it-off")

2. Extract the lyric text

Using driver.page_source is not correct, as there might be the word “shake” somewhere in a hidden division. As a generic rule, we try to be as specific as possible.

Getting the text content of the <pre> here is better.

Some might think, “but there are no unique identifier or attributes?”. We can use the tag name.

lyrics_text = driver.find_element(:tag_name, "pre").text

3. Count of the word “shake” using Ruby’s “scan” function

Ruby is a powerful text manipulation language with intuitive syntax.

Ruby’s scan method returns a list of all the matches of a provided string or regex.

lyrics_text.scan("shake") #=> ["shake", "shake", ...]

Since we now have the list of matches, we can now use the count function to see how many “shake”s there are.

num_shakes = lyrics_text.scan("shake").count #=> 63

Finally, to round off the test, let’s do an assertion:

expect(num_shakes).to eq(63)

Handle Complex Scenarios with Regular Expression

Now, let’s extend the original task for further scenarios:

4. Count the case-insensitive string “shake”

The i in below regex means case-insensitive.

num_shakes_insensitive = lyrics_text.scan(/shake/i).count
expect(num_shakes).to eq(70)

5. Count the string “Shake it off”

expect(lyrics_text.scan("Shake it off").count).to eq(6)

6. Count the string “Shake it off” case-insensitive

“Shake it off”, “shake it Off”, or “shake it off” are all OK. \s mean a white space character.

expect(lyrics_text.scan(/Shake\sit\soff/i).count).to eq(36)

7. Count the whole word “to”

Please note that this exercise matches the word “to”, not the string. There are several words in the lyrics containing the string “to”, such “too”, “stop” that we want to exclude. For this, use \b for word-boundaries.

expect(lyrics_text.scan(/\bto\b/).count).to eq(4)

For more info about using Regular Expression in test automation, check out this article, Use Regular Expressions in Test Automation.

Related reading:

--

--