Upgrade to Pro — share decks privately, control downloads, hide ads and more …

There is no I in Al

There is no I in Al

A talk about Alumnium - an open-source AI-powered test automation tool for Selenium (https://alumnium.ai) for SeleniumConf 2025 (https://seleniumconf.com)

Recording: https://www.youtube.com/watch?v=9-e8K_KF904

Alex Rodionov

March 27, 2025
Tweet

More Decks by Alex Rodionov

Other Decks in Technology

Transcript

  1. class TodoTest(TestCase) : def setUp(self) : driver = Chrome() driver.get("https:

    // todomvc.com/examples/vue/dist") self.page = TasksPage(driver)
  2. class TodoTest(TestCase) : def setUp(self) : driver = Chrome() driver.get("https:

    // todomvc.com/examples/vue/dist") self.page = TasksPage(driver) def test_add_new_task(self) :
  3. class TodoTest(TestCase) : def setUp(self) : driver = Chrome() driver.get("https:

    // todomvc.com/examples/vue/dist") self.page = TasksPage(driver) def test_add_new_task(self) : self.page.create_new_task("Buy milk")
  4. class TodoTest(TestCase) : def setUp(self) : driver = Chrome() driver.get("https:

    // todomvc.com/examples/vue/dist") self.page = TasksPage(driver) def test_add_new_task(self) : self.page.create_new_task("Buy milk") assert "Buy milk" in self.page.get_tasks()
  5. class TodoTest(TestCase) : def setUp(self) : driver = Chrome() driver.get("https:

    // todomvc.com/examples/vue/dist") self.page = TasksPage(driver) def test_add_new_task(self) : self.page.create_new_task("Buy milk") assert "Buy milk" in self.page.get_tasks() assert not self.page.is_task_completed("Buy milk")
  6. class TasksPage: def _ _ init _ _ (self, driver)

    : self.driver = driver def create_new_task(self, title) :
  7. class TasksPage: def _ _ init _ _ (self, driver)

    : self.driver = driver def create_new_task(self, title) : input = self.driver.find_element(By.CSS_SELECTOR, ".new - todo") input.send_keys(title, Keys.RETURN)
  8. class TasksPage: def _ _ init _ _ (self, driver)

    : self.driver = driver def create_new_task(self, title) : input = self.driver.find_element(By.CSS_SELECTOR, ".new - todo") input.send_keys(title, Keys.RETURN) def get_tasks(self) :
  9. class TasksPage: def _ _ init _ _ (self, driver)

    : self.driver = driver def create_new_task(self, title) : input = self.driver.find_element(By.CSS_SELECTOR, ".new - todo") input.send_keys(title, Keys.RETURN) def get_tasks(self) : return self.driver.find_elements(By.CSS_SELECTOR, ".todo - list li").map(lambda e: e.text)
  10. class TasksPage: def _ _ init _ _ (self, driver)

    : self.driver = driver def create_new_task(self, title) : input = self.driver.find_element(By.CSS_SELECTOR, ".new - todo") input.send_keys(title, Keys.RETURN) def get_tasks(self) : return self.driver.find_elements(By.CSS_SELECTOR, ".todo - list li").map(lambda e: e.text) def is_task_completed(self, title) :
  11. class TasksPage: def _ _ init _ _ (self, driver)

    : self.driver = driver def create_new_task(self, title) : input = self.driver.find_element(By.CSS_SELECTOR, ".new - todo") input.send_keys(title, Keys.RETURN) def get_tasks(self) : return self.driver.find_elements(By.CSS_SELECTOR, ".todo - list li").map(lambda e: e.text) def is_task_completed(self, title) : completed_tasks = self.driver.find_elements(By.CSS_SELECTOR, ".todo - list li.completed")
  12. class TasksPage: def _ _ init _ _ (self, driver)

    : self.driver = driver def create_new_task(self, title) : input = self.driver.find_element(By.CSS_SELECTOR, ".new - todo") input.send_keys(title, Keys.RETURN) def get_tasks(self) : return self.driver.find_elements(By.CSS_SELECTOR, ".todo - list li").map(lambda e: e.text) def is_task_completed(self, title) : completed_tasks = self.driver.find_elements(By.CSS_SELECTOR, ".todo - list li.completed") return title in completed_tasks.map(lambda e: e.text)
  13. TEST GENERATORS TEST RUNNERS Write a test 👇 Tool generates

    Selenium code using AI 👇 Run AI-POWERED TESTING TOOLS
  14. TEST GENERATORS TEST RUNNERS Write a test 👇 Tool generates

    Selenium code using AI 👇 Run Write a test 👇 Run 👇 Tool interacts with Selenium using AI AI-POWERED TESTING TOOLS
  15. AI-POWERED TESTING TOOLS 🛑 Expect tests in a certain format

    🛑 Don’t integrate with existing tests
  16. AI-POWERED TESTING TOOLS 🛑 Expect tests in a certain format

    🛑 Don’t integrate with existing tests 🛑 Require new infrastructure
  17. .DO(…) 🫵 Perform actions on the page 🎯 What you

    want, AI f igures out how al.do("create new task 'Buy milk'")
  18. .DO(…) 🫵 Perform actions on the page 🎯 What you

    want, AI f igures out how al.do("create new task 'Buy milk'") al.do("mark the 'Buy milk' task as completed")
  19. .DO(…) 🫵 Perform actions on the page 🎯 What you

    want, AI f igures out how al.do("create new task 'Buy milk'") al.do("mark the 'Buy milk' task as completed") al.do("delete the 'Buy milk' task")
  20. .CHECK(…) 🔮 Verify conditions on the page 🎯 What must

    be true, AI f igures out if al.check("task 'Buy milk' is pending") al.check("task 'Buy bread' is completed")
  21. .GET(…) 🤏 Extract data from the page 🎯 What you

    need, AI retrieves it al.get("number of tasks") # 2
  22. .GET(…) 🤏 Extract data from the page 🎯 What you

    need, AI retrieves it al.get("number of tasks") # 2 al.get("titles of tasks") # ["Buy milk", "Buy bread"]
  23. .GET(…) 🤏 Extract data from the page 🎯 What you

    need, AI retrieves it al.get("number of tasks") # 2 al.get("titles of tasks") # ["Buy milk", "Buy bread"] al.get("titles of pending tasks") # ["Buy milk"] al.get("titles of completed tasks") # ["Buy bread"]
  24. class TasksPage: def _ _ init _ _ (self, driver)

    : self.driver = driver def create_new_task(self, title) : input = self.driver.find_element(By.CSS_SELECTOR, ".new - todo") input.send_keys(title, Keys.RETURN) def get_tasks(self) : return self.driver.find_elements(By.CSS_SELECTOR, ".todo - list li").map(lambda e: e.text) def is_task_completed(self, title) : completed_tasks = self.driver.find_elements(By.CSS_SELECTOR, ".todo - list li.completed") return title in completed_tasks.map(lambda e: e.text)
  25. class TasksPage: def _ _ init _ _ (self, driver)

    : self.driver = driver def create_new_task(self, title) : input = self.driver.find_element(By.CSS_SELECTOR, ".new - todo") input.send_keys(title, Keys.RETURN) def get_tasks(self) : return self.driver.find_elements(By.CSS_SELECTOR, ".todo - list li").map(lambda e: e.text) def is_task_completed(self, title) : completed_tasks = self.driver.find_elements(By.CSS_SELECTOR, ".todo - list li.completed") return title in completed_tasks.map(lambda e: e.text)
  26. class TodoTest(TestCase) : def setUp(self) : driver = Chrome() driver.get("https:

    // todomvc.com/examples/vue/dist") self.page = TasksPage(driver) def test_add_new_task(self) : self.page.create_new_task(“Buy milk") assert "Buy milk" in self.page.get_tasks() assert not self.page.is_task_completed("Buy milk")
  27. class TodoTest(TestCase) : def setUp(self) : driver = Chrome() driver.get("https:

    // todomvc.com/examples/vue/dist") self.al = Alumni(driver) def test_add_new_task(self) : self.page.create_new_task("Buy milk") assert "Buy milk" in self.page.get_tasks() assert not self.page.is_task_completed("Buy milk")
  28. class TodoTest(TestCase) : def setUp(self) : driver = Chrome() driver.get("https:

    // todomvc.com/examples/vue/dist") self.al = Alumni(driver) def test_add_new_task(self) : self.page.create_new_task("Buy milk") assert "Buy milk" in self.page.get_tasks() assert not self.page.is_task_completed("Buy milk")
  29. class TodoTest(TestCase) : def setUp(self) : driver = Chrome() driver.get("https:

    // todomvc.com/examples/vue/dist") self.al = Alumni(driver) def test_add_new_task(self) : self.al.do("create new task 'Buy milk'") assert "Buy milk" in self.page.get_tasks() assert not self.page.is_task_completed("Buy milk")
  30. class TodoTest(TestCase) : def setUp(self) : driver = Chrome() driver.get("https:

    // todomvc.com/examples/vue/dist") self.al = Alumni(driver) def test_add_new_task(self) : self.al.do("create new task 'Buy milk'") assert "Buy milk" in self.page.get_tasks() assert not self.page.is_task_completed("Buy milk")
  31. class TodoTest(TestCase) : def setUp(self) : driver = Chrome() driver.get("https:

    // todomvc.com/examples/vue/dist") self.al = Alumni(driver) def test_add_new_task(self) : self.al.do("create new task 'Buy milk'") assert "Buy milk" in self.al.get("titles of tasks") assert not self.page.is_task_completed("Buy milk")
  32. class TodoTest(TestCase) : def setUp(self) : driver = Chrome() driver.get("https:

    // todomvc.com/examples/vue/dist") self.al = Alumni(driver) def test_add_new_task(self) : self.al.do("create new task 'Buy milk'") assert "Buy milk" in self.al.get("titles of tasks") assert not self.page.is_task_completed("Buy milk")
  33. class TodoTest(TestCase) : def setUp(self) : driver = Chrome() driver.get("https:

    // todomvc.com/examples/vue/dist") self.al = Alumni(driver) def test_add_new_task(self) : self.al.do("create new task 'Buy milk'") assert "Buy milk" in self.al.get("titles of tasks”) self.al.check("task 'Buy milk' is not completed")
  34. class TodoTest(TestCase) : def setUp(self) : driver = Chrome() driver.get("https:

    // todomvc.com/examples/vue/dist") self.al = Alumni(driver) def test_add_new_task(self) : self.al.do("create new task 'Buy milk'") assert "Buy milk" in self.al.get("titles of tasks”) self.al.check("task 'Buy milk' is not completed")
  35. Less code to write and support Use in existing tests

    YOU ARE IN CONTROL! No new infrastructure* UMNIUM
  36. Less code to write and support Use in existing tests

    YOU ARE IN CONTROL! No new infrastructure* UMNIUM *access to AI provider is needed
  37. UMNIUM 3s 50s caching enabled caching disabled 🐋 Scale to

    complex web applications 🐢 Improve performance
  38. UMNIUM 🐋 Scale to complex web applications 🐢 Improve performance

    🏄 Support Firefox and Safari 📲 Support mobile platforms
  39. UMNIUM 🐋 Scale to complex web applications 🐢 Improve performance

    🏄 Support Firefox and Safari 📲 Support mobile platforms 🐍 Support other languages