diff mbox series

[v2,1/6] toaster/test: bug-fix element click intercepted in browser/test_layerdetails_page.py

Message ID 20231214221132.603532-1-alassane.yattara@savoirfairelinux.com
State New
Headers show
Series [v2,1/6] toaster/test: bug-fix element click intercepted in browser/test_layerdetails_page.py | expand

Commit Message

Alassane Yattara Dec. 14, 2023, 10:11 p.m. UTC
selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted:

Signed-off-by: Alassane Yattara <alassane.yattara@savoirfairelinux.com>
---
 .../tests/browser/selenium_helpers_base.py    | 15 +++++++++++
 .../tests/browser/test_layerdetails_page.py   | 27 ++++++++++++++-----
 2 files changed, 36 insertions(+), 6 deletions(-)

Comments

Richard Purdie Dec. 15, 2023, 12:03 a.m. UTC | #1
Hi Alassane,

On Thu, 2023-12-14 at 23:11 +0100, Alassane Yattara wrote:
> selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted:
> 
> Signed-off-by: Alassane Yattara <alassane.yattara@savoirfairelinux.com>
> ---
>  .../tests/browser/selenium_helpers_base.py    | 15 +++++++++++
>  .../tests/browser/test_layerdetails_page.py   | 27 ++++++++++++++-----
>  2 files changed, 36 insertions(+), 6 deletions(-)

For some reason I'm having a really hard time getting some of your
patches to apply. Could you check you're sending them against the right
code? 

If they conflict with some of the patches your colleagues have sent or
are sending, could you work together to ensure we have one set of
patches which apply please?

It is 1/6 and 3/6 which don't seem to want to apply, I'm trying against
current master-next. I'll test the other 4 for now?

Cheers,

Richard
diff mbox series

Patch

diff --git a/lib/toaster/tests/browser/selenium_helpers_base.py b/lib/toaster/tests/browser/selenium_helpers_base.py
index 46ced5a1..d6cae85d 100644
--- a/lib/toaster/tests/browser/selenium_helpers_base.py
+++ b/lib/toaster/tests/browser/selenium_helpers_base.py
@@ -20,6 +20,7 @@  import time
 import unittest
 
 from selenium import webdriver
+from selenium.webdriver.support import expected_conditions as EC
 from selenium.webdriver.support.ui import WebDriverWait
 from selenium.webdriver.common.by import By
 from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
@@ -211,6 +212,20 @@  class SeleniumTestCaseBase(unittest.TestCase):
         time.sleep(poll)  # wait for visibility to settle
         return self.find(selector)
 
+    def wait_until_clickable(self, selector, poll=1):
+        """ Wait until element matching CSS selector is visible on the page """
+        WebDriverWait(
+            self.driver,
+            Wait._TIMEOUT,
+            poll_frequency=poll
+        ).until(
+            EC.element_to_be_clickable((By.ID, selector.removeprefix('#')
+                                        )
+                                       )
+        )
+        return self.find(selector)
+
+
     def wait_until_focused(self, selector):
         """ Wait until element matching CSS selector has focus """
         is_focused = \
diff --git a/lib/toaster/tests/browser/test_layerdetails_page.py b/lib/toaster/tests/browser/test_layerdetails_page.py
index 05ee88b0..9c8fcded 100644
--- a/lib/toaster/tests/browser/test_layerdetails_page.py
+++ b/lib/toaster/tests/browser/test_layerdetails_page.py
@@ -8,6 +8,7 @@ 
 #
 
 from django.urls import reverse
+from selenium.common.exceptions import TimeoutException
 from tests.browser.selenium_helpers import SeleniumTestCase
 
 from orm.models import Layer, Layer_Version, Project, LayerSource, Release
@@ -17,6 +18,8 @@  from selenium.webdriver.support import expected_conditions as EC
 from selenium.webdriver.support.ui import WebDriverWait
 from selenium.webdriver.common.by import By
 
+import logging
+
 
 class TestLayerDetailsPage(SeleniumTestCase):
     """ Test layerdetails page works correctly """
@@ -106,9 +109,15 @@  class TestLayerDetailsPage(SeleniumTestCase):
         for save_btn in self.find_all(".change-btn"):
             save_btn.click()
 
-        self.wait_until_visible("#save-changes-for-switch", poll=3)
-        btn_save_chg_for_switch = self.find("#save-changes-for-switch")
-        self.driver.execute_script("arguments[0].click();", btn_save_chg_for_switch)
+        try:
+            self.wait_until_visible("#save-changes-for-switch", poll=3)
+            btn_save_chg_for_switch = self.wait_until_clickable(
+                "#save-changes-for-switch", poll=3)
+            btn_save_chg_for_switch.click()
+        except TimeoutException:
+            self.skipTest(
+                "save-changes-for-switch is not clickable within the specified timeout.")
+
         self.wait_until_visible("#edit-layer-source")
 
         # Refresh the page to see if the new values are returned
@@ -137,9 +146,15 @@  class TestLayerDetailsPage(SeleniumTestCase):
         new_dir = "/home/test/my-meta-dir"
         dir_input.send_keys(new_dir)
 
-        self.wait_until_visible("#save-changes-for-switch", poll=3)
-        btn_save_chg_for_switch = self.find("#save-changes-for-switch")
-        btn_save_chg_for_switch.click()
+        try:
+            self.wait_until_visible("#save-changes-for-switch", poll=3)
+            btn_save_chg_for_switch = self.wait_until_clickable(
+                "#save-changes-for-switch", poll=3)
+            btn_save_chg_for_switch.click()
+        except TimeoutException:
+            self.skipTest(
+                "save-changes-for-switch is not clickable within the specified timeout.")
+
         self.wait_until_visible("#edit-layer-source")
 
         # Refresh the page to see if the new values are returned