Katalon addon unable to record reproducible test

I have been trying to record a test using the “Katalon Recorder 5.3.21” on MacOS 10.14.6 using chrome Version 87.0.4280.88 .

Reproducible:

  1. Go to page https://mybinder.org/v2/gh/jupyterlab/jupyterlab-demo/master?urlpath=lab/tree/demo and wait until the jupyterLab notebook loads
  2. Click on “Run” in the upper left
  3. Click on “Run Selected Cell and All Below”

The exported code (in python) looks something like the following:

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
import unittest, time, re

class UntitledTestCase(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.implicitly_wait(30)
        self.base_url = "https://www.google.com/"
        self.verificationErrors = []
        self.accept_next_alert = True
    
    def test_untitled_test_case(self):
        driver = self.driver
        #driver.get("https://hub.gke2.mybinder.org/user/jupyterlab-jupyterlab-demo-tqynhcrn/lab")
        driver.get("https://mybinder.org/v2/gh/jupyterlab/jupyterlab-demo/master?urlpath=lab/tree/demo")

        # Wait for the page to be loaded
        xpath = "//button[@title='Save the notebook contents and create checkpoint']"
        element = WebDriverWait(driver, 600).until(
            EC.presence_of_element_located((By.XPATH, xpath))
        )
        time.sleep(10)
        print("Page loaded")

        driver.find_element_by_xpath("//div[@id='jp-MainMenu']/ul/li[4]/div[2]").click()
        
        time.sleep(600)
    
    def is_element_present(self, how, what):
        try: self.driver.find_element(by=how, value=what)
        except NoSuchElementException as e: return False
        return True
    
    def is_alert_present(self):
        try: self.driver.switch_to_alert()
        except NoAlertPresentException as e: return False
        return True
    
    def close_alert_and_get_its_text(self):
        try:
            alert = self.driver.switch_to_alert()
            alert_text = alert.text
            if self.accept_next_alert:
                alert.accept()
            else:
                alert.dismiss()
            return alert_text
        finally: self.accept_next_alert = True
    
    def tearDown(self):
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":
    unittest.main()

The code has been slightly modified, as the script does not seem to wait until the page is loaded.

However, as you can see for yourself, the action to “Run Selected Cell and All Below” is not executed. The recorded actions are not correctly played back.

It hangs at the following stage:

How can this be fixed?

I could reproduce your case using Chrome + Katalon Recorder. If found that the action to “Run Selected Cell and All Below” is not found in the generated code. Recorder tool failed to generate the action.

But why it failed? I looked at the page you presented using Google DevTools.

Screenshot1:

In the Screenshot1, the dropdown menu of Run is opened and visible. You can find the following <div> element is present in the page. This <div> element is the container of the dropdown menu.

<div tabindex="-1" 
    class="lm-Widget p-Widget lm-Menu p-Menu lm-MenuBar-menu p-MenuBar-menu" 
    style="max-height: 402px; top: 28px; left: 158.594px;"
    >...</div>

Screenshot2:

In the Screenshot2, the Run label is there but the dropdown menu is not there, invisible. At this situation you should see that the <div> element of the dropdown menu is NOT present in the page.


Based on this observation, I guess as follows:

  1. Possibly, Katalon Recorder tool processes the DOM only when the page is initially loaded. The tool does not recognise how the DOM is dynamically changed on user’s operation such as clicking the Run menu.
  2. When the page is loaded the <div class="lm-Menu"> element is not there in the DOM. Therefore the tool does not recognise the <div class="lm-Menu"> element.
  3. When you click the Run menu, yes, the <div class="lm-Menu"> element newly appears but the Katalon Recorder tool can not recognise the inserted element.
  4. When you click any one item in the dropdown menu, the tool can not react and generate any code because the tool knows nothing about the <div class="lm-Menu"> element .

IMHO

  • Jupyter Notebook is too dynamic for the Katalon Recorder to record fully.
  • You shouldn’t expect much from the “Recording” feature.
  • However, you can manually write testing code for the <div class="lm-Menu"> element, so that you should be able to complete your test. Good enough, isn’t it?

@ThanhTo
@duyluong

I wrote

Am I right?

Or is there any bug here?