diff --git a/Skeleton3/html5/common/skel/source/class/skel/simulation/Util.py b/Skeleton3/html5/common/skel/source/class/skel/simulation/Util.py index 9cdbad73..562d455c 100644 --- a/Skeleton3/html5/common/skel/source/class/skel/simulation/Util.py +++ b/Skeleton3/html5/common/skel/source/class/skel/simulation/Util.py @@ -3,22 +3,27 @@ from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.action_chains import ActionChains +from selenium.webdriver.support import expected_conditions as EC +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.common.by import By # Adjust hyperlinks as necessary def setUp(self, browser): # Running on Ubuntu (Firefox) if browser == 1: self.driver = webdriver.Firefox() - self.driver.get("http://localhost:8080/pureweb/app?client=html5&name=CartaSkeleton3&username=dan12&password=Cameron21") - self.driver.implicitly_wait(10) + #self.driver.get("http://localhost:8080/pureweb/app?client=html5&name=CartaSkeleton3&username=dan12&password=Cameron21") + #self.driver.get("http://199.116.235.162:8080/pureweb/app/unix:1.0/2/20801/2?client=html5&name=CartaSkeleton3") + self.driver.get("http://142.244.190.171:8080/pureweb/app/unix:0.0/4/143/1?client=html5&name=CartaSkeleton3") + self.driver.implicitly_wait(20) # Running on Mac (Chrome) if browser == 2: # Change the path to where chromedriver is located chromedriver = "/Users/Madhatter/Downloads/chromedriver" self.driver = webdriver.Chrome(chromedriver) - self.driver.get("http://199.116.235.162:8080/pureweb/app/unix:1.0/3/9737/6?client=html5&file=/home/ubuntu/Dropbox/CARTA-data/&name=CartaSkeleton3") - time.sleep(5) + #self.driver.get("http://199.116.235.162:8080/pureweb/app/unix:1.0/2/20801/2?client=html5&name=CartaSkeleton3") + self.driver.get("http://142.244.190.171:8080/pureweb/app/unix:0.0/4/143/1?client=html5&name=CartaSkeleton3") self.driver.implicitly_wait(20) # Clear text box and change value of the text box @@ -26,7 +31,7 @@ def setUp(self, browser): # default text, therefore a manual method has been implemented def _changeElementText(self, driver, elementText, inputValue): # First click on the element and get the element value - ActionChains(driver).click( elementText ) + ActionChains(driver).move_to_element( elementText ).click( elementText ).perform() elementValue = elementText.get_attribute("value") # Clear the content in the text box for x in range(0, len(str(elementValue))): @@ -35,103 +40,98 @@ def _changeElementText(self, driver, elementText, inputValue): # otherwise Google Chrome browser will not receive the correct value elementText.send_keys( inputValue ) elementText.send_keys( Keys.ENTER ) - time.sleep(4) # Get the new element value elementValue = elementText.get_attribute("value") return elementValue def animation_to_image_window(unittest, driver): - animWindow = driver.find_element_by_xpath("//div[@qxclass='skel.widgets.Window.DisplayWindowAnimation']") + animWindow = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowAnimation']"))) unittest.assertIsNotNone( animWindow, "Could not find animation window") ActionChains(driver).click( animWindow ).perform() # Make sure the animation window is enabled by clicking an element within the window # Chrome browser is unable to enable the animation window by clicking on the window - channelText = driver.find_element_by_id("ChannelIndexText") + channelText = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "ChannelIndexText"))) ActionChains(driver).click( channelText).perform() - ActionChains(driver).context_click(channelText).send_keys( Keys.ARROW_RIGHT ).send_keys(Keys.ARROW_RIGHT).send_keys( Keys.ENTER ).perform() - time.sleep(2) + ActionChains(driver).context_click( channelText ).send_keys(Keys.ARROW_RIGHT).send_keys(Keys.ARROW_RIGHT).send_keys(Keys.ENTER).perform() def get_window_count(unittest, driver): - windowList = driver.find_elements_by_xpath("//div[@class='qx-window']") + windowList = driver.find_elements_by_xpath("//div[@qxclass='qx.ui.window.Desktop']") windowCount = len( windowList ) return windowCount - + #Set a custom layout with the given number of rows and columns def layout_custom(self, driver, rows, cols ): - + + # Wait for the image window to be present (ensures browser is fully loaded) + imageWindow = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) + imageWindow = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) + ActionChains(driver).click( imageWindow ) + # Find the layout button on the menu bar and click it. self._clickLayoutButton( driver ) # Find the layout custom button in the submenu and click it. - customLayoutButton = driver.find_element_by_xpath( "//div[text()='Custom Layout']/..") + customLayoutButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[text()='Custom Layout']"))) self.assertIsNotNone( customLayoutButton, "Could not find custom layout button in submenu") - ActionChains(driver).click( customLayoutButton).perform() - - #Get the row count spin and set its value. - rowSpin = driver.find_element_by_xpath( "//div[starts-with(@id,'customLayoutRows')]/input") + ActionChains(driver).click( customLayoutButton ).perform() + + # Get the row count spin and set its value. + rowSpin = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[starts-with(@id,'customLayoutRows')]/input"))) self.assertIsNotNone( rowSpin, "Could not find custom layout row indicator") rowSpin.send_keys( Keys.BACK_SPACE ) - rowSpin.send_keys(str(rows)) + rowSpin.send_keys( str(rows) ) - #Get the column count spin and set its value. - colSpin = driver.find_element_by_xpath( "//div[starts-with(@id,'customLayoutCols')]/input") + # Get the column count spin and set its value. + colSpin = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[starts-with(@id,'customLayoutCols')]/input"))) self.assertIsNotNone( colSpin, "Could not find custom layout column indicator") - colSpin.send_keys(str(cols)) - colSpin.send_keys(Keys.ARROW_LEFT) + colSpin.send_keys( str(cols) ) + colSpin.send_keys( Keys.ARROW_LEFT ) colSpin.send_keys( Keys.BACK_SPACE ) - #Hit the ok button - okButton = driver.find_element_by_xpath( "//div[starts-with(@id,'customLayoutOK')]") - self.assertIsNotNone( okButton, "Could not find custom layout ok button") - ActionChains(driver).click(okButton).perform() - + # Close the custom layout dialog + closeButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[starts-with(@id,'customLayoutOK')]"))) + self.assertIsNotNone( closeButton, "Could not find close button") + ActionChains(driver).click(closeButton).perform() # Load an image def load_image(unittest, driver, imageName): - # Allow browser to fully load before continuing - time.sleep(10) - # If image is not specified, load default image # Change this to a test image available where the tests are running # Test image will ideally have more than 3 channels for a successful test run if imageName == "Default": imageName = "N15693D.fits" + # Wait 20 seconds for the imageWindow to appear on the page + imageWindow = WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) + # Find a window capable of loading an image and select the window - imageWindow = driver.find_element_by_id( "CasaImageLoader") - ActionChains(driver).click(imageWindow).perform() - time.sleep(10) + ActionChains(driver).click( imageWindow ).perform() + # Precaution, sometimes the driver does not enable the window when first clicks the window + ActionChains(driver).click( imageWindow ).perform() # Click the data button - dataButton = driver.find_element_by_xpath("//div[text()='Data']/..") + dataButton = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[text()='Data']/.."))) unittest.assertIsNotNone( dataButton, "Could not click data button in the context menu") ActionChains(driver).click(dataButton).perform() - time.sleep(5) # Look for the open button and click it to open the file dialog. - openDataButton = driver.find_element_by_xpath("//div/div[text()='Open...']/..") + openDataButton = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div/div[text()='Open...']/.."))) unittest.assertIsNotNone(openDataButton, "Could not click open button on data subcontext menu.") ActionChains(driver).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - #ActionChains(driver).click(openDataButton).perform() - time.sleep(5) - - # Getting element not found in cache without this. - driver.implicitly_wait(20) # Select the specific image - loadButton = driver.find_element_by_id( "loadFileButton") - imageLocator = "//div[text()='"+imageName+"']" - fileDiv = driver.find_element_by_xpath( imageLocator ) + loadButton = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.ID, "loadFileButton"))) + fileDiv = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[text()='"+imageName+"']"))) driver.execute_script( "arguments[0].scrollIntoView(true);", fileDiv) fileDiv.click() - #Click the load button + # Click the load button loadButton = driver.find_element_by_id( "loadFileButton") unittest.assertIsNotNone(loadButton, "Could not find load button to click") loadButton.click() - #Now close the file dialog + # Now close the file dialog closeButton = driver.find_element_by_id( "closeFileLoadButton") unittest.assertIsNotNone(loadButton, "Could not find button to close the file browser") closeButton.click() @@ -141,63 +141,63 @@ def load_image(unittest, driver, imageName): unittest.assertIsNotNone(viewElement, "Could not find view element on page.") imageElement = driver.find_element_by_id("pwUID0") unittest.assertIsNotNone(imageElement, "Could not find image on the page") - time.sleep(5) -# Add a window, convert the window to an image window -# Use the new image window to load an image -def load_image_different_window(unittest, driver, imageName): - # Allow browser to fully load before continuing - time.sleep(10) - - # Find and click on the image window - imageWindow = driver.find_element_by_id( "CasaImageLoader") - unittest.assertIsNotNone( imageWindow, "Could not find image display window") - ActionChains(driver).click( imageWindow ).perform() + return imageWindow +# Adds a window below the main image viewer +# Return the window for future actions +def add_window(unittest, driver): # Click the Window button - windowButton = driver.find_element_by_xpath( "//div[text()='Window']/..") - unittest.assertIsNotNone( windowButton, "Could not click window button in the context menu") + windowButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='qx.ui.toolbar.MenuButton']/div[text()='Window']/.."))) + unittest.assertIsNotNone( windowButton, "Could not find window button in the context menu") ActionChains(driver).click(windowButton).perform() - + # Look for the add button in the submenu. - addButton = driver.find_element_by_xpath( "//div/div[text()='Add']/..") + addButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div/div[text()='Add']/.."))) unittest.assertIsNotNone( addButton, "Could not click minimize button on window subcontext menu.") - ActionChains(driver).click( addButton ).perform() - - # Choose to add at the bottom - ActionChains( driver).send_keys( Keys.ARROW_RIGHT ).send_keys( Keys.ENTER ).perform() - time.sleep(2) + ActionChains(driver).click( addButton ).send_keys(Keys.ARROW_RIGHT).send_keys(Keys.ENTER).perform() # Check that we now have a generic empty window in the display and that the window count has gone up by one. - emptyWindow = driver.find_element_by_xpath("//div[@qxclass='skel.widgets.Window.DisplayWindowGenericPlugin']") + emptyWindow = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowGenericPlugin']"))) unittest.assertIsNotNone( emptyWindow, "Could not find empty display window") - - # Select the empty window ActionChains(driver).click( emptyWindow ).perform() + + return emptyWindow + +# Add a window, convert the window to an image window +# Use the new image window to load an image +def load_image_different_window(unittest, driver, imageName): + # Find a window capable of loading an image. + imageWindow = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) + unittest.assertIsNotNone( imageWindow, "Could not find image display window") + ActionChains(driver).click(imageWindow).perform() + + # Add a new window below the main casa image window + emptyWindow = add_window( unittest, driver) # Change the plugin of the empty window to an image loader ActionChains(driver).context_click( emptyWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_RIGHT).send_keys(Keys.ENTER).perform() - time.sleep(2) - # Getting element not found in cache without this. - driver.implicitly_wait(10) - - imageWindow2 = driver.find_element_by_xpath("//div[@id='CasaImageLoader2']") + # Ensure that there is a new image window + imageWindow2 = WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.ID, "CasaImageLoader2"))) unittest.assertIsNotNone( imageWindow2, "Could not find second image window") + ActionChains(driver).click( imageWindow2 ).perform() + # Precaution, sometimes the driver does not enable the window when first clicks the window + ActionChains(driver).click( imageWindow2 ).perform() - # Load separate image in the window - ActionChains(driver).context_click(imageWindow2).send_keys(Keys.ARROW_DOWN).send_keys( - Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys( - Keys.ARROW_DOWN).send_keys(Keys.ARROW_RIGHT).send_keys(Keys.ENTER).perform() - - # Getting element not found in cache without this. - time.sleep(2) - driver.implicitly_wait(10) + # Click the data button + dataButton = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[text()='Data']/.."))) + unittest.assertIsNotNone( dataButton, "Could not click data button in the context menu") + ActionChains(driver).click(dataButton).perform() + + # Look for the open button and click it to open the file dialog. + openDataButton = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div/div[text()='Open...']/.."))) + unittest.assertIsNotNone(openDataButton, "Could not click open button on data subcontext menu.") + ActionChains(driver).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() # Select the specific image - loadButton = driver.find_element_by_id( "loadFileButton") - imageLocator = "//div[text()='"+imageName+"']" - fileDiv = driver.find_element_by_xpath( imageLocator ) + loadButton = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.ID, "loadFileButton"))) + fileDiv = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[text()='"+imageName+"']"))) driver.execute_script( "arguments[0].scrollIntoView(true);", fileDiv) fileDiv.click() @@ -208,7 +208,7 @@ def load_image_different_window(unittest, driver, imageName): # Now close the file dialog closeButton = driver.find_element_by_id( "closeFileLoadButton") - unittest.assertIsNotNone(closeButton, "Could not find button to close the file browser") + unittest.assertIsNotNone(loadButton, "Could not find button to close the file browser") closeButton.click() # Check that the window is displaying an image. diff --git a/Skeleton3/html5/common/skel/source/class/skel/simulation/selectBrowser.py b/Skeleton3/html5/common/skel/source/class/skel/simulation/selectBrowser.py index caa37c9b..6348f027 100644 --- a/Skeleton3/html5/common/skel/source/class/skel/simulation/selectBrowser.py +++ b/Skeleton3/html5/common/skel/source/class/skel/simulation/selectBrowser.py @@ -1,20 +1,21 @@ -# Allow user to select web browser +# Allow user to select web browser/timeout +# Create global variables +global browser +global sleep +# Allow user selection of global variable print("Please select a browser 1. Firefox 2. Google Chrome") -global browser browser = int(input("Browser selection: ")) +print("Timeouts? 1. Yes 2. No") +sleep = int(input("Timeouts: ")) + def _getBrowser(): return browser - - - - - - - - - - - +def _getSleep(): + if sleep == 1: + timeout = 2 + else: + timeout = 0 + return timeout \ No newline at end of file diff --git a/Skeleton3/html5/common/skel/source/class/skel/simulation/suite.py b/Skeleton3/html5/common/skel/source/class/skel/simulation/suite.py index e1078c3b..785cc535 100644 --- a/Skeleton3/html5/common/skel/source/class/skel/simulation/suite.py +++ b/Skeleton3/html5/common/skel/source/class/skel/simulation/suite.py @@ -16,16 +16,16 @@ def suite(): test_suite = unittest.TestSuite() + test_suite.addTest( unittest.makeSuite(tLoadImage.tLoadImage)) + test_suite.addTest( unittest.makeSuite(tWindow.tWindow)) test_suite.addTest( unittest.makeSuite(tLayout.tLayout)) test_suite.addTest( unittest.makeSuite(tView.tView)) - test_suite.addTest( unittest.makeSuite(tLoadImage.tLoadImage)) test_suite.addTest( unittest.makeSuite(tMenuToolVisibility.tMenuToolVisibility)) - test_suite.addTest( unittest.makeSuite(tWindow.tWindow)) test_suite.addTest( unittest.makeSuite(tAnimatorTapeDeck.tAnimatorTapeDeck)) test_suite.addTest( unittest.makeSuite(tAnimatorSettings.tAnimatorSettings)) test_suite.addTest( unittest.makeSuite(tAnimatorLinks.tAnimatorLinks)) - test_suite.addTest( unittest.makeSuite(tHistogram.tHistogram)) - test_suite.addTest( unittest.makeSuite(tStatistics.tStatistics)) + test_suite.addTest( unittest.makeSuite(tHistogram.tHistogram)) + #test_suite.addTest( unittest.makeSuite(tStatistics.tStatistics)) test_suite.addTest( unittest.makeSuite(tSnapshotData.tSnapshotData)) test_suite.addTest( unittest.makeSuite(tSnapshotLayout.tSnapshotLayout)) test_suite.addTest( unittest.makeSuite(tSnapshotPreferences.tSnapshotPreferences)) diff --git a/Skeleton3/html5/common/skel/source/class/skel/simulation/tAnimator.py b/Skeleton3/html5/common/skel/source/class/skel/simulation/tAnimator.py index 50c86add..0fc6bf87 100644 --- a/Skeleton3/html5/common/skel/source/class/skel/simulation/tAnimator.py +++ b/Skeleton3/html5/common/skel/source/class/skel/simulation/tAnimator.py @@ -5,6 +5,10 @@ from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.action_chains import ActionChains +from selenium.webdriver.support import expected_conditions as EC +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.common.by import By + # Animator functions class tAnimator(unittest.TestCase): @@ -29,23 +33,24 @@ def _isChecked(self, checkButton ): def _click(self, driver, checkButton): channelParent = checkButton.find_element_by_xpath( '..') ActionChains(driver).click( channelParent ).perform() - time.sleep(2) # Go to the first channel value of the test image def _getFirstValue(self, driver): - firstValueButton = driver.find_element_by_xpath( "//div[@class='qx-toolbar']/div[@qxclass='qx.ui.toolbar.Button'][1]") + timeout = selectBrowser._getSleep() + firstValueButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@class='qx-toolbar']/div[@qxclass='qx.ui.toolbar.Button'][1]"))) self.assertIsNotNone( firstValueButton, "Could not find button to go to the first valid value") driver.execute_script( "arguments[0].scrollIntoView(true);", firstValueButton) ActionChains(driver).click( firstValueButton ).perform() - time.sleep(2) + time.sleep( timeout ) # Go to the last channel value of the test image def _getLastValue(self, driver): - lastValueButton = driver.find_element_by_xpath( "//div[@class='qx-toolbar']/div[@qxclass='qx.ui.toolbar.Button'][5]") + timeout = selectBrowser._getSleep() + lastValueButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@class='qx-toolbar']/div[@qxclass='qx.ui.toolbar.Button'][5]"))) self.assertIsNotNone( lastValueButton, "Could not find button to go to the last valid value") driver.execute_script( "arguments[0].scrollIntoView(true);", lastValueButton) ActionChains(driver).click( lastValueButton ).perform() - time.sleep(2) + time.sleep( timeout ) # Get the current channel value of the test image def _getChannelValue(self, driver): @@ -65,45 +70,32 @@ def _getImageValue(self, driver): # Click the forward animation button def _animateForward(self, driver): - forwardAnimateButton = driver.find_element_by_xpath("//div[@class='qx-toolbar']/div[@class='qx-button'][2]") + forwardAnimateButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@class='qx-toolbar']/div[@class='qx-button'][2]"))) self.assertIsNotNone( forwardAnimateButton, "Could not find forward animation button") driver.execute_script( "arguments[0].scrollIntoView(true);", forwardAnimateButton) ActionChains(driver).click( forwardAnimateButton ).perform() # Change the Channel Animator to an Image Animator def channel_to_image_animator(self, driver): - # Find and click on the animation window - animWindow = driver.find_element_by_xpath( "//div[@qxclass='skel.widgets.Window.DisplayWindowAnimation']") + timeout = selectBrowser._getSleep() + # Find and click on the animation window + animWindow = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowAnimation']"))) self.assertIsNotNone( animWindow, "Could not find animation window") ActionChains(driver).click( animWindow ).perform() # Make sure the animation window is enabled by clicking an element within the window # From the context menu, uncheck the Channel Animator and check the Image Animator channelText = driver.find_element_by_id( "ChannelIndexText") + driver.execute_script( "arguments[0].scrollIntoView(true);", channelText) ActionChains(driver).click( channelText ).perform() ActionChains(driver).context_click( channelText ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys( Keys.ARROW_DOWN ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_RIGHT).send_keys(Keys.SPACE).send_keys( Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - time.sleep(2) + time.sleep(timeout) - # Set default settings - def _setDefaultSettings(self, driver): + # Open Settings + def _openSettings(self, driver): # Click Settings to reveal animation settings - settingsCheckBox = driver.find_element_by_xpath( "//div[@qxclass='qx.ui.form.CheckBox']/div[text()='Settings...']") + settingsCheckBox = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='qx.ui.form.CheckBox']/div[text()='Settings...']"))) self.assertIsNotNone( settingsCheckBox, "Could not find settings check box") ActionChains(driver).click( settingsCheckBox ).perform() - - # Ensure the set increment is set to 1 and the rate is set to 20 (default settings) - stepText = driver.find_element_by_xpath( "//div[@qxclass='skel.boundWidgets.Animator']/div[4]/div[2]/input") - self.assertIsNotNone( stepText, "Could not find step increment text") - driver.execute_script( "arguments[0].scrollIntoView(true);", stepText) - stepValue = stepText.get_attribute("value") - - if int(stepValue) != 1: - Util._changeElementText(self, driver, stepText, 1) - - rateText = driver.find_element_by_xpath(" //div[@qxclass='skel.boundWidgets.Animator']/div[4]/div[7]/input") - self.assertIsNotNone( rateText, "Could not find rate text to set the speed of the animation") - rateValue = rateText.get_attribute("value") - if int(rateValue) != 20: - Util._changeElementText(self, driver, rateText, 20) \ No newline at end of file diff --git a/Skeleton3/html5/common/skel/source/class/skel/simulation/tAnimatorLinks.py b/Skeleton3/html5/common/skel/source/class/skel/simulation/tAnimatorLinks.py index f6a03e23..96636851 100644 --- a/Skeleton3/html5/common/skel/source/class/skel/simulation/tAnimatorLinks.py +++ b/Skeleton3/html5/common/skel/source/class/skel/simulation/tAnimatorLinks.py @@ -5,6 +5,9 @@ from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.action_chains import ActionChains +from selenium.webdriver.support import expected_conditions as EC +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.common.by import By # Tests of Animator link functionality class tAnimatorLinks(unittest.TestCase): @@ -16,30 +19,25 @@ def setUp(self): # Test that the Animator will revert to default values after an image is removed def test_animatorRemoveImage(self): driver = self.driver - time.sleep(5) # Load an image Util.load_image( self, driver, "Default") # Click on the Data->Close->Image button to close the image. - imageWindow = driver.find_element_by_xpath( "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']") + imageWindow = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) ActionChains(driver).context_click( imageWindow ).send_keys(Keys.ARROW_DOWN).send_keys( Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys( Keys.ARROW_DOWN).send_keys(Keys.ARROW_RIGHT).send_keys(Keys.ARROW_DOWN).send_keys( Keys.ARROW_RIGHT).send_keys(Keys.ENTER).perform() - time.sleep(2) - # Find and click the upper spin box - upperBoundText = driver.find_element_by_xpath( "//div[@id='ChannelUpperBoundSpin']/input") + # Get the channel upper spin value + upperBoundText = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@id='ChannelUpperBoundSpin']/input"))) self.assertIsNotNone( upperBoundText, "Could not find upper bound spin box") driver.execute_script( "arguments[0].scrollIntoView(true);", upperBoundText) - upperBoundText.click() - - # Get the channel upper spin value upperBound = upperBoundText.get_attribute("value") # Click the Animation window so that its actions will be enabled - animWindow = driver.find_element_by_xpath( "//div[@qxclass='skel.widgets.Window.DisplayWindowAnimation']") + animWindow = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowAnimation']"))) self.assertIsNotNone( animWindow, "Could not find Animation window") # Make sure the Animation window is enabled by clicking an element within the window channelText = driver.find_element_by_id( "ChannelIndexText") @@ -51,187 +49,154 @@ def test_animatorRemoveImage(self): Keys.ARROW_RIGHT).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() # Find and click the upper spin box - imageUpperBoundText = driver.find_element_by_xpath( "//div[@id='ImageUpperBoundSpin']/input") + imageUpperBoundText = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@id='ImageUpperBoundSpin']/input"))) self.assertIsNotNone( imageUpperBoundText, "Could not find upper bound for image animator") driver.execute_script( "arguments[0].scrollIntoView(true);", imageUpperBoundText) - imageUpperBoundText.click() # Get the image upper spin value imageCount = imageUpperBoundText.get_attribute("value") # Check that the Animator is reset to default settings - self.assertEqual( int(imageCount), 0, "Image Animator did not reset after the image was removed") + self.assertEqual( int(imageCount), -1, "Image Animator did not reset after the image was removed") self.assertEqual( int(upperBound), 0, "Channel Animator did not reset after the image was removed") # Test that the Animator will update after an an image is loaded in the image window # Removal of the image should restore Animator to its default values def test_animatorAddImage(self): driver = self.driver - time.sleep(5) # Load an image Util.load_image( self, driver, "Default") - # Find and click the upper spin box - upperBoundText = driver.find_element_by_xpath( "//div[@id='ChannelUpperBoundSpin']/input") + # Record the upper bound spin box value of the first image + upperBoundText = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@id='ChannelUpperBoundSpin']/input"))) self.assertIsNotNone( upperBoundText, "Could not find upper bound spin box" ) driver.execute_script( "arguments[0].scrollIntoView(true);", upperBoundText) - upperBoundText.click() - - # Record the upper bound spin box value of the first image upperBound = upperBoundText.get_attribute("value") - print "Upper bound ", upperBound # In the same window, load a different image # The image should have a different number of channels Util.load_image( self, driver, "aH.fits") - time.sleep(2) # Check that the Animator upper bound spin box value is updated - upperBoundText.click() newUpperBound = upperBoundText.get_attribute("value") self.assertNotEqual( int(newUpperBound), int(upperBound), "Animator did not update after an image was added") - # Remove the image - imageWindow = driver.find_element_by_xpath( "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']") - ActionChains(driver).context_click(imageWindow).send_keys(Keys.ARROW_DOWN).send_keys( - Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys( - Keys.ARROW_DOWN).send_keys(Keys.ARROW_RIGHT).send_keys(Keys.ARROW_DOWN).send_keys( - Keys.ARROW_RIGHT).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - time.sleep(2) - - # Check that Animator is reset to the original upper bound after the second image is removed - upperBoundText.click() - newUpperBound = upperBoundText.get_attribute("value") - print "newUpperBound ", newUpperBound - self.assertEqual( int(newUpperBound), int(upperBound), "Animator did not update after image was removed") - # Test that the Animator will update when linked to an image in a separate window - - # Note: This is not a valid test because the link to the first image loader is not - # being removed. - def stest_animatorChangeLink(self): + def test_animatorChangeLink(self): driver = self.driver - time.sleep(5) - - # Load image in a separate window - imageWindow2 = Util.load_image_different_window( self, driver, "N15693D.fits") - - # Click on the Animator to enable it - animWindow = driver.find_element_by_xpath( "//div[@qxclass='skel.boundWidgets.Animator']") - self.assertIsNotNone( animWindow, "Could not find Animator window") - ActionChains(driver).click( animWindow ).perform() - # Make sure the animation window is enabled by clicking an element within the window - channelText = driver.find_element_by_id("ChannelIndexText") - ActionChains(driver).click( channelText ).perform() - - # Remove Animator link to the main image window - ActionChains(driver).context_click( channelText ).send_keys(Keys.ARROW_DOWN - ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - - # Change the link location of the animator to the second image - ActionChains(driver).move_to_element( animWindow ).click( animWindow ).drag_and_drop(animWindow, imageWindow2).perform() - time.sleep(2) - - # Exit Links - ActionChains(driver).move_to_element( animWindow ).context_click( animWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - - # Find and click the upper spin box - upperBoundText = driver.find_element_by_xpath( "//div[@id='ChannelUpperBoundSpin']/input") - self.assertIsNotNone( upperBoundText, "Could not find upper bound spin box" ) - driver.execute_script( "arguments[0].scrollIntoView(true);", upperBoundText) - - # Check that the animator updates to the second image - upperBound = upperBoundText.get_attribute("value") - self.assertNotEqual( int(upperBound), 0, "Channel animator did not update to second image values") - - # Show the Image Animator - ActionChains(driver).context_click( channelText ).send_keys(Keys.ARROW_DOWN).send_keys( - Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys( - Keys.ARROW_RIGHT).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - time.sleep(2) - - # Find and click the upper spin box - imageUpperBoundText = driver.find_element_by_xpath( "//div[@id='ImageUpperBoundSpin']/input") - self.assertIsNotNone( imageUpperBoundText, "Could not find upper bound for image animator") - driver.execute_script( "arguments[0].scrollIntoView(true);", imageUpperBoundText) - imageUpperBoundText.click() - - # Get the image upper spin value - imageCount = imageUpperBoundText.get_attribute("value") + browser = selectBrowser._getBrowser() - # Check that the Image Animator updates - self.assertEqual( int(imageCount), 0, "Image Animator did not update after image was linked") + # This test does not work on Firefox + if browser == 2: + # Load image in a separate window + imageWindow2 = Util.load_image_different_window( self, driver, "N15693D.fits") + + # Click on the Animator to enable it + animWindow = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.boundWidgets.Animator']"))) + self.assertIsNotNone( animWindow, "Could not find Animator window") + ActionChains(driver).click( animWindow ).perform() + # Make sure the animation window is enabled by clicking an element within the window + channelText = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "ChannelIndexText"))) + ActionChains(driver).click( channelText ).perform() + + # Remove Animator link to the main image window + ActionChains(driver).context_click( channelText ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() + + # Change the link location of the animator to the second image + ActionChains(driver).move_to_element( animWindow ).click( animWindow ).drag_and_drop(animWindow, imageWindow2).perform() + + # Exit Links + ActionChains(driver).move_to_element( animWindow ).context_click( animWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() + + # Find and click the upper spin box + upperBoundText = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@id='ChannelUpperBoundSpin']/input"))) + self.assertIsNotNone( upperBoundText, "Could not find upper bound spin box" ) + driver.execute_script( "arguments[0].scrollIntoView(true);", upperBoundText) + + # Check that the animator updates to the second image + upperBound = upperBoundText.get_attribute("value") + self.assertNotEqual( int(upperBound), 0, "Channel animator did not update to second image values") + + # Show the Image Animator + ActionChains(driver).context_click( channelText ).send_keys(Keys.ARROW_DOWN).send_keys( + Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys( + Keys.ARROW_RIGHT).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() + + # Find and click the upper spin box + imageUpperBoundText = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@id='ImageUpperBoundSpin']/input"))) + self.assertIsNotNone( imageUpperBoundText, "Could not find upper bound for image animator") + driver.execute_script( "arguments[0].scrollIntoView(true);", imageUpperBoundText) + imageUpperBoundText.click() + + # Get the image upper spin value + imageCount = imageUpperBoundText.get_attribute("value") + + # Check that the Image Animator updates + self.assertEqual( int(imageCount), 0, "Image Animator did not update after image was linked") # Test that we can remove a linked image from the Animator - - #Note: This is not a valid test because the link between the animator and main image window - # is not being removed. - def stest_animatorRemoveLink(self): + def test_animatorRemoveLink(self): driver = self.driver - time.sleep(5) + browser = selectBrowser._getBrowser() - # Click on the Animator to enable it - animWindow = driver.find_element_by_xpath( "//div[@qxclass='skel.boundWidgets.Animator']") - self.assertIsNotNone( animWindow, "Could not find Animator window") - ActionChains(driver).click( animWindow ).perform() - # Make sure the animation window is enabled by clicking an element within the window - channelText = driver.find_element_by_id("ChannelIndexText") - ActionChains(driver).click( channelText ).perform() + # This test does not work on Firefox + if browser == 2: + # Click on the Animator to enable it + animWindow = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.boundWidgets.Animator']"))) + self.assertIsNotNone( animWindow, "Could not find Animator window") + ActionChains(driver).click( animWindow ).perform() + # Make sure the animation window is enabled by clicking an element within the window + channelText = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "ChannelIndexText"))) + ActionChains(driver).click( channelText ).perform() - # Navigate to view links from the Animator settings - ActionChains(driver).context_click( channelText ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() + # Navigate to view links from the Animator settings + ActionChains(driver).context_click( channelText ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - # Remove Animator link to the main image window - ActionChains(driver).move_to_element( animWindow ).context_click( animWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() + # Remove Animator link to the main image window + ActionChains(driver).move_to_element( animWindow ).context_click( animWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - # Exit Links - ActionChains(driver).move_to_element( animWindow ).context_click( animWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() + # Exit Links + ActionChains(driver).move_to_element( animWindow ).context_click( animWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - # Load an image - Util.load_image(self, driver, "Default") + # Load an image + Util.load_image(self, driver, "Default") - # Find and click the upper spin box - upperBoundText = driver.find_element_by_xpath( "//div[@id='ChannelUpperBoundSpin']/input") - self.assertIsNotNone( upperBoundText, "Could not find upper bound spin box" ) - driver.execute_script( "arguments[0].scrollIntoView(true);", upperBoundText) + # Find and click the upper spin box + upperBoundText = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@id='ChannelUpperBoundSpin']/input"))) + self.assertIsNotNone( upperBoundText, "Could not find upper bound spin box" ) + driver.execute_script( "arguments[0].scrollIntoView(true);", upperBoundText) - # Check that the Channel Animator values remained at default values - upperBound = upperBoundText.get_attribute("value") - self.assertEqual( int(upperBound), -1, "Channel Animator is still linked to image after link was removed") + # Check that the Channel Animator values remained at default values + upperBound = upperBoundText.get_attribute("value") + self.assertEqual( int(upperBound), -1, "Channel Animator is still linked to image after link was removed") - # Show the Image Animator - ActionChains(driver).context_click( channelText ).send_keys(Keys.ARROW_DOWN).send_keys( - Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys( - Keys.ARROW_RIGHT).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - time.sleep(2) + # Show the Image Animator + ActionChains(driver).context_click( channelText ).send_keys(Keys.ARROW_DOWN).send_keys( + Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys( + Keys.ARROW_RIGHT).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - # Find and click the upper spin box - imageUpperBoundText = driver.find_element_by_xpath( "//div[@id='ImageUpperBoundSpin']/input") - self.assertIsNotNone( imageUpperBoundText, "Could not find upper bound for image animator") - driver.execute_script( "arguments[0].scrollIntoView(true);", imageUpperBoundText) - imageUpperBoundText.click() + # Find and click the upper spin box + imageUpperBoundText = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@id='ImageUpperBoundSpin']/input"))) + self.assertIsNotNone( imageUpperBoundText, "Could not find upper bound for image animator") + driver.execute_script( "arguments[0].scrollIntoView(true);", imageUpperBoundText) + imageUpperBoundText.click() - # Get the image upper spin value - imageCount = imageUpperBoundText.get_attribute("value") + # Get the image upper spin value + imageCount = imageUpperBoundText.get_attribute("value") - # Check that the Image Animator is at default values - self.assertEqual( int(imageCount), -1, "Image Animator is still linked to image after the link was removed") + # Check that the Image Animator is at default values + self.assertEqual( int(imageCount), -1, "Image Animator is still linked to image after the link was removed") # Test that we can add an Animator link to an image - - # Note: This test is not valid. The image animator link will remain at 0, even after a - # second link is established to a different window, because each window still has just one - # image. - def stest_animatorAddLink(self): + def test_animatorAddLink(self): driver = self.driver - time.sleep(5) # Load image in a separate window imageWindow2 = Util.load_image_different_window( self, driver, "N15693D.fits") # Click on the Animator to enable it - animWindow = driver.find_element_by_xpath( "//div[@qxclass='skel.boundWidgets.Animator']") + animWindow = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.boundWidgets.Animator']"))) self.assertIsNotNone( animWindow, "Could not find Animator window") ActionChains(driver).click( animWindow ).perform() # Make sure the animation window is enabled by clicking an element within the window @@ -243,32 +208,28 @@ def stest_animatorAddLink(self): # Add link from the Animator to the image ActionChains(driver).move_to_element( animWindow ).click( animWindow ).drag_and_drop( animWindow, imageWindow2).perform() - time.sleep(2) # Exit Links ActionChains(driver).move_to_element( animWindow ).context_click( animWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() # Find and click the upper spin box - upperBoundText = driver.find_element_by_xpath( "//div[@id='ChannelUpperBoundSpin']/input") + upperBoundText = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@id='ChannelUpperBoundSpin']/input"))) self.assertIsNotNone( upperBoundText, "Could not find upper bound spin box" ) driver.execute_script( "arguments[0].scrollIntoView(true);", upperBoundText) # Check that the animator updates upperBound = upperBoundText.get_attribute("value") - print "UpperBound ", upperBound self.assertNotEqual( int(upperBound), 0, "Channel animator did not update to linked image") # Show the Image Animator ActionChains(driver).context_click( channelText ).send_keys(Keys.ARROW_DOWN).send_keys( Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys( Keys.ARROW_RIGHT).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - time.sleep(2) # Find and click the upper spin box - imageUpperBoundText = driver.find_element_by_xpath( "//div[@id='ImageUpperBoundSpin']/input") + imageUpperBoundText = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@id='ImageUpperBoundSpin']/input"))) self.assertIsNotNone( imageUpperBoundText, "Could not find upper bound for image animator") driver.execute_script( "arguments[0].scrollIntoView(true);", imageUpperBoundText) - imageUpperBoundText.click() # Get the image upper spin value imageCount = imageUpperBoundText.get_attribute("value") diff --git a/Skeleton3/html5/common/skel/source/class/skel/simulation/tAnimatorSettings.py b/Skeleton3/html5/common/skel/source/class/skel/simulation/tAnimatorSettings.py index 9043e42e..48c01650 100644 --- a/Skeleton3/html5/common/skel/source/class/skel/simulation/tAnimatorSettings.py +++ b/Skeleton3/html5/common/skel/source/class/skel/simulation/tAnimatorSettings.py @@ -6,6 +6,9 @@ from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.action_chains import ActionChains +from selenium.webdriver.support import expected_conditions as EC +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.common.by import By # Tests of Animator Settings functionality class tAnimatorSettings(tAnimator.tAnimator): @@ -19,44 +22,42 @@ def setUp(self): # animator added/removed def test_animatorAddRemove(self): driver = self.driver - time.sleep(5) - # Wait 20 seconds when searching for an element if it is not immediately present. - # Otherwise, elements are not located on Chrome Driver - driver.implicitly_wait(20) + # Wait for the image window to be present (ensures browser is fully loaded) + imageWindow = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) # Click on Animator window so its actions will be enabled - animWindow = driver.find_element_by_xpath( "//div[@qxclass='skel.widgets.Window.DisplayWindowAnimation']") + animWindow = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowAnimation']"))) self.assertIsNotNone( animWindow, "Could not find Animator window") ActionChains(driver).click( animWindow ).perform() # Make sure the Animation window is enabled by clicking an element within the window - channelText = driver.find_element_by_id( "ChannelIndexText") + channelText = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "ChannelIndexText"))) ActionChains(driver).click( channelText ).perform() # Right click the toolbar to bring up the context menu - toolBar = driver.find_element_by_xpath( "//div[@qxclass='skel.widgets.Menu.ToolBar']") + toolBar = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Menu.ToolBar']"))) self.assertIsNotNone( toolBar, "Could not find the tool bar") ActionChains(driver).context_click(toolBar).perform() # Click the customize item on the menu - customizeButton = driver.find_element_by_xpath( "//div[text()='Customize...']/..") + customizeButton = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[text()='Customize...']/.."))) self.assertIsNotNone( customizeButton, "Could not find the customize button in context") ActionChains(driver).click( customizeButton ).perform() # First make sure animator is checked - animateButton = driver.find_element_by_xpath( "//div[text()='Animate']/preceding-sibling::div/div") + animateButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[text()='Animate']/preceding-sibling::div/div"))) self.assertIsNotNone( animateButton, "Could not find animate button in customize dialog") styleAtt = animateButton.get_attribute( "style"); if not "checked.png" in styleAtt: print "Clicking animate to make buttons visible on tool bar" - animateParent = animateButton.find_element_by_xpath( '..') + animateParent = animateButton.find_element_by_xpath( '..' ) driver.execute_script( "arguments[0].scrollIntoView(true);", animateParent) ActionChains(driver).click( animateParent ).perform() # Verify both the channel and image checkboxes are on the toolbar - channelCheck = driver.find_element_by_xpath( "//div[text()='Channel']/following-sibling::div[@class='qx-checkbox']") + channelCheck = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[text()='Channel']/following-sibling::div[@class='qx-checkbox']"))) self.assertIsNotNone( channelCheck, "Could not find animate channel check box on tool bar") - animateCheck = driver.find_element_by_xpath( "//div[text()='Image']/following-sibling::div[@class='qx-checkbox']") + animateCheck = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[text()='Image']/following-sibling::div[@class='qx-checkbox']"))) self.assertIsNotNone( animateCheck, "Could not find animate image check box on tool bar") # Uncheck both buttons @@ -74,20 +75,20 @@ def test_animatorAddRemove(self): # Check the image animate button and verify that the image animator shows up self._click( driver, animateCheck ) - imageAnimator = driver.find_element_by_xpath( "//div[@qxclass='skel.boundWidgets.Animator']/div/div[text()='Image']") + imageAnimator = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.boundWidgets.Animator']/div/div[text()='Image']"))) self.assertIsNotNone( imageAnimator, "Image animator did not appear") self._verifyAnimationCount( animWindow, 1) # Check the channel animator button and verify there are now two animators, one channel, one image. self._click( driver, channelCheck ) - channelAnimator = driver.find_element_by_xpath( "//div[@qxclass='skel.boundWidgets.Animator']/div/div[text()='Channel']") + channelAnimator = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.boundWidgets.Animator']/div/div[text()='Channel']"))) self.assertIsNotNone( channelAnimator, "Channel animator did not appear") self._verifyAnimationCount( animWindow, 2 ) # Test that the Channel Animator will update when the window image is switched def test_channelAnimatorChangeImage(self): driver = self.driver - time.sleep(5) + timeout = selectBrowser._getSleep() # Load two images # The images have different numbers of channels @@ -95,57 +96,58 @@ def test_channelAnimatorChangeImage(self): Util.load_image( self, driver, "m31_cropped.fits") # Show the Image Animator - channelText = driver.find_element_by_id( "ChannelIndexText") + channelText = driver.find_element_by_id("ChannelIndexText") ActionChains(driver).context_click( channelText ).send_keys(Keys.ARROW_DOWN).send_keys( Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys( Keys.ARROW_RIGHT).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - time.sleep(2) + time.sleep( timeout ) # Go to the first image - firstValueButton = driver.find_element_by_xpath( "//div[@qxclass='skel.boundWidgets.Animator'][2]/div[3]/div/div[1]") + firstValueButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.boundWidgets.Animator'][2]/div[3]/div/div[1]"))) self.assertIsNotNone( firstValueButton, "Could not find button to go to the first valid value") driver.execute_script( "arguments[0].scrollIntoView(true);", firstValueButton) ActionChains(driver).click( firstValueButton ).perform() - time.sleep(2) + time.sleep( timeout ) # Go to the last channel of the image - lastChannelButton = driver.find_element_by_xpath("//div[@qxclass='skel.boundWidgets.Animator'][1]/div[3]/div/div[7]") + lastChannelButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.boundWidgets.Animator'][1]/div[3]/div/div[7]"))) self.assertIsNotNone( lastChannelButton, "Could not find button to go to the first valid value") driver.execute_script( "arguments[0].scrollIntoView(true);", lastChannelButton) ActionChains(driver).click( lastChannelButton ).perform() - time.sleep(2) + time.sleep( timeout ) # Get the last channel value of the first image firstImageChannelValue = self._getChannelValue( driver ) # Go to the next image - nextImageButton = driver.find_element_by_id( "ImageTapeDeckIncrement") + nextImageButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "ImageTapeDeckIncrement"))) self.assertIsNotNone( nextImageButton, "Could not find Image Tape Deck Increment button") driver.execute_script( "arguments[0].scrollIntoView(true);", nextImageButton) nextImageButton.click() - time.sleep(2) - + time.sleep( timeout ) + # Go to the last channel of the image - lastChannelButton = driver.find_element_by_xpath("//div[@qxclass='skel.boundWidgets.Animator'][1]/div[3]/div/div[7]") + lastChannelButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.boundWidgets.Animator'][1]/div[3]/div/div[7]"))) self.assertIsNotNone( lastChannelButton, "Could not find button to go to the first valid value") driver.execute_script( "arguments[0].scrollIntoView(true);", lastChannelButton) ActionChains(driver).click( lastChannelButton ).perform() - time.sleep(2) - + time.sleep( timeout ) + # Get the channel upper spin box value of the second image # Check that the upper spin box value updated # Get the channel upper spin box value of the first image secondImageChannelValue = self._getChannelValue( driver ) - print 'Second image channel value', secondImageChannelValue self.assertNotEqual( int(secondImageChannelValue), int(firstImageChannelValue), "Channel value did not update after changing image in window") - # Test that the Channel Animator jump setting animates the first and last channel values + # Test that the Animator jump setting animates the first and last channel values # Under default settings, it takes roughly 2 seconds for the channel to change by 1 - def test_channelAnimatorJump(self): + def test_animatorJump(self): driver = self.driver - time.sleep(5) + timeout = selectBrowser._getSleep() # Open a test image so we have something to animate + Util.load_image( self, driver, "aH.fits") + Util.load_image( self, driver, "aJ.fits") Util.load_image( self, driver, "Default") # Record last channel value of the test image @@ -159,11 +161,11 @@ def test_channelAnimatorJump(self): print "Testing Channel Animator Jump Setting..." print "First channel value:", firstChannelValue, "Last channel value:", lastChannelValue - # Set default settings - self._setDefaultSettings( driver ) + # Open settings + self._openSettings( driver ) # In settings, click the Jump radio button. Scroll into view if button is not visible - jumpButton = driver.find_element_by_xpath( "//div[@qxclass='qx.ui.form.RadioButton']/div[text()='Jump']/following-sibling::div") + jumpButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='qx.ui.form.RadioButton']/div[text()='Jump']/following-sibling::div"))) self.assertIsNotNone( jumpButton, "Could not find the jump radio button in settings") driver.execute_script( "arguments[0].scrollIntoView(true);", jumpButton) ActionChains(driver).click( jumpButton ).perform() @@ -184,18 +186,59 @@ def test_channelAnimatorJump(self): print "Current channel", currChannelValue self.assertEqual( int(firstChannelValue), int(currChannelValue), "Channel Animator did not jump to first channel value") - # Test that the Channel Animator wrap setting returns to the first channel value + # Change the Channel Animator to an Image Animator + self.channel_to_image_animator( driver ) + + # Open settings + self._openSettings( driver ) + + # Record the last image value + self._getLastValue( driver ) + lastImageValue = self._getImageValue( driver ) + + # Record the first image value + self._getFirstValue( driver ) + firstImageValue = self._getImageValue( driver ) + + print "Testing Image Animator Jump Setting..." + print "First image value:", firstImageValue, "Last image value:", lastImageValue + + # In settings, click the Jump radio button. Scroll into view if button is not visible + jumpButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='qx.ui.form.RadioButton']/div[text()='Jump']/following-sibling::div"))) + self.assertIsNotNone( jumpButton, "Could not find the jump radio button in settings") + driver.execute_script( "arguments[0].scrollIntoView(true);", jumpButton) + ActionChains(driver).click( jumpButton ).perform() + + # Click the forward animate button + # Allow the animation for 2 seconds + self._animateForward( driver ) + time.sleep(2) + + # Check that the Animator is at the last image value + currImageValue = self._getImageValue( driver ) + print "Current image", currImageValue + self.assertEqual( int(lastImageValue), int(currImageValue), "Image Animator did not jump to last image" ) + + # Allow the animation for another 2 seconds + time.sleep(2) + currImageValue = self._getImageValue( driver ) + print "Current image", currImageValue + self.assertEqual( int(firstImageValue), int(currImageValue), "Image Animator did not jump to first image") + + # Test that the Animator wrap setting returns to the first channel value # after animating the last channel. Under default settings, it takes roughly 2 # seconds for the channel to change by 1 - def test_channelAnimatorWrap(self): + def test_animatorWrap(self): driver = self.driver - time.sleep(5) + timeout = selectBrowser._getSleep() # Open a test image so we have something to animate + Util.load_image( self, driver, "aH.fits") + Util.load_image( self, driver, "aJ.fits") Util.load_image( self, driver, "Default") - # Set default settings - self._setDefaultSettings( driver ) + # Open settings + self._openSettings( driver ) # Go to first channel value and record the first channel value of the test image self._getFirstValue( driver ) @@ -209,7 +252,7 @@ def test_channelAnimatorWrap(self): print "First channel value:", firstChannelValue, "Last channel value:", lastChannelValue # In settings, click the Wrap radio button. Scroll into view if button is not visible - wrapButton = wrapButton = driver.find_element_by_xpath( "//div[@qxclass='qx.ui.form.RadioButton']/div[text()='Wrap']/following-sibling::div") + wrapButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='qx.ui.form.RadioButton']/div[text()='Wrap']/following-sibling::div"))) self.assertIsNotNone( wrapButton, "Could not find wrap radio button in settings") driver.execute_script( "arguments[0].scrollIntoView(true);", wrapButton) ActionChains(driver).click( wrapButton ).perform() @@ -230,31 +273,73 @@ def test_channelAnimatorWrap(self): print "Current channel", currChannelValue self.assertGreater( int(currChannelValue), int(firstChannelValue), "Channel did not increase after animating first channel value") - # Test that the Channel Animator reverse setting animates in the reverse direction after + # Change the Channel Animator to an Image Animator + self.channel_to_image_animator( driver ) + + # Open settings + self._openSettings( driver ) + + # Record the first image value + self._getFirstValue( driver ) + firstImageValue = self._getImageValue( driver ) + + # Go to the last image and record the last image value + self._getLastValue( driver ) + lastImageValue = self._getImageValue( driver ) + + print "Testing Image Animator Wrap..." + print "First image value:", firstImageValue, "Last image value:", lastImageValue + + # In settings, click the Wrap radio button. Scroll into view if button is not visible + wrapButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='qx.ui.form.RadioButton']/div[text()='Wrap']/following-sibling::div"))) + self.assertIsNotNone( wrapButton, "Could not find wrap radio button in settings") + driver.execute_script( "arguments[0].scrollIntoView(true);", wrapButton) + ActionChains(driver).click( wrapButton ).perform() + + # Click the forward animate button + # Allow the animation for 2 seconds + self._animateForward( driver ) + time.sleep(2) + + # Check that the animator is at the first image value + currImageValue = self._getImageValue( driver ) + print "Current image", currImageValue + self.assertEqual( int(firstImageValue), int(currImageValue), "Image Animator did not wrap to first image") + + # Allow the animation for another 2 seconds + time.sleep(2) + currImageValue = self._getImageValue( driver ) + print "Current image", currImageValue + self.assertGreater( int(currImageValue), int(firstImageValue), "Image value did not increase after animating first image") + + # Test that the Animator reverse setting animates in the reverse direction after # reaching the last channel value. Under default settings, it takes roughly 4 seconds # for the channel to reverse direction from the last channel - def test_channelAnimatorReverse(self): + def test_animatorReverse(self): driver = self.driver - time.sleep(5) + timeout = selectBrowser._getSleep() # Open a test image so we have something to animate + Util.load_image( self, driver, "aH.fits") + Util.load_image( self, driver, "aJ.fits") Util.load_image( self, driver, "Default") - # Set default settings - self._setDefaultSettings( driver ) + # Open settings + self._openSettings( driver ) # Go to last channel value and record the last channel value of the test image self._getLastValue( driver ) lastChannelValue = self._getChannelValue( driver ) print "Testing Channel Animator Reverse Setting..." - print "Last channel value::", lastChannelValue + print "Last channel value:", lastChannelValue # In settings, click the Reverse radio button. Scroll into view if button is not visible - reverseButton = driver.find_element_by_xpath( "//div[@qxclass='qx.ui.form.RadioButton']/div[text()='Reverse']/following-sibling::div") + reverseButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='qx.ui.form.RadioButton']/div[text()='Reverse']/following-sibling::div"))) self.assertIsNotNone( reverseButton, "Could not find reverse radio button in settings") driver.execute_script( "arguments[0].scrollIntoView(true);", reverseButton) ActionChains(driver).click( reverseButton ).perform() + time.sleep(2) # Click the forward animate button # Allow the image to animate for 4 seconds (takes 4 seconds to reverse direction) @@ -267,7 +352,7 @@ def test_channelAnimatorReverse(self): self.assertGreater( int(lastChannelValue), int(currChannelValue), "Channel Animator did not reverse direction after animating last channel value") # Stop animation. Scroll into view if stop button cannot be seen - stopButton = driver.find_element_by_xpath( "//div[@qxclass='qx.ui.toolbar.Button'][3]") + stopButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='qx.ui.toolbar.Button'][3]"))) self.assertIsNotNone( stopButton, "Could not find stop button") driver.execute_script( "arguments[0].scrollIntoView(true);", stopButton) ActionChains(driver).click( stopButton ).perform() @@ -287,307 +372,11 @@ def test_channelAnimatorReverse(self): print "Current channel", currChannelValue self.assertGreater( int(currChannelValue), int(firstChannelValue), "Channel Animator did not increase channel after animating first channel value") - # Test that adjustment of Channel Animator rate will speed up/slow down channel animation - # Under default settings, it takes roughly 2 seconds for the channel to change by 1 - def test_channelAnimatorChangeRate(self): - driver = self.driver - time.sleep(5) - - # Open a test image so we have something to animate - Util.load_image( self, driver, "Default") - - # Set default settings - self._setDefaultSettings( driver ) - - # Go to first channel value and record the first channel value of the test image - self._getFirstValue( driver ) - firstChannelValue = self._getChannelValue( driver ) - - print "Testing Channel Animator Rate Setting..." - print "First channel value:", firstChannelValue - print "Default Rate = 20, New Rate = 50" - - # Allow image to animate for 2 seconds - self._animateForward( driver ) - time.sleep(3) - defaultRateValue = self._getChannelValue( driver ) - print "defaultRateValue", defaultRateValue - - # Stop animation. Scroll into view if the stop button cannot be seen - stopButton = driver.find_element_by_xpath("//div[@qxclass='qx.ui.toolbar.Button'][3]") - self.assertIsNotNone( stopButton, "Could not find stop button") - driver.execute_script( "arguments[0].scrollIntoView(true);", stopButton) - ActionChains(driver).click( stopButton ).perform() - - # Change the rate to 50 - rateText = driver.find_element_by_xpath( "//div[@qxclass='skel.boundWidgets.Animator']/div[4]/div[7]/input") - self.assertIsNotNone( rateText, "Could not find rate text to set the speed of the animation") - driver.execute_script( "arguments[0].scrollIntoView(true);", rateText) - ActionChains(driver).click( rateText ) - rateValue = Util._changeElementText(self, driver, rateText, 50) - - # Go to first channel value and animate for 2 seconds - self._getFirstValue( driver ) - self._animateForward( driver ) - time.sleep(3) - - # The channel should be at a higher channel value than the default rate value - newRateValue = self._getChannelValue( driver ) - print "newRateValue", newRateValue - self.assertGreater( int(newRateValue), int(defaultRateValue), "Rate value did not increase speed of channel animation") - - # Test that the Channel Animator Rate does not exceed boundary values - def test_channelAnimatorRateBoundary(self): - driver = self.driver - time.sleep(5) - - # Set default settings - self._setDefaultSettings( driver ) - - # Find and click on the rate text. Scroll into view if not visible - rateText = driver.find_element_by_xpath( "//div[@qxclass='skel.boundWidgets.Animator']/div[4]/div[7]/input") - self.assertIsNotNone( rateText, "Could not find rate text to set the speed of the animation") - driver.execute_script( "arguments[0].scrollIntoView(true);", rateText) - ActionChains(driver).click( rateText ) - - # Test that the animation rate does not exceed boundary values (1 to 100) - # Test that the input of a negative value is not accepted - driver.execute_script( "arguments[0].scrollIntoView(true);", rateText) - rateValue = Util._changeElementText( self, driver, rateText, -32) - self.assertGreaterEqual(int(rateValue), 0, "Rate value is negative") - - # Test that the input of a value over 100 is not accepted - rateValue = Util._changeElementText( self, driver, rateText, 200) - self.assertEqual(int(rateValue), 100, "Rate value is greater than 100") - - # Test that the Channel Animator Step Increment does not exceed boundary values - def test_channelAnimatorStepBoundary(self): - driver = self.driver - time.sleep(5) - - # Set default settings - self._setDefaultSettings( driver ) - - # Find and click the step increment textbox - stepIncrementText = driver.find_element_by_xpath( "//div[@qxclass='skel.boundWidgets.Animator']/div[4]/div[2]/input") - self.assertIsNotNone( stepIncrementText, "Could not find step increment textbox") - driver.execute_script( "arguments[0].scrollIntoView(true);", stepIncrementText) - ActionChains(driver).click( stepIncrementText ) - - # Test that the animation rate does not exceed boundary values (1 to 100) - # Test that the input of a negative value is not accepted - driver.execute_script( "arguments[0].scrollIntoView(true);", stepIncrementText) - stepValue = Util._changeElementText(self, driver, stepIncrementText, -50) - self.assertGreaterEqual(int(stepValue), 0, "Step increment value is negative") - - # Test that the input of a value over 100 is not accepted - stepValue = Util._changeElementText( self, driver, stepIncrementText, 200) - self.assertEqual( int(stepValue), 100, "Step increment value is greater than 100") - - # Test that the Channel Animator can be set to different step increment values - def test_channelAnimatorStepIncrement(self): - driver = self.driver - time.sleep(5) - - # Open a test image so we have something to animate - Util.load_image( self, driver, "Default") - - # Set default settings - self._setDefaultSettings( driver ) - - # Find and click the step increment textbox - stepIncrementText = driver.find_element_by_xpath( "//div[@qxclass='skel.boundWidgets.Animator']/div[4]/div[2]/input") - self.assertIsNotNone( stepIncrementText, "Could not find step increment textbox") - driver.execute_script( "arguments[0].scrollIntoView(true);", stepIncrementText) - ActionChains(driver).click( stepIncrementText ) - - # Change the step increment spin box value to 2 - stepValue = Util._changeElementText( self, driver, stepIncrementText, 2) - - # Go to first channel value and record the first channel value of the test image - self._getFirstValue( driver ) - firstChannelValue = self._getChannelValue( driver ) - - print "Testing Channel Animator Step Increment Setting..." - print "First channel value:", firstChannelValue - print "Step Increment = 2" - - # Allow image to animate for 2 seconds - self._animateForward( driver ) - time.sleep(2) - - # Check that the channel value increases by a step increment of 2 - currChannelValue = self._getChannelValue( driver ) - print "Current channel", currChannelValue - self.assertEqual( int(currChannelValue), 2, "Channel Animator did not increase by a step increment of 2") - - # Test that the Channel Animator increases by one frame when the increase frame button is pressed - def test_channelAnimatorIncreaseFrame(self): - driver = self.driver - time.sleep(5) - - # Open a test image so we have something to animate - Util.load_image( self, driver, "Default") - - # Go to the first channel value and record the frame value - self._getFirstValue( driver ) - firstChannelValue = self._getChannelValue( driver ) - - # Find the increment by one button on the Channel Animator Tape Deck and click it - incrementButton = driver.find_element_by_id( "ChannelTapeDeckIncrement") - self.assertIsNotNone( incrementButton, "Could not find button to increment the channels") - driver.execute_script( "arguments[0].scrollIntoView(true);", incrementButton) - ActionChains(driver).click( incrementButton ).perform() - time.sleep(2) - - # Check that the channel text box value is now 1 - currChannelValue = self._getChannelValue( driver ) - print "Check increase frame..." - print "oldChannelValue= 0 newChannelValue=", currChannelValue - self.assertEqual( int(currChannelValue), int(firstChannelValue)+1, "Failed to increment Channel Animator") - - # Test that the Channel Animator decreases by one frame when the decrease frame button is pressed - def test_channelAnimatorDecreaseFrame(self): - driver = self.driver - time.sleep(5) - - # Open a test image so we have something to animate - Util.load_image( self, driver, "Default") - - # Go to the last channel value and record the frame value - self._getLastValue( driver ) - lastChannelValue = self._getChannelValue( driver ) - - # Find the decrement by one button on the Channel Animator Tape Deck and click it - decrementButton = driver.find_element_by_xpath( "//div[@class='qx-toolbar']/div[@qxclass='qx.ui.toolbar.Button'][2]") - self.assertIsNotNone( decrementButton, "Could not find button to decrement the channels") - driver.execute_script( "arguments[0].scrollIntoView(true);", decrementButton) - ActionChains(driver).click( decrementButton).perform() - time.sleep(2) - - # Check that the channel text box value is one less that the last frame value - currChannelValue = self._getChannelValue( driver ) - print "Check decrease frame..." - print "oldChannelValue=", lastChannelValue, "newChannelValue=",currChannelValue - self.assertEqual( int(currChannelValue), int(lastChannelValue)-1, "Failed to decrement the Channel Animator") - - # Test that the Image Animator jump setting animates the first and last images - # Under default settings, it takes roughly 2 seconds for the image to change by 1 - def test_imageAnimatorJump(self): - driver = self.driver - time.sleep(5) - - # Change the Channel Animator to an Image Animator - self.channel_to_image_animator( driver ) - - # Open test images so we have something to animate - Util.load_image( self, driver, "Default") - Util.load_image( self, driver, "aH.fits") - Util.load_image( self, driver, "aJ.fits") - - # Ensure default settings for the Image Animator - self._setDefaultSettings( driver ) - - # Record the last image value - self._getLastValue( driver ) - lastImageValue = self._getImageValue( driver ) - - # Record the first image value - self._getFirstValue( driver ) - firstImageValue = self._getImageValue( driver ) - - print "Testing Image Animator Jump Setting..." - print "First image value:", firstImageValue, "Last image value:", lastImageValue - - # In settings, click the Jump radio button. Scroll into view if button is not visible - jumpButton = driver.find_element_by_xpath( "//div[@qxclass='qx.ui.form.RadioButton']/div[text()='Jump']/following-sibling::div") - self.assertIsNotNone( jumpButton, "Could not find the jump radio button in settings") - driver.execute_script( "arguments[0].scrollIntoView(true);", jumpButton) - ActionChains(driver).click( jumpButton ).perform() - - # Click the forward animate button - # Allow the animation for 2 seconds - self._animateForward( driver ) - time.sleep(2) - - # Check that the Animator is at the last image value - currImageValue = self._getImageValue( driver ) - print "Current image", currImageValue - self.assertEqual( int(lastImageValue), int(currImageValue), "Image Animator did not jump to last image" ) - - # Allow the animation for another 2 seconds - time.sleep(2) - currImageValue = self._getImageValue( driver ) - print "Current image", currImageValue - self.assertEqual( int(firstImageValue), int(currImageValue), "Image Animator did not jump to first image") - - # Test that the Image Animator wrap setting returns to the first image after animating the - # last image. Under default settings, it takes roughly 2 seconds for the image to change by 1 - def test_imageAnimatorWrap(self): - driver = self.driver - time.sleep(5) - - # Change the Channel Animator to an Image Animator - self.channel_to_image_animator( driver ) - - # Open test images so we have something to animate - Util.load_image( self, driver, "Default") - Util.load_image( self, driver, "aH.fits") - Util.load_image( self, driver, "aJ.fits") - - # Ensure default settings for the Image Animator - self._setDefaultSettings( driver ) - - # Record the first image value - self._getFirstValue( driver ) - firstImageValue = self._getImageValue( driver ) - - # Go to the last image and record the last image value - self._getLastValue( driver ) - lastImageValue = self._getImageValue( driver ) - - print "Testing Image Animator Wrap..." - print "First image value:", firstImageValue, "Last image value:", lastImageValue - - # In settings, click the Wrap radio button. Scroll into view if button is not visible - wrapButton = wrapButton = driver.find_element_by_xpath( "//div[@qxclass='qx.ui.form.RadioButton']/div[text()='Wrap']/following-sibling::div") - self.assertIsNotNone( wrapButton, "Could not find wrap radio button in settings") - driver.execute_script( "arguments[0].scrollIntoView(true);", wrapButton) - ActionChains(driver).click( wrapButton ).perform() - - # Click the forward animate button - # Allow the animation for 2 seconds - self._animateForward( driver ) - time.sleep(2) - - # Check that the animator is at the first image value - currImageValue = self._getImageValue( driver ) - print "Current image", currImageValue - self.assertEqual( int(firstImageValue), int(currImageValue), "Image Animator did not wrap to first image") - - # Allow the animation for another 2 seconds - time.sleep(2) - currImageValue = self._getImageValue( driver ) - print "Current image", currImageValue - self.assertGreater( int(currImageValue), int(firstImageValue), "Image value did not increase after animating first image") - - # Test that the Image Animator reeverse setting animates images in the reverse direction after - # reaching the last image. Under default settings, it takes roughly 4 seconds to reverse direction - # after animating the last image - def test_imageAnimatorReverse(self): - driver = self.driver - time.sleep(5) - # Change the Channel Animator to an Image Animator self.channel_to_image_animator( driver ) - # Open test images so we have something to animate - Util.load_image( self, driver, "Default") - Util.load_image( self, driver, "aH.fits") - Util.load_image( self, driver, "aJ.fits") - - # Ensure default settings for the Image Animator - self._setDefaultSettings( driver ) + # Open settings + self._openSettings( driver ) # Go to the last image and record the last image value self._getLastValue( driver ) @@ -597,7 +386,7 @@ def test_imageAnimatorReverse(self): print "Last image value:", lastImageValue # In settings, click the Reverse radio button. Scroll into view if button is not visible - reverseButton = driver.find_element_by_xpath( "//div[@qxclass='qx.ui.form.RadioButton']/div[text()='Reverse']/following-sibling::div") + reverseButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='qx.ui.form.RadioButton']/div[text()='Reverse']/following-sibling::div"))) self.assertIsNotNone( reverseButton, "Could not find reverse radio button in settings") driver.execute_script( "arguments[0].scrollIntoView(true);", reverseButton) ActionChains(driver).click( reverseButton ).perform() @@ -613,7 +402,7 @@ def test_imageAnimatorReverse(self): self.assertGreater( int(lastImageValue), int(currImageValue), "Image Animator did not reverse direction after animating the last image") # Stop animation. Scroll into view if stop button cannot be seen - stopButton = driver.find_element_by_xpath( "//div[@qxclass='qx.ui.toolbar.Button'][3]") + stopButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='qx.ui.toolbar.Button'][3]"))) self.assertIsNotNone( stopButton, "Could not find stop button") driver.execute_script( "arguments[0].scrollIntoView(true);", stopButton) ActionChains(driver).click( stopButton ).perform() @@ -633,28 +422,60 @@ def test_imageAnimatorReverse(self): print "Current image", currImageValue self.assertGreater( int(currImageValue), int(firstImageValue), "Image Animator did not increase image value after animating first image") - # Test that the adjustment of the Image Animator rate will speed up/slow down image animation - # Under default settings, it takes roughly 2 secons for the image to change by 1 - - # Note: This test is of questionable value, and in fact it fails on my computer. Image animator - # relies on a timer, and how the timer operates can vary by computer. Relying on the animator - # to be at a particular image after a certain amount of time is just not possible. Instead, - # the number of animations that occur within a given amount of time should be measured, and - # then a check made that the number of animations go up when the rate is increased. - def stest_imageAnimatorChangeRate(self): + # Test that adjustment of Animator rate will speed up/slow down channel animation + # Under default settings, it takes roughly 2 seconds for the channel to change by 1 + def test_animatorChangeRate(self): driver = self.driver - time.sleep(5) - # Change the Channel Animator to an Image Animator - self.channel_to_image_animator( driver ) - - # Open test images so we have something to animate - Util.load_image( self, driver, "Default") + # Open a test image so we have something to animate Util.load_image( self, driver, "aH.fits") Util.load_image( self, driver, "aJ.fits") + Util.load_image( self, driver, "Default") + + # Open settings + self._openSettings( driver ) + + # Go to first channel value and record the first channel value of the test image + self._getFirstValue( driver ) + firstChannelValue = self._getChannelValue( driver ) - # Ensure default settings for the Image Animator - self._setDefaultSettings( driver ) + print "Testing Channel Animator Rate Setting..." + print "First channel value:", firstChannelValue + print "Default Rate = 20, New Rate = 50" + + # Allow image to animate for 2 seconds + self._animateForward( driver ) + time.sleep(2) + defaultRateValue = self._getChannelValue( driver ) + print "defaultRateValue", defaultRateValue + + # Stop animation. Scroll into view if the stop button cannot be seen + stopButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='qx.ui.toolbar.Button'][3]"))) + self.assertIsNotNone( stopButton, "Could not find stop button") + driver.execute_script( "arguments[0].scrollIntoView(true);", stopButton) + ActionChains(driver).click( stopButton ).perform() + + # Change the rate to 50 + rateText = driver.find_element_by_xpath("//div[@qxclass='skel.boundWidgets.Animator']/div[4]/div[7]/input") + self.assertIsNotNone( rateText, "Could not find rate text to set the speed of the animation") + driver.execute_script( "arguments[0].scrollIntoView(true);", rateText) + rateValue = Util._changeElementText(self, driver, rateText, 50) + + # Go to first channel value and animate for 2 seconds + self._getFirstValue( driver ) + self._animateForward( driver ) + time.sleep(2) + + # The channel should be at a higher channel value than the default rate value + newRateValue = self._getChannelValue( driver ) + print "newRateValue", newRateValue + self.assertGreater( int(newRateValue), int(defaultRateValue), "Rate value did not increase speed of channel animation") + + # Change the Channel Animator to an Image Animator + self.channel_to_image_animator( driver ) + + # Open settings + self._openSettings( driver ) # Go to the first image and record the first image value self._getFirstValue(driver) @@ -666,12 +487,12 @@ def stest_imageAnimatorChangeRate(self): # Allow animation for 2 seconds self._animateForward( driver ) - time.sleep(3) + time.sleep(2) defaultRateValue = self._getImageValue( driver ) print "defaultRateValue:", defaultRateValue # Stop animation. Scroll into view if the stop button cannot be seen - stopButton = driver.find_element_by_xpath("//div[@qxclass='qx.ui.toolbar.Button'][3]") + stopButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='qx.ui.toolbar.Button'][3]"))) self.assertIsNotNone( stopButton, "Could not find stop button") driver.execute_script( "arguments[0].scrollIntoView(true);", stopButton) ActionChains(driver).click( stopButton ).perform() @@ -680,39 +501,55 @@ def stest_imageAnimatorChangeRate(self): rateText = driver.find_element_by_xpath( "//div[@qxclass='skel.boundWidgets.Animator']/div[4]/div[7]/input") self.assertIsNotNone( rateText, "Could not find rate text to set the speed of the animation") driver.execute_script( "arguments[0].scrollIntoView(true);", rateText) - ActionChains(driver).click( rateText ) - rateValue = Util._changeElementText(self, driver, rateText, 50) + rateValue = Util._changeElementText(self, driver, rateText, 45) # Go back to first image value and animate for 2 seconds self._getFirstValue(driver) self._animateForward(driver) - time.sleep(3) + time.sleep(2) # The image should be at a higher image value than the default image value newRateValue = self._getImageValue( driver ) print "newRateValue:", newRateValue self.assertGreater( int(newRateValue), int(defaultRateValue), "Rate value did not increase speed of image animation") - # Test that the Image Animator Rate does not exceed boundary values - def test_imageAnimatorRateBoundary(self): + # Test that the Channel Animator Rate does not exceed boundary values + def test_animatorRateBoundary(self): driver = self.driver - time.sleep(5) + + # Wait for the image window to be present (ensures browser is fully loaded) + imageWindow = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) + + # Open settings + self._openSettings( driver ) + + # Find and click on the rate text. Scroll into view if not visible + rateText = driver.find_element_by_xpath( "//div[@qxclass='skel.boundWidgets.Animator']/div[4]/div[7]/input") + self.assertIsNotNone( rateText, "Could not find rate text to set the speed of the animation") + driver.execute_script( "arguments[0].scrollIntoView(true);", rateText) + + # Test that the animation rate does not exceed boundary values (1 to 100) + # Test that the input of a negative value is not accepted + rateValue = Util._changeElementText( self, driver, rateText, -32) + self.assertGreaterEqual(int(rateValue), 0, "Rate value is negative") + + # Test that the input of a value over 100 is not accepted + rateValue = Util._changeElementText( self, driver, rateText, 200) + self.assertEqual(int(rateValue), 100, "Rate value is greater than 100") # Change the Channel Animator to an Image Animator self.channel_to_image_animator( driver ) - # Set default settings - self._setDefaultSettings( driver ) + # Open settings + self._openSettings( driver ) # Find and click on the rate text. Scroll into view if not visible rateText = driver.find_element_by_xpath( "//div[@qxclass='skel.boundWidgets.Animator']/div[4]/div[7]/input") self.assertIsNotNone( rateText, "Could not find rate text to set the speed of the animation") driver.execute_script( "arguments[0].scrollIntoView(true);", rateText) - ActionChains(driver).click( rateText ) # Test that the animation rate does not exceed boundary values (1 to 100) # Test that the input of a negative value is not accepted - driver.execute_script( "arguments[0].scrollIntoView(true);", rateText) rateValue = Util._changeElementText( self, driver, rateText, -32) self.assertGreaterEqual(int(rateValue), 0, "Rate value is negative") @@ -720,26 +557,43 @@ def test_imageAnimatorRateBoundary(self): rateValue = Util._changeElementText( self, driver, rateText, 200) self.assertEqual(int(rateValue), 100, "Rate value is greater than 100") - # Test that the Image Animator Step Increment value does not exceed boundary values - def test_imageAnimatorStepBoundary(self): + # Test that the Channel Animator Step Increment does not exceed boundary values + def test_animatorStepBoundary(self): driver = self.driver - time.sleep(5) + + # Wait for the image window to be present (ensures browser is fully loaded) + imageWindow = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) + + # Open settings + self._openSettings( driver ) + + # Find and click the step increment textbox + stepIncrementText = driver.find_element_by_xpath( "//div[@qxclass='skel.boundWidgets.Animator']/div[4]/div[2]/input") + self.assertIsNotNone( stepIncrementText, "Could not find step increment textbox") + driver.execute_script( "arguments[0].scrollIntoView(true);", stepIncrementText) + + # Test that the animation rate does not exceed boundary values (1 to 100) + # Test that the input of a negative value is not accepted + stepValue = Util._changeElementText(self, driver, stepIncrementText, -50) + self.assertGreaterEqual(int(stepValue), 0, "Step increment value is negative") + + # Test that the input of a value over 100 is not accepted + stepValue = Util._changeElementText( self, driver, stepIncrementText, 200) + self.assertEqual( int(stepValue), 100, "Step increment value is greater than 100") # Change the Channel Animator to an Image Animator self.channel_to_image_animator( driver ) - # Set default settings - self._setDefaultSettings( driver ) + # Open settings + self._openSettings( driver ) # Find and click the step increment textbox stepIncrementText = driver.find_element_by_xpath( "//div[@qxclass='skel.boundWidgets.Animator']/div[4]/div[2]/input") self.assertIsNotNone( stepIncrementText, "Could not find step increment textbox") driver.execute_script( "arguments[0].scrollIntoView(true);", stepIncrementText) - ActionChains(driver).click( stepIncrementText ) # Test that the animation rate does not exceed boundary values (1 to 100) # Test that the input of a negative value is not accepted - driver.execute_script( "arguments[0].scrollIntoView(true);", stepIncrementText) stepValue = Util._changeElementText(self, driver, stepIncrementText, -50) self.assertGreaterEqual(int(stepValue), 0, "Step increment value is negative") @@ -747,27 +601,53 @@ def test_imageAnimatorStepBoundary(self): stepValue = Util._changeElementText( self, driver, stepIncrementText, 200) self.assertEqual( int(stepValue), 100, "Step increment value is greater than 100") - # Test that the Image Animator can be set to different step increment values - def test_imageAnimatorStepIncrement(self): + # Test that the Channel Animator can be set to different step increment values + def test_animatorStepIncrement(self): driver = self.driver - time.sleep(5) + + # Open a test image so we have something to animate + Util.load_image( self, driver, "aJ.fits") + Util.load_image( self, driver, "aH.fits") + Util.load_image( self, driver, "Default") + + # Open settings + self._openSettings( driver ) + + # Find and click the step increment textbox + stepIncrementText = driver.find_element_by_xpath( "//div[@qxclass='skel.boundWidgets.Animator']/div[4]/div[2]/input") + self.assertIsNotNone( stepIncrementText, "Could not find step increment textbox") + driver.execute_script( "arguments[0].scrollIntoView(true);", stepIncrementText) + + # Change the step increment spin box value to 2 + stepValue = Util._changeElementText( self, driver, stepIncrementText, 2) + + # Go to first channel value and record the first channel value of the test image + self._getFirstValue( driver ) + firstChannelValue = self._getChannelValue( driver ) + + print "Testing Channel Animator Step Increment Setting..." + print "First channel value:", firstChannelValue + print "Step Increment = 2" + + # Allow image to animate for 2 seconds + self._animateForward( driver ) + time.sleep(2) + + # Check that the channel value increases by a step increment of 2 + currChannelValue = self._getChannelValue( driver ) + print "Current channel", currChannelValue + self.assertEqual( int(currChannelValue), 2, "Channel Animator did not increase by a step increment of 2") # Change the Channel Animator to an Image Animator self.channel_to_image_animator( driver ) - # Open test images so we have something to animate - Util.load_image( self, driver, "Default") - Util.load_image( self, driver, "aH.fits") - Util.load_image( self, driver, "aJ.fits") - - # Ensure default settings for the Image Animator - self._setDefaultSettings( driver ) + # Open settings + self._openSettings( driver ) # Find and click the step increment textbox stepIncrementText = driver.find_element_by_xpath( "//div[@qxclass='skel.boundWidgets.Animator']/div[4]/div[2]/input") self.assertIsNotNone( stepIncrementText, "Could not find step increment textbox") driver.execute_script( "arguments[0].scrollIntoView(true);", stepIncrementText) - ActionChains(driver).click( stepIncrementText ) # Change the step increment spin box value to 2 stepValue = Util._changeElementText( self, driver, stepIncrementText, 2) @@ -789,29 +669,46 @@ def test_imageAnimatorStepIncrement(self): print "Current image:", currImageValue self.assertEqual( int(currImageValue), 2, "Image Animator did not increase by a step value of 2") - # Test that the Image Animator decreases by one image when the decrease frame button is pressed - def test_imageAnimatorIncreaseFrame(self): - driver = self.driver - time.sleep(5) - - # Change the Channel Animator to an Image Animator - self.channel_to_image_animator( driver ) + # Test that the Channel Animator increases by one frame when the increase frame button is pressed + def test_animatorIncreaseFrame(self): + driver = self.driver + timeout = selectBrowser._getSleep() - # Open test images so we have something to animate - Util.load_image( self, driver, "Default") + # Open a test image so we have something to animate Util.load_image( self, driver, "aH.fits") Util.load_image( self, driver, "aJ.fits") + Util.load_image( self, driver, "Default") + + # Go to the first channel value and record the frame value + self._getFirstValue( driver ) + firstChannelValue = self._getChannelValue( driver ) + + # Find the increment by one button on the Channel Animator Tape Deck and click it + incrementButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "ChannelTapeDeckIncrement"))) + self.assertIsNotNone( incrementButton, "Could not find button to increment the channels") + driver.execute_script( "arguments[0].scrollIntoView(true);", incrementButton) + ActionChains(driver).click( incrementButton ).perform() + time.sleep( timeout ) + + # Check that the channel text box value is now 1 + currChannelValue = self._getChannelValue( driver ) + print "Check increase frame..." + print "oldChannelValue= 0 newChannelValue=", currChannelValue + self.assertEqual( int(currChannelValue), int(firstChannelValue)+1, "Failed to increment Channel Animator") + + # Change the Channel Animator to an Image Animator + self.channel_to_image_animator( driver ) # Record the first image value self._getFirstValue( driver ) firstImageValue = self._getImageValue( driver ) # Find the increment by one button on the Animator Tape Deck and click it - incrementButton = driver.find_element_by_id( "ImageTapeDeckIncrement") + incrementButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "ImageTapeDeckIncrement"))) self.assertIsNotNone( incrementButton, "Could not find button to increment the image") driver.execute_script( "arguments[0].scrollIntoView(true);", incrementButton) ActionChains(driver).click( incrementButton ).perform() - time.sleep(2) + time.sleep( timeout ) # Check that the image text box value is now 1 currImageValue = self._getImageValue( driver ) @@ -819,29 +716,46 @@ def test_imageAnimatorIncreaseFrame(self): print "oldImageValue=", firstImageValue, "newImageValue=", currImageValue self.assertEqual( int(currImageValue), int(firstImageValue)+1, "Failed to increment the Image Animator") - # Test that the Image Animator decreases by one image when the decrease frame button is pressed - def test_imageAnimatorDecreaseFrame(self): + # Test that the Channel Animator decreases by one frame when the decrease frame button is pressed + def test_animatorDecreaseFrame(self): driver = self.driver - time.sleep(5) - - # Change the Channel Animator to an Image Animator - self.channel_to_image_animator( driver ) + timeout = selectBrowser._getSleep() - # Open test images so we have something to animate - Util.load_image( self, driver, "Default") + # Open a test image so we have something to animate Util.load_image( self, driver, "aH.fits") Util.load_image( self, driver, "aJ.fits") + Util.load_image( self, driver, "Default") + + # Go to the last channel value and record the frame value + self._getLastValue( driver ) + lastChannelValue = self._getChannelValue( driver ) + + # Find the decrement by one button on the Channel Animator Tape Deck and click it + decrementButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@class='qx-toolbar']/div[@qxclass='qx.ui.toolbar.Button'][2]"))) + self.assertIsNotNone( decrementButton, "Could not find button to decrement the channels") + driver.execute_script( "arguments[0].scrollIntoView(true);", decrementButton) + ActionChains(driver).click( decrementButton).perform() + time.sleep( timeout ) + + # Check that the channel text box value is one less that the last frame value + currChannelValue = self._getChannelValue( driver ) + print "Check decrease frame..." + print "oldChannelValue=", lastChannelValue, "newChannelValue=",currChannelValue + self.assertEqual( int(currChannelValue), int(lastChannelValue)-1, "Failed to decrement the Channel Animator") + + # Change the Channel Animator to an Image Animator + self.channel_to_image_animator( driver ) # Record the first image value self._getLastValue( driver ) lastImageValue = self._getImageValue( driver ) # Find the decrement by one button on the Animator Tape Deck and click it - decrementButton = driver.find_element_by_xpath( "//div[@class='qx-toolbar']/div[@qxclass='qx.ui.toolbar.Button'][2]") + decrementButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@class='qx-toolbar']/div[@qxclass='qx.ui.toolbar.Button'][2]"))) self.assertIsNotNone( decrementButton, "Could not find button to decrement the image") driver.execute_script( "arguments[0].scrollIntoView(true);", decrementButton) ActionChains(driver).click( decrementButton).perform() - time.sleep(2) + time.sleep( timeout ) # Check that the image text box value is now 1 currImageValue = self._getImageValue( driver ) @@ -853,7 +767,7 @@ def tearDown(self): # Close the browser self.driver.close() # Allow browser to fully close before continuing - time.sleep(5) + time.sleep(2) # Close the session and delete temporary files self.driver.quit() diff --git a/Skeleton3/html5/common/skel/source/class/skel/simulation/tAnimatorTapeDeck.py b/Skeleton3/html5/common/skel/source/class/skel/simulation/tAnimatorTapeDeck.py index 19e137aa..dec80437 100644 --- a/Skeleton3/html5/common/skel/source/class/skel/simulation/tAnimatorTapeDeck.py +++ b/Skeleton3/html5/common/skel/source/class/skel/simulation/tAnimatorTapeDeck.py @@ -6,6 +6,9 @@ from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.action_chains import ActionChains +from selenium.webdriver.support import expected_conditions as EC +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.common.by import By # Test the Animator tape deck functionality class tAnimatorTapeDeck(tAnimator.tAnimator): @@ -14,18 +17,16 @@ def setUp(self): browser = selectBrowser._getBrowser() Util.setUp(self, browser) - # Test that the Channel Animator can animate in the forward direction + # Test that the Animator can animate in the forward direction # Under default settings, it takes roughly 2 seconds for the channel to change by 1 - def test_channelAnimatorForwardAnimation(self): + def test_animatorForwardAnimation(self): driver = self.driver - time.sleep(5) # Open a test image so we have something to animate + Util.load_image( self, driver, "aH.fits") + Util.load_image( self, driver, "aJ.fits") Util.load_image( self, driver, "Default") - # Ensure default settings - self._setDefaultSettings( driver ) - # Record the first channel value of the test image self._getFirstValue( driver ) firstChannelValue = self._getChannelValue( driver ) @@ -43,18 +44,36 @@ def test_channelAnimatorForwardAnimation(self): print "Current channel", currChannelValue self.assertGreater( int(currChannelValue), int(firstChannelValue), "Channel value did not increase for forward animation.") - # Test that the Channel Animator can animate in the reverse direction + # Change the Channel Animator to an Image Animator + self.channel_to_image_animator( driver ) + + # Go to the first image and record the first image value + self._getFirstValue( driver ) + firstImageValue = self._getImageValue( driver ) + + print "Testing Image Animator Forward Animation..." + print "First image value:", firstImageValue + + # Click the forward animate button + # Allow animation for 2 seconds + self._animateForward( driver ) + time.sleep(2) + + # Check that the image value is greater than the first image value + currImageValue = self._getImageValue( driver ) + print "Current image", currImageValue + self.assertGreater( int(currImageValue), int(firstImageValue), "Image value did not increase for forward animation") + + # Test that the Animator can animate in the reverse direction # Under default settings, it takes roughly 2 seconds for the channel to change by 1 - def test_channelAnimatorReverseAnimation(self): + def test_animatorReverseAnimation(self): driver = self.driver - time.sleep(5) # Open a test image so we have something to animate + Util.load_image( self, driver, "aH.fits") + Util.load_image( self, driver, "aJ.fits") Util.load_image( self, driver, "Default") - # Ensure default settings - self._setDefaultSettings( driver ) - # Record the last channel value of the test image self._getLastValue( driver ) lastChannelValue = self._getChannelValue( driver ) @@ -64,7 +83,7 @@ def test_channelAnimatorReverseAnimation(self): # Click the reverse animate button. Scroll into view if not visible # Allow image to animate for 2 seconds - reverseAnimateButton = driver.find_element_by_xpath( "//div[@class='qx-toolbar']/div[@class='qx-button'][1]") + reverseAnimateButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@class='qx-toolbar']/div[@class='qx-button'][1]"))) self.assertIsNotNone( reverseAnimateButton, "Could not find reverse animation button") driver.execute_script( "arguments[0].scrollIntoView(true);", reverseAnimateButton) ActionChains(driver).click( reverseAnimateButton ).perform() @@ -75,12 +94,36 @@ def test_channelAnimatorReverseAnimation(self): print "Current channel", currChannelValue self.assertEqual( int(currChannelValue), int(lastChannelValue)-1, "Channel value did not decrease for reverse animation.") + # Change the Channel Animator to an Image Animator + self.channel_to_image_animator( driver ) + + # Go to the last image and record the last image value + self._getLastValue( driver ) + lastImageValue = self._getImageValue( driver ) + + print "Testing Image Animator Reverse Animation..." + print "Last image value:", lastImageValue + + # Click the reverse animate button. Scroll into view if not visible + # Allow image to animate for 2 seconds + reverseAnimateButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@class='qx-toolbar']/div[@class='qx-button'][1]"))) + self.assertIsNotNone( reverseAnimateButton, "Could not find reverse animation button") + driver.execute_script( "arguments[0].scrollIntoView(true);", reverseAnimateButton) + ActionChains(driver).click( reverseAnimateButton ).perform() + time.sleep(2) + + # Check that the image value is at a value less than the last image value + currImageValue = self._getImageValue( driver ) + print "Current image", currImageValue + self.assertLess( int(currImageValue), int(lastImageValue), "Image value did not decrease for reverse animation") + # Test that the Channel Animator can stop the animation - def test_channelAnimatorStopAnimation(self): + def test_animatorStopAnimation(self): driver = self.driver - time.sleep(5) # Open a test image so we have something to animate + Util.load_image( self, driver, "aH.fits") + Util.load_image( self, driver, "aJ.fits") Util.load_image( self, driver, "Default") # Allow the image to animate for 2 seconds @@ -88,7 +131,7 @@ def test_channelAnimatorStopAnimation(self): time.sleep(2) # Click on the Stop button. Scroll into view if not visible - stopButton = driver.find_element_by_xpath( "//div[@qxclass='qx.ui.toolbar.Button'][3]") + stopButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='qx.ui.toolbar.Button'][3]"))) self.assertIsNotNone( stopButton, "Could not find stop button") driver.execute_script( "arguments[0].scrollIntoView(true);", stopButton) ActionChains(driver).click( stopButton ).perform() @@ -99,12 +142,32 @@ def test_channelAnimatorStopAnimation(self): currChannelValue = self._getChannelValue( driver ) self.assertEqual( int(currChannelValue), int(channelValue), "Channel animation did not stop" ) + # Change the Channel Animator to an Image Animator + self.channel_to_image_animator( driver ) + + # Allow animation for 2 seconds + self._animateForward( driver ) + time.sleep(2) + + # Click on the Stop button. Scroll into view if not visible + stopButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='qx.ui.toolbar.Button'][3]"))) + self.assertIsNotNone( stopButton, "Could not find stop button") + driver.execute_script( "arguments[0].scrollIntoView(true);", stopButton) + ActionChains(driver).click( stopButton ).perform() + imageValue = self._getImageValue( driver ) + + # Wait for another 2 seconds. Ensure that the image value did not change + time.sleep(2) + currImageValue = self._getImageValue( driver ) + self.assertEqual( int(currImageValue), int(imageValue), "Image animation did not stop") + # Test that the Channel Animator can go to the first frame value of the test image - def test_channelAnimatorFirstValue(self): + def test_animatorFirstValue(self): driver = self.driver - time.sleep(5) # Open a test image so we have something to animate + Util.load_image( self, driver, "aH.fits") + Util.load_image( self, driver, "aJ.fits") Util.load_image( self, driver, "Default") # Record the first channel value of the test image @@ -120,12 +183,30 @@ def test_channelAnimatorFirstValue(self): currChannelValue = self._getChannelValue( driver ) self.assertEqual( int(currChannelValue), int(firstChannelValue), "Channel Animator did not return to first channel value") + # Change the Channel Animator to an Image Animator + self.channel_to_image_animator( driver ) + + # Go to the first image and record the first image value + self._getFirstValue( driver ) + firstImageValue = self._getImageValue( driver ) + + # Allow animation for 2 seconds + self._animateForward( driver ) + time.sleep(2) + + # Click the first valid value button + # Check that the image value is the same as the first image value + self._getFirstValue( driver ) + currImageValue = self._getImageValue( driver ) + self.assertEqual( int(currImageValue), int(firstImageValue), "Image Animator did not return to first image") + # Test that the Channel Animator can go to the last frame value of the test image - def test_channelAnimatorLastValue(self): + def test_animatorLastValue(self): driver = self.driver - time.sleep(5) # Open a test image so we have something to animate + Util.load_image( self, driver, "aH.fits") + Util.load_image( self, driver, "aJ.fits") Util.load_image( self, driver, "Default") # Record the last channel value of the test image @@ -143,12 +224,30 @@ def test_channelAnimatorLastValue(self): currChannelValue = self._getChannelValue( driver ) self.assertEqual( int(currChannelValue), int(lastChannelValue), "Channel Animator did not return to last channel value") + # Change the Channel Animator to an Image Animator + self.channel_to_image_animator( driver ) + + # Go to the first image and record the first image value + self._getLastValue( driver ) + lastImageValue = self._getImageValue( driver ) + + # Allow animation for 2 seconds + self._animateForward( driver ) + time.sleep(2) + + # Click the first valid value button + # Check that the image value is the same as the first image value + self._getLastValue( driver ) + currImageValue = self._getImageValue( driver ) + self.assertEqual( int(currImageValue), int(lastImageValue), "Image Animator did not return to last image") + # Test that the Channel Animator lower spin box cannot exceed boundary values - def test_channelAnimatorLowerBound(self): + def test_animatorBoundary(self): driver = self.driver - time.sleep(5) # Open a test image so we have something to animate + Util.load_image( self, driver, "aH.fits") + Util.load_image( self, driver, "aJ.fits") Util.load_image( self, driver, "Default") # Find and record the first valid value of the animation @@ -160,7 +259,7 @@ def test_channelAnimatorLowerBound(self): lastChannelValue = self._getChannelValue( driver ) # Find and click the lower spin box - lowerBoundText = driver.find_element_by_xpath( "//div[@qxclass='skel.boundWidgets.Animator']/div[2]/div[@class='qx-input'][1]/input") + lowerBoundText = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.boundWidgets.Animator']/div[2]/div[@class='qx-input'][1]/input"))) self.assertIsNotNone( lowerBoundText, "Could not find lower bound spin box") driver.execute_script( "arguments[0].scrollIntoView(true);", lowerBoundText) lowerBoundText.click() @@ -177,24 +276,8 @@ def test_channelAnimatorLowerBound(self): lowerBoundValue = Util._changeElementText( self, driver, lowerBoundText, int(firstChannelValue)-1 ) self.assertGreaterEqual( int(lowerBoundValue), int(firstChannelValue), "Lower bound value is less than the first channel value") - # Test that the Channel Animator upper spin box cannot exceed boundary values - def test_channelAnimatorUpperBound(self): - driver = self.driver - time.sleep(5) - - # Open a test image so we have something to animate - Util.load_image( self, driver, "Default") - - # Find and record the first valid value of the animation - self._getFirstValue( driver ) - firstChannelValue = self._getChannelValue( driver ) - - # Find and record the last valid value of the animation - self._getLastValue( driver ) - lastChannelValue = self._getChannelValue( driver ) - # Find and click the upper spin box - upperBoundText = driver.find_element_by_xpath( "//div[@id='ChannelUpperBoundSpin']/input") + upperBoundText = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@id='ChannelUpperBoundSpin']/input"))) self.assertIsNotNone( upperBoundText, "Could not find upper bound spin box") driver.execute_script( "arguments[0].scrollIntoView(true);", upperBoundText) upperBoundText.click() @@ -207,229 +290,9 @@ def test_channelAnimatorUpperBound(self): upperBoundValue = Util._changeElementText( self, driver, upperBoundText, int(firstChannelValue )-10) self.assertGreaterEqual( int(upperBoundValue), int(firstChannelValue), "Upper bound value is less than the first channel value") - # Test that the Channel Animator upper and lower bound values do not change during animation - def test_channelAnimatorBoundaryAnimation(self): - driver = self.driver - time.sleep(5) - - # Open a test image so we have something to animate - Util.load_image( self, driver, "Default") - - # Find and record the first valid value of the animation - self._getFirstValue( driver ) - firstChannelValue = self._getChannelValue( driver ) - - # Find and record the last valid value of the animation - self._getLastValue( driver ) - lastChannelValue = self._getChannelValue( driver ) - - # Find and click the lower spin box - lowerBoundText = driver.find_element_by_xpath( "//div[@qxclass='skel.boundWidgets.Animator']/div[2]/div[@class='qx-input'][1]/input") - self.assertIsNotNone( lowerBoundText, "Could not find lower bound spin box") - driver.execute_script( "arguments[0].scrollIntoView(true);", lowerBoundText) - lowerBoundText.click() - - # Change the lower bound value - lowerBoundValue = Util._changeElementText(self, driver, lowerBoundText, int(firstChannelValue)+1) - - # Find and click the upper spin box - upperBoundText = driver.find_element_by_xpath( "//div[@id='ChannelUpperBoundSpin']/input") - self.assertIsNotNone( upperBoundText, "Could not find upper bound spin box") - driver.execute_script( "arguments[0].scrollIntoView(true);", upperBoundText) - upperBoundText.click() - - # Change the upper bound value - upperBoundValue = Util._changeElementText( self, driver, upperBoundText, int(lastChannelValue)-1) - - # Allow test image to animate for 2 seconds - self._animateForward( driver ) - time.sleep(2) - - # Check that the lower and upper bound values did not change during animation - lowerBound = lowerBoundText.get_attribute("value") - upperBound = upperBoundText.get_attribute("value") - self.assertEqual( int(lowerBound), int(lowerBoundValue), "Lower bound channel value changed during animation") - self.assertEqual( int(upperBound), int(upperBoundValue), "Upper bound channel value changed during animation") - - # Test that the Image Animator can animate in the forward direction - # Under default settings, it takes roughly 2 seconds for the image value to change by 1 - def test_imageAnimatorForwardAnimation(self): - driver = self.driver - time.sleep(5) - - # Change the Channel Animator to an Image Animator - self.channel_to_image_animator( driver ) - - # Open test images so we have something to animate - Util.load_image( self, driver, "Default") - Util.load_image( self, driver, "aH.fits") - Util.load_image( self, driver, "aJ.fits") - - # Ensure default settings for the Image Animator - self._setDefaultSettings( driver ) - - # Go to the first image and record the first image value - self._getFirstValue( driver ) - firstImageValue = self._getImageValue( driver ) - - print "Testing Image Animator Forward Animation..." - print "First image value:", firstImageValue - - # Click the forward animate button - # Allow animation for 2 seconds - self._animateForward( driver ) - time.sleep(2) - - # Check that the image value is greater than the first image value - currImageValue = self._getImageValue( driver ) - print "Current image", currImageValue - self.assertGreater( int(currImageValue), int(firstImageValue), "Image value did not increase for forward animation") - - # Test that the Image Animator can animate in the reverse direction - # Under default settings, it takes roughly 2 seconds for the image value to change by 1 - def test_imageAnimatorReverseAnimation(self): - driver = self.driver - time.sleep(5) - - # Change the Channel Animator to an Image Animator - self.channel_to_image_animator( driver ) - - # Open test images so we have something to animate - Util.load_image( self, driver, "Default") - Util.load_image( self, driver, "aH.fits") - Util.load_image( self, driver, "aJ.fits") - - # Ensure default settings for the Image Animator - self._setDefaultSettings( driver ) - - # Go to the last image and record the last image value - self._getLastValue( driver ) - lastImageValue = self._getImageValue( driver ) - - print "Testing Image Animator Reverse Animation..." - print "Last image value:", lastImageValue - - # Click the reverse animate button. Scroll into view if not visible - # Allow image to animate for 2 seconds - reverseAnimateButton = driver.find_element_by_xpath( "//div[@class='qx-toolbar']/div[@class='qx-button'][1]") - self.assertIsNotNone( reverseAnimateButton, "Could not find reverse animation button") - driver.execute_script( "arguments[0].scrollIntoView(true);", reverseAnimateButton) - ActionChains(driver).click( reverseAnimateButton ).perform() - time.sleep(2) - - # Check that the image value is at a value less than the last image value - currImageValue = self._getImageValue( driver ) - print "Current image", currImageValue - self.assertLess( int(currImageValue), int(lastImageValue), "Image value did not decrease for reverse animation") - - # Test that the Image Animation can stop animation - def test_imageAnimatorStopAnimation(self): - driver = self.driver - time.sleep(5) - - # Change the Channel Animator to an Image Animator - self.channel_to_image_animator( driver ) - - # Open test images so we have something to animate - Util.load_image( self, driver, "Default") - Util.load_image( self, driver, "aH.fits") - Util.load_image( self, driver, "aJ.fits") - - # Ensure default settings for the Image Animator - self._setDefaultSettings( driver ) - - # Allow animation for 2 seconds - self._animateForward( driver ) - time.sleep(2) - - # Click on the Stop button. Scroll into view if not visible - stopButton = driver.find_element_by_xpath( "//div[@qxclass='qx.ui.toolbar.Button'][3]") - self.assertIsNotNone( stopButton, "Could not find stop button") - driver.execute_script( "arguments[0].scrollIntoView(true);", stopButton) - ActionChains(driver).click( stopButton ).perform() - imageValue = self._getImageValue( driver ) - - # Wait for another 2 seconds. Ensure that the image value did not change - time.sleep(2) - currImageValue = self._getImageValue( driver ) - self.assertEqual( int(currImageValue), int(imageValue), "Image animation did not stop") - - # Test that the Image Animator can go to the first image - def test_imageAnimatorFirstValue(self): - driver = self.driver - time.sleep(5) - - # Change the Channel Animator to an Image Animator - self.channel_to_image_animator( driver ) - - # Open test images so we have something to animate - Util.load_image( self, driver, "Default") - Util.load_image( self, driver, "aH.fits") - Util.load_image( self, driver, "aJ.fits") - - # Ensure default settings for the Image Animator - self._setDefaultSettings( driver ) - - # Go to the first image and record the first image value - self._getFirstValue( driver ) - firstImageValue = self._getImageValue( driver ) - - # Allow animation for 2 seconds - self._animateForward( driver ) - time.sleep(2) - - # Click the first valid value button - # Check that the image value is the same as the first image value - self._getFirstValue( driver ) - currImageValue = self._getImageValue( driver ) - self.assertEqual( int(currImageValue), int(firstImageValue), "Image Animator did not return to first image") - - # Test that the Image Animator can go to the last image - def test_imageAnimatorLastValue(self): - driver = self.driver - time.sleep(5) - - # Change the Channel Animator to an Image Animator - self.channel_to_image_animator( driver ) - - # Open test images so we have something to animate - Util.load_image( self, driver, "Default") - Util.load_image( self, driver, "aH.fits") - Util.load_image( self, driver, "aJ.fits") - - # Ensure default settings for the Image Animator - self._setDefaultSettings( driver ) - - # Go to the first image and record the first image value - self._getLastValue( driver ) - lastImageValue = self._getImageValue( driver ) - - # Allow animation for 2 seconds - self._animateForward( driver ) - time.sleep(2) - - # Click the first valid value button - # Check that the image value is the same as the first image value - self._getLastValue( driver ) - currImageValue = self._getImageValue( driver ) - self.assertEqual( int(currImageValue), int(lastImageValue), "Image Animator did not return to last image") - - # Test that the Image Animator lower spin box cannot exceed boundary values - def test_imageAnimatorLowerBound(self): - driver = self.driver - time.sleep(5) - # Change the Channel Animator to an Image Animator self.channel_to_image_animator( driver ) - # Open test images so we have something to animate - Util.load_image( self, driver, "Default") - Util.load_image( self, driver, "aH.fits") - Util.load_image( self, driver, "aJ.fits") - - # Ensure default settings for the Image Animator - self._setDefaultSettings( driver ) - # Record the first image value self._getFirstValue( driver ) firstImageValue = self._getImageValue( driver ) @@ -439,7 +302,7 @@ def test_imageAnimatorLowerBound(self): lastImageValue = self._getImageValue( driver ) # Find and click the lower spin box - lowerBoundText = driver.find_element_by_xpath( "//div[@qxclass='skel.boundWidgets.Animator']/div[2]/div[@class='qx-input'][1]/input") + lowerBoundText = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.boundWidgets.Animator']/div[2]/div[@class='qx-input'][1]/input"))) self.assertIsNotNone( lowerBoundText, "Could not find lower bound spin box") driver.execute_script( "arguments[0].scrollIntoView(true);", lowerBoundText) lowerBoundText.click() @@ -456,32 +319,8 @@ def test_imageAnimatorLowerBound(self): lowerBoundValue = Util._changeElementText( self, driver, lowerBoundText, int(firstImageValue)-1 ) self.assertGreaterEqual( int(lowerBoundValue), int(firstImageValue), "Lower bound value is less than the first image value") - # Test that the Image Animator upper spin box cannot exceed boundary values - def test_imageAnimatorUpperBound(self): - driver = self.driver - time.sleep(5) - - # Change the Channel Animator to an Image Animator - self.channel_to_image_animator( driver ) - - # Open test images so we have something to animate - Util.load_image( self, driver, "Default") - Util.load_image( self, driver, "aH.fits") - Util.load_image( self, driver, "aJ.fits") - - # Ensure default settings for the Image Animator - self._setDefaultSettings( driver ) - - # Record the first image value - self._getFirstValue( driver ) - firstImageValue = self._getImageValue( driver ) - - # Record the last image value - self._getLastValue( driver ) - lastImageValue = self._getImageValue( driver ) - # Find and click the upper spin box - imageUpperBoundText = driver.find_element_by_xpath( "//div[@id='ImageUpperBoundSpin']/input") + imageUpperBoundText = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@id='ImageUpperBoundSpin']/input"))) self.assertIsNotNone( imageUpperBoundText, "Could not find upper bound for image animator") driver.execute_script( "arguments[0].scrollIntoView(true);", imageUpperBoundText) imageUpperBoundText.click() @@ -494,21 +333,53 @@ def test_imageAnimatorUpperBound(self): imageUpperBoundValue = Util._changeElementText( self, driver, imageUpperBoundText, int(firstImageValue )-10) self.assertGreaterEqual( int(imageUpperBoundValue), 0, "Upper bound value is less than the first image value") - # Test that the Image Animator upper and lower bound values do not change during animation - def test_imageAnimatorBoundaryAnimation(self): - driver = self.driver - time.sleep(5) - - # Change the Channel Animator to an Image Animator - self.channel_to_image_animator( driver ) + # Test that the Channel Animator upper and lower bound values do not change during animation + def test_animatorBoundaryAnimation(self): + driver = self.driver - # Open test images so we have something to animate - Util.load_image( self, driver, "Default") + # Open a test image so we have something to animate Util.load_image( self, driver, "aH.fits") Util.load_image( self, driver, "aJ.fits") + Util.load_image( self, driver, "Default") + + # Find and record the first valid value of the animation + self._getFirstValue( driver ) + firstChannelValue = self._getChannelValue( driver ) + + # Find and record the last valid value of the animation + self._getLastValue( driver ) + lastChannelValue = self._getChannelValue( driver ) + + # Find and click the lower spin box + lowerBoundText = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.boundWidgets.Animator']/div[2]/div[@class='qx-input'][1]/input"))) + self.assertIsNotNone( lowerBoundText, "Could not find lower bound spin box") + driver.execute_script( "arguments[0].scrollIntoView(true);", lowerBoundText) + lowerBoundText.click() + + # Change the lower bound value + lowerBoundValue = Util._changeElementText(self, driver, lowerBoundText, int(firstChannelValue)+1) + + # Find and click the upper spin box + upperBoundText = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@id='ChannelUpperBoundSpin']/input"))) + self.assertIsNotNone( upperBoundText, "Could not find upper bound spin box") + driver.execute_script( "arguments[0].scrollIntoView(true);", upperBoundText) + upperBoundText.click() + + # Change the upper bound value + upperBoundValue = Util._changeElementText( self, driver, upperBoundText, int(lastChannelValue)-1) + + # Allow test image to animate for 2 seconds + self._animateForward( driver ) + time.sleep(2) - # Ensure default settings for the Image Animator - self._setDefaultSettings( driver ) + # Check that the lower and upper bound values did not change during animation + lowerBound = lowerBoundText.get_attribute("value") + upperBound = upperBoundText.get_attribute("value") + self.assertEqual( int(lowerBound), int(lowerBoundValue), "Lower bound channel value changed during animation") + self.assertEqual( int(upperBound), int(upperBoundValue), "Upper bound channel value changed during animation") + + # Change the Channel Animator to an Image Animator + self.channel_to_image_animator( driver ) # Record the first image value self._getFirstValue( driver ) @@ -519,7 +390,7 @@ def test_imageAnimatorBoundaryAnimation(self): lastImageValue = self._getImageValue( driver ) # Find and click the lower spin box - lowerBoundText = driver.find_element_by_xpath( "//div[@qxclass='skel.boundWidgets.Animator']/div[2]/div[@class='qx-input'][1]/input") + lowerBoundText = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.boundWidgets.Animator']/div[2]/div[@class='qx-input'][1]/input"))) self.assertIsNotNone( lowerBoundText, "Could not find lower bound spin box") driver.execute_script( "arguments[0].scrollIntoView(true);", lowerBoundText) lowerBoundText.click() @@ -528,7 +399,7 @@ def test_imageAnimatorBoundaryAnimation(self): imageLowerBoundValue = Util._changeElementText(self, driver, lowerBoundText, int(firstImageValue)+1) # Find and click the upper spin box - imageUpperBoundText = driver.find_element_by_xpath( "//div[@id='ImageUpperBoundSpin']/input") + imageUpperBoundText = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@id='ImageUpperBoundSpin']/input"))) self.assertIsNotNone( imageUpperBoundText, "Could not find upper bound for image animator") driver.execute_script( "arguments[0].scrollIntoView(true);", imageUpperBoundText) imageUpperBoundText.click() @@ -550,7 +421,7 @@ def tearDown(self): # Close the browser self.driver.close() # Allow browser to fully close before continuing - time.sleep(5) + time.sleep(2) # Close the session and delete temporary files self.driver.quit() diff --git a/Skeleton3/html5/common/skel/source/class/skel/simulation/tHistogram.py b/Skeleton3/html5/common/skel/source/class/skel/simulation/tHistogram.py index 633877bf..9d769c53 100644 --- a/Skeleton3/html5/common/skel/source/class/skel/simulation/tHistogram.py +++ b/Skeleton3/html5/common/skel/source/class/skel/simulation/tHistogram.py @@ -5,6 +5,9 @@ from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.action_chains import ActionChains +from selenium.webdriver.support import expected_conditions as EC +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.common.by import By # Tests of histogram functionality class tHistogram( unittest.TestCase ): @@ -20,21 +23,20 @@ def _getTextValue(self, driver, id): return textValue def _openHistogramSettings(self, driver, histWindow): - ActionChains( driver ).context_click( histWindow ).perform() + ActionChains(driver).context_click( histWindow ).perform() ActionChains( driver).send_keys( Keys.ARROW_DOWN).send_keys( Keys.ARROW_DOWN ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys( Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - # Find the histogram window either as an inline display if it is already present or as a popup def _getHistogramWindow(self, driver): # First see if there is a histogram window already there - histWindow = driver.find_element_by_xpath("//div[@qxclass='skel.widgets.Window.DisplayWindowHistogram']") + histWindow = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowHistogram']"))) if histWindow is None: print "Making popup histogram" #Find a window capable of loading an image - imageWindow = driver.find_element_by_xpath("//div[@qxclass='skel.widgets.Window.DisplayWindowImage']") + imageWindow = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) if imageWindow is None: print "No way to get a histogram window" return @@ -43,17 +45,17 @@ def _getHistogramWindow(self, driver): ActionChains(driver).context_click( imageWindow ).perform() # Click the popup button - popupButton = driver.find_element_by_xpath("//div[text()='Popup']/..") + popupButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[text()='Popup']/.."))) self.assertIsNotNone( popupButton, "Could not click popup button in the context menu") ActionChains(driver).click( popupButton ).perform() # Look for the histogram button and click it to open the histogram dialog - histogramButton = driver.find_element_by_xpath("//div/div[text()='Histogram']/..") + histogramButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div/div[text()='Histogram']/.."))) self.assertIsNotNone( histogramButton, "Could not click histogram button on popup subcontext menu") ActionChains(driver).click( histogramButton ).perform() # We should now see a histogram popup window - histWindow = driver.find_element_by_xpath("//div[@qxclass='skel.widgets.Window.DisplayWindowHistogram']") + histWindow = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowHistogram']"))) self.assertIsNotNone( histWindow, "Could not popup a histogram") return histWindow @@ -62,20 +64,23 @@ def _getHistogramWindow(self, driver): # its value accordingly def test_binCountChange(self): driver = self.driver - time.sleep(5) + timeout = selectBrowser._getSleep() + + # Wait for the image window to be present (ensures browser is fully loaded) + imageWindow = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) # Find and select the histogram window histWindow = self._getHistogramWindow( driver ) ActionChains(driver).click( histWindow ) # Click the settings button to expose the settings - self._openHistogramSettings( driver, histWindow) - - # Select the display tab - displayTab = driver.find_element_by_xpath( "//div[@qxclass='qx.ui.tabview.TabButton']/div[contains(text(),'Display')]/.."); + self._openHistogramSettings( driver, histWindow ) + + # Navigate to Display tab of the Histogram Settings + displayTab = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='qx.ui.tabview.TabButton']/div[contains(text(),'Display')]/.."))) self.assertIsNotNone( displayTab, "Could not find histogram display tab" ); driver.execute_script( "arguments[0].scrollIntoView(true);", displayTab) - ActionChains( driver ).click( displayTab ).perform() + ActionChains(driver).click( displayTab ).perform() # Look for the binCountText field. binCountText = driver.find_element_by_xpath( "//input[starts-with(@id,'histogramBinCountTextField')]" ) @@ -87,11 +92,11 @@ def test_binCountChange(self): # Calculate percent difference from center. Note this will fail if the upper # bound of the slider changes. - textScrollPercent = (5000 - int(float(textValue))) / 10000.0 + textScrollPercent = (500 - int(float(textValue))) / 1000.0 print "scrollPercent=",textScrollPercent # Look for the bin count slider. - binCountSlider = driver.find_element_by_xpath( "//div[starts-with(@id, 'histogramBinCountSlider')]" ) + binCountSlider = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[starts-with(@id, 'histogramBinCountSlider')]"))) self.assertIsNotNone( binCountSlider, "Could not find bin count slider") # Width of the slider sliderSize = binCountSlider.size @@ -109,18 +114,22 @@ def test_binCountChange(self): sliderScrollAmount = sliderScrollAmount - scrollSize['width'] / 2 print 'Slider scroll adjusted=',sliderScrollAmount ActionChains( driver ).drag_and_drop_by_offset( sliderScroll, sliderScrollAmount, 0 ).perform() - time.sleep(1) + time.sleep( timeout ) # Check that the value goes to the server and gets set in the text field. newText = binCountText.get_attribute( "value") print 'Text=',newText - self.assertAlmostEqual( int(float(newText)), 5000 ,None,"Failed to scroll halfway",250) + self.assertAlmostEqual( int(float(newText)), 500 ,None,"Failed to scroll halfway",250) + # Test that the Histogram min and max zoom value def test_zoom(self): driver = self.driver - time.sleep(5) + timeout = selectBrowser._getSleep() + # Wait for the image window to be present (ensures browser is fully loaded) + imageWindow = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) + # Load an image Util.load_image(self, driver, "Default") @@ -138,17 +147,18 @@ def test_zoom(self): print "Max zoom=", maxZoomValue # Find the min and max zoom percentages. Decrease their values. - minPercentText = driver.find_element_by_id( "histogramZoomMinPercent") + minPercentText = driver.find_element_by_id("histogramZoomMinPercent") self.assertIsNotNone( minPercentText, "Could not find zoom min percent text field") + driver.execute_script( "arguments[0].scrollIntoView(true);", minPercentText) minZoomPercent = minPercentText.get_attribute( "value") - maxPercentText = driver.find_element_by_id( "histogramZoomMaxPercent") + maxPercentText = driver.find_element_by_id("histogramZoomMaxPercent") self.assertIsNotNone( maxPercentText, "Could not find zoom max percent text field") maxZoomPercent = maxPercentText.get_attribute( "value") driver.execute_script( "arguments[0].scrollIntoView(true);", maxPercentText) incrementAmount = 40; newMinZoomPercent = Util._changeElementText(self, driver, minPercentText, int(minZoomPercent) + incrementAmount) newMaxZoomPercent = Util._changeElementText(self, driver, maxPercentText, int(maxZoomPercent) - incrementAmount) - time.sleep(4) + time.sleep( timeout ) # Get the new min and max zoom values. newMinZoomValue = self._getTextValue( driver, "histogramZoomMinValue") @@ -162,12 +172,16 @@ def test_zoom(self): print "oldMax=", maxZoomValue, " newMax=",newMaxZoomValue self.assertGreater( float(maxZoomValue), float(newMaxZoomValue), "Max did not decrease") + # Test that histogram values will update when an additional image is loaded # in the image window. We then remove the image and check that the initial # data in the histogram is restored def test_histogramAddImage(self): driver = self.driver - time.sleep(5) + timeout = selectBrowser._getSleep() + + # Wait for the image window to be present (ensures browser is fully loaded) + imageWindow = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) # Load an image Util.load_image(self, driver, "Default") @@ -177,8 +191,7 @@ def test_histogramAddImage(self): ActionChains(driver).click( histWindow ).perform() # Click the settings button to expose the settings - self._openHistogramSettings(driver, histWindow ) - time.sleep(2) + self._openHistogramSettings( driver, histWindow ) # Get the max zoom value of the first image maxZoomValue = self._getTextValue( driver, "histogramZoomMaxValue") @@ -186,33 +199,19 @@ def test_histogramAddImage(self): # Load a different image in the same window Util.load_image(self, driver, "aH.fits") - time.sleep(2) + time.sleep( timeout ) # Check that the new max zoom value updates newMaxZoomValue = self._getTextValue( driver, "histogramZoomMaxValue") self.assertNotEqual(float(newMaxZoomValue), float(maxZoomValue), "The histogram did not update when a new image was loaded.") print "Second image maxZoomValue:", newMaxZoomValue - - # Remove the second image - imageWindow = driver.find_element_by_xpath("//div[@qxclass='skel.widgets.Window.DisplayWindowImage']") - ActionChains(driver).context_click(imageWindow).send_keys(Keys.ARROW_DOWN).send_keys( - Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys( - Keys.ARROW_DOWN).send_keys(Keys.ARROW_RIGHT).send_keys(Keys.ARROW_DOWN).send_keys( - Keys.ARROW_RIGHT).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - - # Allow the second image to be removed - time.sleep(2) - - # Get the new max zoom value - # Check that the max zoom value is restored to the first image data values - newZoomValue = self._getTextValue( driver, "histogramZoomMaxValue") - self.assertEqual( float(maxZoomValue), float(newZoomValue), "Histogram data values should be restored.") - print "After the second image is removed maxZoomValue:", newZoomValue - + # Test that the removal of an image will restore the Histogram to default values def test_histogramRemoveImage(self): driver = self.driver - time.sleep(5) + + # Wait for the image window to be present (ensures browser is fully loaded) + imageWindow = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) # Load an image Util.load_image( self, driver, "Default") @@ -224,16 +223,12 @@ def test_histogramRemoveImage(self): Keys.ARROW_DOWN).send_keys(Keys.ARROW_RIGHT).send_keys(Keys.ARROW_DOWN).send_keys( Keys.ARROW_RIGHT).send_keys(Keys.ENTER).perform() - # Allow image to fully close - time.sleep(2) - # Find and select the Histogram window histWindow = self._getHistogramWindow( driver ) ActionChains(driver).click( histWindow ) # Click the settings button to expose the settings self._openHistogramSettings( driver, histWindow ) - time.sleep(2) # Check that the histogram values are restored to default values newMaxZoomValue = self._getTextValue( driver, "histogramZoomMaxValue") @@ -242,7 +237,10 @@ def test_histogramRemoveImage(self): # Test that the histogram updates its values when the image is changed in the image window. def test_histogramChangeImage(self): driver = self.driver - time.sleep(5) + timeout = selectBrowser._getSleep() + + # Wait for the image window to be present (ensures browser is fully loaded) + imageWindow = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) # Load two images in the same image window Util.load_image( self, driver, "Default") @@ -254,32 +252,31 @@ def test_histogramChangeImage(self): # Click the settings button to expose the settings self._openHistogramSettings( driver, histWindow ) - time.sleep(2) # Record the Histogram max zoom value of the second image secondMaxZoomValue = self._getTextValue( driver, "histogramZoomMaxValue" ) print "Second image maxZoomValue:", secondMaxZoomValue # Find and click on the animation window - animWindow = driver.find_element_by_xpath( "//div[@qxclass='skel.widgets.Window.DisplayWindowAnimation']") + animWindow = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowAnimation']"))) self.assertIsNotNone( animWindow, "Could not find animation window") ActionChains(driver).click( animWindow ).perform() # Make sure the animation window is enabled by clicking an element within the window # From the context menu, uncheck the Channel Animator and check the Image Animator - channelText = driver.find_element_by_id( "ChannelIndexText") + channelText = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "ChannelIndexText"))) ActionChains(driver).click( channelText ).perform() ActionChains(driver).context_click( channelText ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys( - Keys.ARROW_DOWN ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_RIGHT - ).send_keys(Keys.SPACE).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - time.sleep(2) + Keys.ARROW_DOWN ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_RIGHT).send_keys(Keys.SPACE).send_keys( + Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() + time.sleep( timeout ) # Find the first value button and click the button - firstValueButton = driver.find_element_by_xpath( "//div[@class='qx-toolbar']/div[@qxclass='qx.ui.toolbar.Button'][1]") + firstValueButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@class='qx-toolbar']/div[@qxclass='qx.ui.toolbar.Button'][1]"))) self.assertIsNotNone( firstValueButton, "Could not find button to go to the first valid value") driver.execute_script( "arguments[0].scrollIntoView(true);", firstValueButton) ActionChains(driver).click( firstValueButton ).perform() - time.sleep(2) + time.sleep( timeout ) # Record the Histogram max zoom value of the first image firstMaxZoomValue = self._getTextValue( driver, "histogramZoomMaxValue" ) @@ -294,7 +291,10 @@ def test_histogramChangeImage(self): # histogram to the second image. This should fail, and the histogram values should not change. def test_histogramLinking(self): driver = self.driver - time.sleep(5) + timeout = selectBrowser._getSleep() + + # Wait for the image window to be present (ensures browser is fully loaded) + imageWindow = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) # Load an image Util.load_image( self, driver, "Default") @@ -308,111 +308,109 @@ def test_histogramLinking(self): # Click the settings button to expose the settings self._openHistogramSettings( driver, histWindow ) - time.sleep(2) # Record the max zoom value of the first image maxZoomValue = self._getTextValue( driver, "histogramZoomMaxValue" ) print "First image maxZoomValue:", maxZoomValue + time.sleep( timeout ) # Open link settings for the histogram - ActionChains(driver).context_click( histWindow ).send_keys( Keys.ARROW_DOWN ).send_keys( - Keys.ARROW_DOWN).send_keys( Keys.ENTER ).perform() - - # Change the link location of the animator to the second image - ActionChains(driver).move_to_element( histWindow ).click( histWindow ).drag_and_drop( - histWindow, imageWindow2).perform() + ActionChains(driver).context_click( histWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys( Keys.ENTER ).perform() + time.sleep( timeout ) - # Wait for the actions to be completely performed before continuing - time.sleep(2) + # Try to add a link from the Histogram to the second image + # This should fail: no link should be made from the Histogram to the second image + ActionChains(driver).move_to_element( histWindow ).click( histWindow ).drag_and_drop( histWindow, imageWindow2 ).perform() + time.sleep( timeout ) - # Get the new max zoom value - # Check that it did not change + # Check that the second image is not linked to the Histogram + # Check that the max zoom value did not change from the linking attempt to the second image newMaxZoomValue = self._getTextValue( driver, "histogramZoomMaxValue") print "New maxZoomValue:", newMaxZoomValue self.assertEqual( float( maxZoomValue ), float( newMaxZoomValue), "Histogram should not link to second image.") # Test removal of a link from the Histogram. - # Note: This test is disabled because drag_and_drop does not remove the link. - def stest_histogramLinkRemoval(self): + # These tests work on Chrome, but not Firefox. For some reason, when right clicking the image window, + # the context menu for the image window appears, and not the linking context menu. + def test_histogramLinkRemoval(self): driver = self.driver - time.sleep(5) + browser = selectBrowser._getBrowser() + + # This test only works for Chrome at the moment + if browser == 2: + # Find the Histogram window + histWindow = self._getHistogramWindow( driver ) - # Find the Histogram window - histWindow = self._getHistogramWindow( driver ) + # Open Link settings for the Histogram window + ActionChains(driver).context_click( histWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - # Open Link settings for the Histogram window - ActionChains(driver).context_click( histWindow ).send_keys(Keys.ARROW_DOWN).send_keys( - Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() + imageWindow = driver.find_element_by_xpath("//div[@class='qx-window-pane']") + ActionChains(driver).move_to_element( imageWindow ).context_click().perform() - # Remove link from the main image window from the Histogram - imageWindow = driver.find_element_by_xpath("//div[@qxclass='skel.widgets.Window.DisplayWindowImage']") - ActionChains(driver).move_to_element( imageWindow ).context_click( imageWindow ).send_keys( - Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() + # Remove link from the main image window from the Histogram + ActionChains(driver).move_to_element( imageWindow ).context_click().send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - # Exit Links before continuing - ActionChains(driver).send_keys( Keys.ESCAPE).perform(); + # Exit Links before continuing + ActionChains(driver).context_click().send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - # Load an image - Util.load_image( self, driver, "Default") + # Load an image + Util.load_image( self, driver, "Default") - # Find and select the histogram window - histWindow = self._getHistogramWindow( driver ) - ActionChains(driver).click( histWindow ).perform() + # Find and select the histogram window + histWindow = self._getHistogramWindow( driver ) + ActionChains(driver).click( histWindow ).perform() - # Click the settings button to expose the settings - self._openHistogramSettings( driver, histWindow ) - time.sleep(2) + # Click the settings button to expose the settings + self._openHistogramSettings( driver, histWindow ) - # Check that the histogram values are default values - newMaxZoomValue = self._getTextValue( driver, "histogramZoomMaxValue") - self.assertEqual( float(newMaxZoomValue), 1, "Histogram is linked to image after link was removed") + # Check that the histogram values are default values + newMaxZoomValue = self._getTextValue( driver, "histogramZoomMaxValue") + self.assertEqual( float(newMaxZoomValue), 1, "Histogram is linked to image after link was removed") # Test that we can change the linked image to the Histogram - # Note: This test is disabled because drag_and_drop does not remove the link - def stest_histogramChangeLinks(self): + def test_histogramChangeLinks(self): driver = self.driver - time.sleep(5) - - # Load an image in a separate window - imageWindow2 = Util.load_image_different_window( self, driver, "aH.fits") + browser = selectBrowser._getBrowser() + + # This test only works for Chrome at the moment + if browser == 2: + # Wait for the image window to be present (ensures browser is fully loaded) + imageWindow = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) - # Find and select the Histogram window - histWindow = self._getHistogramWindow( driver ) - ActionChains(driver).click( histWindow ).perform() + # Load an image in a separate window + imageWindow2 = Util.load_image_different_window( self, driver, "aH.fits") - # Click the settings button to expose the settings - self._openHistogramSettings( driver ) - time.sleep(2) + # Find and select the Histogram window + histWindow = self._getHistogramWindow( driver ) + ActionChains(driver).click( histWindow ).perform() - # Open Link settings for the Histogram window - ActionChains(driver).context_click( histWindow ).send_keys(Keys.ARROW_DOWN).send_keys( - Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() + # Click the settings button to expose the settings + self._openHistogramSettings( driver, histWindow ) - # Remove the link from the Histogram to the main image window - imageWindow = driver.find_element_by_xpath("//div[@qxclass='skel.widgets.Window.DisplayWindowImage']") - ActionChains(driver).move_to_element( imageWindow ).context_click( imageWindow ).send_keys( - Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() + # Open Link settings for the Histogram window + ActionChains(driver).context_click( histWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - # Exit links before continuing - ActionChains(driver).move_to_element( imageWindow ).context_click( imageWindow ).send_keys( - Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() + # Remove the link from the Histogram to the main image window + imageWindow = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) + ActionChains(driver).move_to_element( imageWindow ).context_click( imageWindow ).send_keys( + Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() + time.sleep( timeout ) - # Open link settings for the Histogram - ActionChains(driver).context_click( histWindow ).send_keys(Keys.ARROW_DOWN).send_keys( - Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() + # Exit links before continuing + ActionChains(driver).move_to_element( imageWindow ).context_click( imageWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() + # Open link settings for the Histogram + ActionChains(driver).context_click( histWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - # Link the Histogram to the second image - ActionChains(driver).move_to_element( histWindow ).click( histWindow ).drag_and_drop( - histWindow, imageWindow2).perform() - time.sleep(2) + # Link the Histogram to the second image + ActionChains(driver).move_to_element( histWindow ).click( histWindow ).drag_and_drop(histWindow, imageWindow2).perform() + time.sleep( timeout ) - # Exit links before continuing - ActionChains(driver).move_to_element( imageWindow ).context_click( imageWindow ).send_keys( - Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() + # Exit links before continuing + ActionChains(driver).move_to_element( imageWindow ).context_click( imageWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - # Check that the histogram values are not default values - newMaxZoomValue = self._getTextValue( driver, "histogramZoomMaxValue") - self.assertNotEqual( float(newMaxZoomValue), 1, "Histogram did not update to newly linked image") + # Check that the histogram values are not default values + newMaxZoomValue = self._getTextValue( driver, "histogramZoomMaxValue") + self.assertNotEqual( float(newMaxZoomValue), 1, "Histogram did not update to newly linked image") def tearDown(self): # Close the browser diff --git a/Skeleton3/html5/common/skel/source/class/skel/simulation/tLayout.py b/Skeleton3/html5/common/skel/source/class/skel/simulation/tLayout.py index de111c25..9b6cb835 100644 --- a/Skeleton3/html5/common/skel/source/class/skel/simulation/tLayout.py +++ b/Skeleton3/html5/common/skel/source/class/skel/simulation/tLayout.py @@ -5,6 +5,9 @@ from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.action_chains import ActionChains +from selenium.webdriver.support import expected_conditions as EC +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.common.by import By #Test that we can use commands switch between different layouts. class tLayout(unittest.TestCase): @@ -13,32 +16,32 @@ def setUp(self): Util.setUp(self, browser) def _clickLayoutButton(self, driver): - # Getting element not found in cache without this - time.sleep(4) + timeout = selectBrowser._getSleep() + time.sleep( timeout ) # Find the layout button on the menu bar and click it. - layoutButton = driver.find_element_by_xpath("//div[text()='Layout']/..") + layoutButton = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[text()='Layout']/.."))) self.assertIsNotNone( layoutButton, "Could not find layout button on the menu bar") - ActionChains(driver).click(layoutButton).perform() + ActionChains(driver).click( layoutButton ).perform() # Test that we can switch to image layout using the 'Layout' menu button. def test_layout_image(self): driver = self.driver - time.sleep(5) + timeout = selectBrowser._getSleep() + + # Wait for the image window to be present (ensures browser is fully loaded) + imageWindow = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) - # Getting element not found in cache without this. - driver.implicitly_wait(20) - # Find the layout button on the menu bar and click it. self._clickLayoutButton( driver ) # Find the layout image button in the submenu and click it. - imageLayoutButton = driver.find_element_by_xpath( "//div[text()='Image Layout']/..") + imageLayoutButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[text()='Image Layout']/.."))) self.assertIsNotNone( imageLayoutButton, "Could not find layout image button in submenu") ActionChains(driver).click( imageLayoutButton).perform() - time.sleep(5) + time.sleep( timeout ) # Check that there is an Image Window - imageWindow = driver.find_element_by_xpath("//div[@qxclass='skel.widgets.Window.DisplayWindowImage']") + imageWindow = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) self.assertIsNotNone( imageWindow, "Could not find an image window") # Check that there are no other Windows @@ -48,16 +51,15 @@ def test_layout_image(self): # Test that we can switch to image layout using the 'Layout' menu button. def test_layout_analysis(self): driver = self.driver - time.sleep(5) - # Getting element not found in cache without this. - driver.implicitly_wait(20) + # Wait for the image window to be present (ensures browser is fully loaded) + imageWindow = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) # Find the layout button on the menu bar and click it. self._clickLayoutButton( driver ) # Find the layout analysis button in the submenu and click it. - analysisLayoutButton = driver.find_element_by_xpath( "//div[text()='Analysis Layout']") + analysisLayoutButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[text()='Analysis Layout']"))) self.assertIsNotNone( analysisLayoutButton, "Could not find layout analysis button in submenu") ActionChains(driver).click( analysisLayoutButton).perform() @@ -66,19 +68,20 @@ def test_layout_analysis(self): self.assertIsNotNone( imageWindow, "Could not find an image window") # Check that there is a Histogram Window - histogramWindow = driver.find_element_by_xpath("//div[@qxclass='skel.widgets.Window.DisplayWindowHistogram']") + histogramWindow = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowHistogram']"))) self.assertIsNotNone( histogramWindow, "Could not find aCha histogram window") # Check that there is a Colormap Window - colormapWindow = driver.find_element_by_xpath("//div[@qxclass='skel.widgets.Window.DisplayWindowColormap']") + colormapWindow = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowColormap']"))) self.assertIsNotNone( colormapWindow, "Could not find a colormap window") # Check that there is an AnimatorWindow - animatorWindow = driver.find_element_by_xpath("//div[@qxclass='skel.widgets.Window.DisplayWindowAnimation']") + animatorWindow = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowAnimation']"))) self.assertIsNotNone( animatorWindow, "Could not find an animator window") # Check that there are the correct number of Windows - windowCount = Util.get_window_count(self, driver) + desktopList = driver.find_elements_by_xpath("//div[@qxclass='qx.ui.window.Desktop']") + windowCount = len( desktopList ) print windowCount self.assertEqual( windowCount, 4, "Image Layout does not have the correct number of window") @@ -86,14 +89,11 @@ def test_layout_analysis(self): # Test that we can set a custom layout with 5 rows and 3 columns def test_layout_custom(self): driver = self.driver - time.sleep(5) - - # Getting element not found in cache without this. - driver.implicitly_wait(20) + timeout = selectBrowser._getSleep() Util.layout_custom(self, driver, 5, 3 ) + time.sleep( timeout ) - # Check that there are the correct number of Windows windowCount = Util.get_window_count(self, driver) print windowCount diff --git a/Skeleton3/html5/common/skel/source/class/skel/simulation/tLoadImage.py b/Skeleton3/html5/common/skel/source/class/skel/simulation/tLoadImage.py index 3226db24..d8c9c1ab 100644 --- a/Skeleton3/html5/common/skel/source/class/skel/simulation/tLoadImage.py +++ b/Skeleton3/html5/common/skel/source/class/skel/simulation/tLoadImage.py @@ -15,14 +15,12 @@ def setUp(self): # Test that an image can be loaded and then closed. def test_load_image(self): driver = self.driver - time.sleep(5) # Load a specific image. - Util.load_image(self, driver, "Default") + imageWindow = Util.load_image(self, driver, "Default") # Click on the Data->Close->Image button to close the image. - imageWindow = driver.find_element_by_xpath("//div[@qxclass='skel.widgets.Window.DisplayWindowImage']") - ActionChains(driver).context_click(imageWindow).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_RIGHT).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_RIGHT).send_keys(Keys.ENTER).perform() + ActionChains(driver).context_click( imageWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_RIGHT).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_RIGHT).send_keys(Keys.ENTER).perform() def tearDown(self): # Close the browser diff --git a/Skeleton3/html5/common/skel/source/class/skel/simulation/tMenuToolVisibility.py b/Skeleton3/html5/common/skel/source/class/skel/simulation/tMenuToolVisibility.py index bf3f4fc6..152d51ad 100644 --- a/Skeleton3/html5/common/skel/source/class/skel/simulation/tMenuToolVisibility.py +++ b/Skeleton3/html5/common/skel/source/class/skel/simulation/tMenuToolVisibility.py @@ -3,8 +3,11 @@ import Util import time from selenium import webdriver +from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.action_chains import ActionChains +from selenium.webdriver.support import expected_conditions as EC +from selenium.webdriver.support.ui import WebDriverWait # Test that the customize dialog can be used to show/hide functionality on the # menu and tool bars. @@ -20,24 +23,26 @@ def _verifyClips(self, parentWidget, expectedCount ): clipCount = len( clipList ) print "clip list count=", clipCount self.assertEqual( clipCount, expectedCount, "Clip count does not match expected count") - + # Test that we can add a clip command to the toolbar and then remove it def test_tool_showHideClip(self): driver = self.driver - time.sleep(5) + + # Wait for the image window to be present (ensures browser is fully loaded) + imageWindow = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) - toolBar = driver.find_element_by_xpath("//div[@qxclass='skel.widgets.Menu.ToolBar']") + toolBar = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Menu.ToolBar']"))) self.assertIsNotNone( toolBar, "Could not find the tool bar") actionChains = ActionChains(driver) actionChains.context_click(toolBar).perform() # Click the customize item on the menu - customizeButton = driver.find_element_by_xpath( "//div[text()='Customize...']/..") + customizeButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[text()='Customize...']/.."))) self.assertIsNotNone( customizeButton, "Could not find the customize button in context") ActionChains(driver).click( customizeButton).perform() # First make sure no clips are checked - clippingButton = driver.find_element_by_xpath( "//div[text()='Clipping']/preceding-sibling::div/div") + clippingButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[text()='Clipping']/preceding-sibling::div/div"))) self.assertIsNotNone( clippingButton, "Could not clipping button in customize dialog") styleAtt = clippingButton.get_attribute( "style"); print "Style", styleAtt @@ -51,21 +56,21 @@ def test_tool_showHideClip(self): # Open the Clipping folder by performing 2 clicks so that the 98% clip button is visible # clippingTreeItem = clippingButton.find_element_by_xpath( '../..') - clippingOpenButton = driver.find_element_by_xpath( "//div[text()='Clipping']/../div[@qxclass='qx.ui.tree.core.FolderOpenButton']") + clippingOpenButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[text()='Clipping']/../div[@qxclass='qx.ui.tree.core.FolderOpenButton']"))) self.assertIsNotNone( clippingOpenButton, "Could not find open folder button for clipping") ActionChains( driver ).click( clippingOpenButton ).perform() - clipOpenButton = driver.find_element_by_xpath( "//div[text()='Clips']/../div[@qxclass='qx.ui.tree.core.FolderOpenButton']") + clipOpenButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[text()='Clips']/../div[@qxclass='qx.ui.tree.core.FolderOpenButton']"))) self.assertIsNotNone( clipOpenButton, "Could not find open folder button for clip") driver.execute_script( "arguments[0].scrollIntoView(true);", clipOpenButton) ActionChains( driver ).click( clipOpenButton ).perform() # Now click the 98% clip button on the customize dialog - clipButton = driver.find_element_by_xpath( "//div[text()='98%']/preceding-sibling::div/div/..") + clipButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[text()='98%']/preceding-sibling::div/div/.."))) self.assertIsNotNone( clipButton, "Could not find clip button in customize dialog") ActionChains(driver).click( clipButton).perform() # Verify that the 98% clip appears on the tool bar - clipRadio = toolBar.find_element_by_xpath( "//div[text()='98%']") + clipRadio = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[text()='98%']"))) self.assertIsNotNone( clipRadio, "Clip radio did not appear on tool bar") # Remove the 98% clip by unclicking the button on the customize dialog @@ -77,32 +82,30 @@ def test_tool_showHideClip(self): # Test that we can remove clipping from appearing on the menu bar. def test_menu_hideClipping(self): driver = self.driver - time.sleep(5) - - # Getting element not found in cache without this. - # driver.implicitly_wait(20) # Click on an CasaImageLoader Window so that clipping is available on the menu. - imageWindow = driver.find_element_by_xpath("//div[@id='CasaImageLoader']") + imageWindow = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) ActionChains(driver).click(imageWindow).perform() - + # Verify that clipping commands can be found on the menu bar. - menuBar = driver.find_element_by_xpath("//div[@qxclass='skel.widgets.Menu.MenuBar']") + menuBar = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Menu.MenuBar']"))) self.assertIsNotNone( menuBar, "Could not find the menu bar") clipping = menuBar.find_elements_by_xpath( "./div[contains(text(), 'Clipping')]" ) self.assertIsNotNone( clipping, "Clipping not present on menu bar"); - - # Open the context menu by right clicking the menu bar + + # Now right click the toolbar + toolBar = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Menu.ToolBar']"))) + self.assertIsNotNone( toolBar, "Could not find the tool bar") actionChains = ActionChains(driver) - actionChains.context_click(menuBar).perform() - - # Click the customize item on the menu - customizeButton = driver.find_element_by_xpath( "//div[text()='Customize...']/..") + actionChains.context_click(toolBar).perform() + + # Find and click the customize button + customizeButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[text()='Customize...']/.."))) self.assertIsNotNone( customizeButton, "Could not find the customize button in context") ActionChains(driver).click( customizeButton).perform() # Uncheck clipping - clippingButton = driver.find_element_by_xpath( "//div[text()='Clipping']/preceding-sibling::div/div") + clippingButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[text()='Clipping']/preceding-sibling::div/div"))) self.assertIsNotNone( clippingButton, "Could not clipping button in customize dialog") styleAtt = clippingButton.get_attribute( "style"); print "Style", styleAtt @@ -110,14 +113,14 @@ def test_menu_hideClipping(self): print "Clipping checked" clipParent = clippingButton.find_element_by_xpath( '..') ActionChains(driver).click( clipParent ).perform() - + # Check that the clipping menu item is no longer available try: clipButton = menuBar.find_element_by_xpath( "./div[contains(text(), 'Clipping')]" ) self.assertTrue( False, "Should not be able to locate clipping button") except Exception: - print "Test succeeded because we should not be able to find clipping" - + print "Test succeeded because we should not be able to find clipping" + def tearDown(self): # Close the browser self.driver.close() diff --git a/Skeleton3/html5/common/skel/source/class/skel/simulation/tSnapshot.py b/Skeleton3/html5/common/skel/source/class/skel/simulation/tSnapshot.py index 255b042e..b03ce42d 100644 --- a/Skeleton3/html5/common/skel/source/class/skel/simulation/tSnapshot.py +++ b/Skeleton3/html5/common/skel/source/class/skel/simulation/tSnapshot.py @@ -5,6 +5,9 @@ from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.action_chains import ActionChains +from selenium.webdriver.support import expected_conditions as EC +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.common.by import By #Test that a layout snapshot can be saved/restored. class tSnapshot(unittest.TestCase): @@ -28,97 +31,82 @@ def _setChecked(self, driver, checkBox, checked): if checked != oldChecked : checkParent = checkBox.find_element_by_xpath( '..') ActionChains(driver).click( checkParent ).perform() - #Allow action to complete before continuing - time.sleep(1) # Click the Restore... option in the Sessions submenu def _clickSessionRestoreButton(self,driver): - restoreButton = driver.find_element_by_xpath( "//div[text()='Manage/Restore...']/..") + restoreButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[text()='Manage/Restore...']/.."))) self.assertIsNotNone( restoreButton, "Could not find restore session button in submenu") ActionChains(driver).send_keys( Keys.ARROW_DOWN).send_keys( Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - #Allow action to complete before continuing - time.sleep(1) # Click the Save... option in the Sessions submenu def _clickSessionSaveButton(self,driver): - # Find the save session button in the submenu and click it. - saveButton = driver.find_element_by_xpath( "//div[text()='Save...']/..") + # Find the save session button in the submenu and click it. + saveButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[text()='Save...']/.."))) self.assertIsNotNone( saveButton, "Could not find save session button in submenu") ActionChains(driver).click( saveButton).perform() - #Allow action to complete before continuing - time.sleep(1) # Click the "Sessions" menu item def _clickSessionButton(self, driver ): # Find the session button on the menu bar and click it. - sessionButton = driver.find_element_by_xpath("//div[text()='Session']/..") + sessionButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[text()='Session']/.."))) self.assertIsNotNone( sessionButton, "Could not find div with text session") ActionChains(driver).click(sessionButton).perform() - #Allow action to complete before continuing - time.sleep(1) # Close the save session pop-up def _closeSave(self, driver): - closeButton = driver.find_element_by_xpath(".//div[@qxclass='qx.ui.form.Button']/div[text()='Close']/..") + closeButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, ".//div[@qxclass='qx.ui.form.Button']/div[text()='Close']/.."))) self.assertIsNotNone( closeButton, "Could not find a button to close the snapshot popup") ActionChains(driver).click( closeButton).perform() - #Allow action to complete before continuing - time.sleep(1) # Close the restore session pop-up def _closeRestore(self, driver): - closeButton = driver.find_element_by_xpath(".//div[@qxclass='qx.ui.form.Button']/div[text()='Close']/..") + closeButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, ".//div[@qxclass='qx.ui.form.Button']/div[text()='Close']/.."))) self.assertIsNotNone( closeButton, "Could not find a button to close the snapshot popup") ActionChains(driver).click( closeButton).perform() - #Allow action to complete before continuing - time.sleep(1) # Select the name of the snapshot to restore def _selectRestoreSnapshot(self, driver, restoreName): tableRowLocator = "//div[text()='" + restoreName+ "']/.." - tableRow = driver.find_element_by_xpath( tableRowLocator ) + tableRow = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, tableRowLocator))) self.assertIsNotNone( tableRow, "Could not find the restore name combo") ActionChains(driver).click( tableRow ).perform() - #Allow action to complete before continuing - time.sleep(1) # Set the type of state that should be saved def _setSaveOptions(self, driver, savePreferences, saveLayout, saveData ): - prefDiv = driver.find_element_by_xpath( "//div[@qxclass='qx.ui.form.CheckBox']/div[text()='Preferences']/..") - prefCheck = prefDiv.find_element_by_xpath( "./div[@class='qx-checkbox']") + # Find preferences div + prefDiv = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='qx.ui.form.CheckBox']/div[text()='Preferences']/.."))) + prefCheck = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='qx.ui.form.CheckBox']/div[text()='Preferences']/../div[@class='qx-checkbox']"))) self.assertIsNotNone( prefCheck, "Could not find preferences check") self._setChecked( driver, prefCheck, savePreferences ) - dataDiv = driver.find_element_by_xpath( "//div[@qxclass='qx.ui.form.CheckBox']/div[text()='Session']/..") + # Find data div + dataDiv = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='qx.ui.form.CheckBox']/div[text()='Session']/.."))) self.assertIsNotNone( dataDiv, "Could not find data div") - dataCheck = dataDiv.find_element_by_xpath( "./div[@class='qx-checkbox']") + dataCheck = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='qx.ui.form.CheckBox']/div[text()='Session']/../div[@class='qx-checkbox']"))) self.assertIsNotNone( dataCheck, "Could not find data check") self._setChecked( driver, dataCheck, saveData ) - layoutCheck = driver.find_element_by_xpath( "//div[@qxclass='qx.ui.form.CheckBox']/div[text()='Layout']/following-sibling::div") + # Find layout div + layoutCheck = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='qx.ui.form.CheckBox']/div[text()='Layout']/following-sibling::div"))) self.assertIsNotNone( layoutCheck, "Could not find layout check") self._setChecked( driver, layoutCheck, saveLayout ) # Set the name of the session to save. def _setSaveName(self, driver, saveName): - snapshotSaveText = driver.find_element_by_id( "snapshotSaveName") + snapshotSaveText = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "snapshotSaveName"))) self.assertIsNotNone( snapshotSaveText, "Could not find input for typing in snapshot name") snapshotSaveText.clear() snapshotSaveText.send_keys( saveName ) # Save the snapshot. def _saveSnapshot(self, driver ): - saveSnapButton = driver.find_element_by_xpath(".//div[@qxclass='qx.ui.form.Button']/div[text()='Save']/..") + saveSnapButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, ".//div[@qxclass='qx.ui.form.Button']/div[text()='Save']/.."))) self.assertIsNotNone( saveSnapButton, "Could not find a button to save the snapshot") ActionChains(driver).click( saveSnapButton).perform() - #Allow action to complete before continuing - time.sleep(1) - + # Restore the snapshot def _restoreSnapshot(self, driver ): - restoreSnapButton = driver.find_element_by_xpath(".//div[@qxclass='qx.ui.form.Button']/div[text()='Restore']/..") + restoreSnapButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, ".//div[@qxclass='qx.ui.form.Button']/div[text()='Restore']/.."))) self.assertIsNotNone( restoreSnapButton, "Could not find a button to restore the snapshot") ActionChains(driver).click( restoreSnapButton).perform() - #Allow action to complete before continuing - time.sleep(1) def tearDown(self): #Close the browser diff --git a/Skeleton3/html5/common/skel/source/class/skel/simulation/tSnapshotData.py b/Skeleton3/html5/common/skel/source/class/skel/simulation/tSnapshotData.py index 6c4f7168..62104c17 100644 --- a/Skeleton3/html5/common/skel/source/class/skel/simulation/tSnapshotData.py +++ b/Skeleton3/html5/common/skel/source/class/skel/simulation/tSnapshotData.py @@ -6,6 +6,10 @@ from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.action_chains import ActionChains +from selenium.webdriver.support import expected_conditions as EC +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.common.by import By + #Test that a data snapshot can be saved/restored. class tSnapshotData(tSnapshot.tSnapshot): @@ -15,9 +19,8 @@ def setUp(self): Util.setUp(self, browser) def _verifyImage(self, driver, count ): - driver.implicitly_wait(5) #Get the upper bound of images from the image animator - imageUpperSpin = driver.find_element_by_xpath( "//div[@id='ImageUpperBoundSpin']/input") + imageUpperSpin = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@id='ImageUpperBoundSpin']/input"))) self.assertIsNotNone( imageUpperSpin, "Could not find upper bound for image animator") imageCount = imageUpperSpin.get_attribute( "value") self.assertEqual( int(imageCount), count, "Incorrect image count") @@ -26,7 +29,10 @@ def _verifyImage(self, driver, count ): # Set the channel animator back to 0, the first channel. Restore a data snapshot. def test_animator_channel(self): driver = self.driver - time.sleep(5) + timeout = selectBrowser._getSleep() + + # Wait for the image window to be present (ensures browser is fully loaded) + imageWindow = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) # Load an image so that there are a non-trivial number of channels. #At some point this test will need to be rewritten to use a @@ -34,13 +40,13 @@ def test_animator_channel(self): Util.load_image(self, driver, "Default") # Find the last channel by finding the value of the upper bound spin box - upperSpin = driver.find_element_by_xpath( "//div[@id='ChannelUpperBoundSpin']/input") + upperSpin = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@id='ChannelUpperBoundSpin']/input"))) self.assertIsNotNone( upperSpin, "Could not find channel animator upper bound spin box") lastChannel = upperSpin.get_attribute( "value") print 'Last channel', lastChannel # Set the channel animator to the last channel by typing into the text box. - indexText = driver.find_element_by_xpath( "//input[@id='ChannelIndexText']") + indexText = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//input[@id='ChannelIndexText']"))) self.assertIsNotNone( indexText, "Could not find channel input text") Util._changeElementText( self, driver, indexText, lastChannel) @@ -66,7 +72,7 @@ def test_animator_channel(self): # Now set the channel animator to 0 by typing into the index text box. #indexText = driver.find_element_by_xpath( "//input[@id='ChannelIndexText']") #self.assertIsNotNone( indexText, "Could not find channel input text") - Util._changeElementText(self, driver, indexText, 0) + Util._changeElementText( self, driver, indexText, 0) # Click the restore sessions button self._clickSessionButton( driver ) @@ -80,33 +86,29 @@ def test_animator_channel(self): # Close the restore dialog self._closeRestore( driver ) - - # Allow the session to be restored - time.sleep(2) + time.sleep( timeout ) # Verify the animator channel is back to the last one - #indexText = driver.find_element_by_xpath( "//input[@id='ChannelIndexText']") - #self.assertIsNotNone( indexText, "Could not find channel input text") channelVal = indexText.get_attribute( "value") self.assertEqual( channelVal, lastChannel, "Channel animator did not get restored to last channel") - + # Load a particular image. Save a data snapshot. # Load a new image. Restore a data snapshot. # Test that the original image is loaded but the second one is not def test_image_load(self): driver = self.driver - time.sleep(5) - - #Getting element not found in cache without this. - driver.implicitly_wait(20) + timeout = selectBrowser._getSleep() + + # Wait for the image window to be present (ensures browser is fully loaded) + imageWindow = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) #Click on the animation window so that its actions will be enabled - animationWindow = driver.find_element_by_xpath("//div[@qxclass='skel.widgets.Window.DisplayWindowAnimation']") + animationWindow = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowAnimation']"))) self.assertIsNotNone( animationWindow, "Could not find animation window") #Make sure the animation window is clicked by clicking an element within the window - channelText = driver.find_element_by_id("ChannelIndexText") + channelText = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "ChannelIndexText"))) ActionChains(driver).click( channelText).perform() ActionChains(driver).context_click( channelText ).perform() @@ -114,16 +116,15 @@ def test_image_load(self): ActionChains( driver).send_keys( Keys.ARROW_DOWN).send_keys( Keys.ARROW_DOWN).send_keys( Keys.ARROW_DOWN).send_keys( Keys.ARROW_DOWN).send_keys( Keys.ARROW_RIGHT).send_keys( Keys.ARROW_DOWN).send_keys( Keys.ENTER).perform() - time.sleep(2) - imageUpperSpin = driver.find_element_by_xpath( "//div[@id='ImageUpperBoundSpin']/input") + imageUpperSpin = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@id='ImageUpperBoundSpin']/input"))) driver.execute_script( "arguments[0].scrollIntoView(true);", imageUpperSpin ) # Load an image Util.load_image(self, driver, "Default") # Find the session button on the menu bar and click it. - menuBar = driver.find_element_by_xpath("//div[@qxclass='skel.widgets.Menu.MenuBar']") + menuBar = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Menu.MenuBar']"))) self.assertIsNotNone( menuBar, "Could not find the menu bar") self._clickSessionButton( driver ) @@ -161,9 +162,10 @@ def test_image_load(self): # Close the restore dialog self._closeRestore( driver ) + time.sleep( timeout ) # Verify that only the original image is loaded self._verifyImage( driver, 0 ) - + if __name__ == "__main__": unittest.main() \ No newline at end of file diff --git a/Skeleton3/html5/common/skel/source/class/skel/simulation/tSnapshotLayout.py b/Skeleton3/html5/common/skel/source/class/skel/simulation/tSnapshotLayout.py index aa5601db..05b6217b 100644 --- a/Skeleton3/html5/common/skel/source/class/skel/simulation/tSnapshotLayout.py +++ b/Skeleton3/html5/common/skel/source/class/skel/simulation/tSnapshotLayout.py @@ -2,9 +2,13 @@ import Util import time import unittest +import selectBrowser from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.action_chains import ActionChains +from selenium.webdriver.support import expected_conditions as EC +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.common.by import By #Test that a layout snapshot can be saved/restored. class tSnapshotLayout(tSnapshot.tSnapshot): @@ -13,13 +17,12 @@ class tSnapshotLayout(tSnapshot.tSnapshot): # the analysis layout def test_analysis_saveRestore(self): driver = self.driver - time.sleep(5) - + timeout = selectBrowser._getSleep() + #For later use, determine the number of DisplayWindows. windowList = driver.find_elements_by_xpath("//div[@qxclass='skel.widgets.Window.DisplayDesktop']") windowCount = len( windowList ) print "Window Count=", windowCount - time.sleep(2) # Find the session button on the menu bar and click it. self._clickSessionButton( driver ) @@ -41,10 +44,10 @@ def test_analysis_saveRestore(self): self._closeSave( driver ) # Change to an image layout - layoutButton = driver.find_element_by_xpath("//div[text()='Layout']/..") + layoutButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[text()='Layout']/.."))) self.assertIsNotNone( layoutButton, "Could not find div with text layout") ActionChains(driver).click(layoutButton).perform() - imageLayoutButton = driver.find_element_by_xpath( "//div[text()='Image Layout']/..") + imageLayoutButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[text()='Image Layout']/.."))) self.assertIsNotNone( imageLayoutButton, "Could not find layout image button in submenu") ActionChains(driver).click( imageLayoutButton).perform() @@ -60,7 +63,7 @@ def test_analysis_saveRestore(self): # Close the restore dialog self._closeRestore( driver ) - time.sleep(2) + time.sleep( timeout ) # Verify the window count is the same newWindowList = driver.find_elements_by_xpath("//div[@qxclass='skel.widgets.Window.DisplayDesktop']") diff --git a/Skeleton3/html5/common/skel/source/class/skel/simulation/tSnapshotPreferences.py b/Skeleton3/html5/common/skel/source/class/skel/simulation/tSnapshotPreferences.py index a8c72dc3..b4b3e325 100644 --- a/Skeleton3/html5/common/skel/source/class/skel/simulation/tSnapshotPreferences.py +++ b/Skeleton3/html5/common/skel/source/class/skel/simulation/tSnapshotPreferences.py @@ -6,6 +6,9 @@ from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.action_chains import ActionChains +from selenium.webdriver.support import expected_conditions as EC +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.common.by import By # Test that a preference snapshot can be saved/restored. class tSnapshotPreferences(tSnapshot.tSnapshot): @@ -57,15 +60,16 @@ def _restorePreferences(self, driver ): def _setAnimatorToJump(self, driver ): - # Find the settings button on the animator and click it. - time.sleep(2) - settingsButton = driver.find_element_by_xpath("//div[@qxclass='qx.ui.form.CheckBox']/div[text()='Settings...']") + timeout = selectBrowser._getSleep() + # Necessary for Chrome + time.sleep( timeout ) + # Find the settings button on the animator and click it. + settingsButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='qx.ui.form.CheckBox']/div[text()='Settings...']"))) self.assertIsNotNone( settingsButton, "Could not find animator settings button") ActionChains( driver).click( settingsButton).perform() - time.sleep(2) # Find the jump radio button in the settings and click it - jumpButton = driver.find_element_by_xpath( "//div[@qxclass='qx.ui.form.RadioButton']/div[text()='Jump']/following-sibling::div") + jumpButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='qx.ui.form.RadioButton']/div[text()='Jump']/following-sibling::div"))) self.assertIsNotNone( jumpButton, "Could not find jump button in settings") # Scroll the animator window so the jump button is visible. driver.execute_script( "arguments[0].scrollIntoView(true);", jumpButton) @@ -83,8 +87,11 @@ def _verifyChecked(self, driver, radButton ): # count remains the same with no animator. def test_restore_missing(self): driver = self.driver - time.sleep(5) - + timeout = selectBrowser._getSleep() + + # Wait for the image window to be present (ensures browser is fully loaded) + imageWindow = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) + # Store the window count windowCount = Util.get_window_count( self, driver ) @@ -99,9 +106,7 @@ def test_restore_missing(self): # Locate the animator window and bring up the right-context menu, # changing to a CasaImageLoader. Util.animation_to_image_window( self, driver ) - - # Wait for the window to change to a CasaImageLoader - time.sleep(2) + time.sleep( timeout ) # Verify that there are now no animation windows. animWindowList = driver.find_elements_by_xpath("//div[@qxclass='skel.widgets.Window.DisplayWindowAnimation']") @@ -110,6 +115,7 @@ def test_restore_missing(self): # Restore the preferences self._restorePreferences( driver ) + time.sleep( timeout ) # Verify that there are no errors present statusLabel = driver.find_element_by_id( "statusLabel") @@ -124,7 +130,10 @@ def test_restore_missing(self): # Check that the animator reverts back to jump behavior. def test_animator_jump(self): driver = self.driver - time.sleep(5) + timeout = selectBrowser._getSleep() + + # Wait for the image window to be present (ensures browser is fully loaded) + imageWindow = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) # Set the animator to jump self._setAnimatorToJump( driver ); @@ -133,15 +142,16 @@ def test_animator_jump(self): self._savePreferences(driver ) # Find the wrap radio button in the animator settings and click it - wrapButton = driver.find_element_by_xpath( "//div[@qxclass='qx.ui.form.RadioButton']/div[text()='Wrap']/following-sibling::div") + wrapButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='qx.ui.form.RadioButton']/div[text()='Wrap']/following-sibling::div"))) self.assertIsNotNone( wrapButton, "Could not find wrap button in settings") self._setChecked( driver, wrapButton, True ) # Restore the preferences self._restorePreferences( driver ) + time.sleep( timeout ) # Verify the animator jump end behavior is checked - jumpButton = driver.find_element_by_xpath( "//div[@qxclass='qx.ui.form.RadioButton']/div[text()='Jump']/following-sibling::div") + jumpButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='qx.ui.form.RadioButton']/div[text()='Jump']/following-sibling::div"))) self.assertIsNotNone( jumpButton, "Could not find jump button in settings") self._verifyChecked( driver, jumpButton ) @@ -150,7 +160,10 @@ def test_animator_jump(self): # Check the second animator is also set to jump. def test_global_prefs(self): driver = self.driver - time.sleep(5) + timeout = selectBrowser._getSleep() + + # Wait for the image window to be present (ensures browser is fully loaded) + imageWindow = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) # Set the animator to jump self._setAnimatorToJump( driver ); @@ -162,16 +175,16 @@ def test_global_prefs(self): imageWindow = driver.find_element_by_xpath("//div[@qxclass='skel.widgets.Window.DisplayWindowImage']") self.assertIsNotNone( imageWindow, "Could not find image window") ActionChains(driver).context_click(imageWindow).send_keys( Keys.ARROW_RIGHT ).send_keys(Keys.ARROW_RIGHT).send_keys(Keys.ARROW_DOWN).send_keys( Keys.ENTER ).perform() - time.sleep(2) + time.sleep( timeout ) # Find the settings button on the animator and click it so jump will be visible - settingsButton = driver.find_element_by_xpath( "//div[@qxclass='qx.ui.form.CheckBox']//div[text()='Settings...']/..") + settingsButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='qx.ui.form.CheckBox']//div[text()='Settings...']/.."))) self.assertIsNotNone( settingsButton, "Could not find animator settings button") ActionChains( driver).click( settingsButton).perform() - time.sleep(2) # Restore the preferences self._restorePreferences(driver) + time.sleep( timeout ) # Check that both animators are now displaying jump # Verify the animator jump end behavior is checked @@ -188,26 +201,29 @@ def test_global_prefs(self): # Check that the toolbar is hidden. def test_toolbar_hide(self): driver = self.driver - time.sleep(5) - + timeout = selectBrowser._getSleep() + + # Wait for the image window to be present (ensures browser is fully loaded) + imageWindow = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) + time.sleep( timeout ) + # Find the preferences button on the menu bar and click it. - menuBar = driver.find_element_by_xpath("//div[@qxclass='skel.widgets.Menu.MenuBar']") + menuBar = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Menu.MenuBar']"))) self.assertIsNotNone( menuBar, "Could not find the menu bar") - preferencesButton = driver.find_element_by_xpath("//div[text()='Preferences']/..") + preferencesButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[text()='Preferences']/.."))) self.assertIsNotNone( preferencesButton, "Could not find div with text Preferences") ActionChains(driver).click(preferencesButton).perform() - driver.implicitly_wait(10) # Click the show button on the sub menu. - showButton = driver.find_element_by_xpath("//div/div[text()='Show']/..") + showButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div/div[text()='Show']/.."))) self.assertIsNotNone(showButton, "Could not click open button on data subcontext menu.") ActionChains(driver).click( showButton).perform() - time.sleep(2) - showToolButton = driver.find_element_by_xpath( "//div[text()='Show Tool Bar']/..") + + showToolButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[text()='Show Tool Bar']/.."))) self.assertIsNotNone( showToolButton, "Could not find show tool button") ActionChains(driver).click( showToolButton).perform() - time.sleep(4) - + time.sleep( timeout ) + # Verify the toolbar is NOT visible toolVisible = self._isToolbarVisible( driver ) self.assertFalse( toolVisible, "Tool bar was not hidden") @@ -217,17 +233,16 @@ def test_toolbar_hide(self): # Show the toolbar # Find the preferences button on the menu bar and click it. - preferencesButton = driver.find_element_by_xpath("//div[text()='Preferences']/..") + preferencesButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[text()='Preferences']/.."))) self.assertIsNotNone( preferencesButton, "Could not find div with text Preferences") ActionChains(driver).click(preferencesButton).perform() - time.sleep(2) - + # Click the show tool bar button on the sub menu. ActionChains(driver).send_keys( Keys.ARROW_DOWN ).send_keys( Keys.ARROW_RIGHT ).send_keys( Keys.ARROW_DOWN ).send_keys( Keys.ARROW_DOWN ).send_keys( Keys.ENTER ).perform() - time.sleep(2) + time.sleep( timeout ) #Verify the toolbar is now visible - toolBar = driver.find_element_by_xpath("//div[@qxclass='skel.widgets.Menu.ToolBar']") + toolBar = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Menu.ToolBar']"))) self.assertIsNotNone( toolBar, "Tool bar is not visible") # Click the restore sessions button @@ -242,7 +257,7 @@ def test_toolbar_hide(self): # Close the restore dialog self._closeRestore( driver ) - time.sleep(2) + time.sleep( timeout) # Verify the toolbar is hidden again toolVisible = self._isToolbarVisible( driver) diff --git a/Skeleton3/html5/common/skel/source/class/skel/simulation/tStatistics.py b/Skeleton3/html5/common/skel/source/class/skel/simulation/tStatistics.py index 3a3fd209..3e760185 100644 --- a/Skeleton3/html5/common/skel/source/class/skel/simulation/tStatistics.py +++ b/Skeleton3/html5/common/skel/source/class/skel/simulation/tStatistics.py @@ -5,6 +5,10 @@ from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.action_chains import ActionChains +from selenium.webdriver.support import expected_conditions as EC +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.common.by import By + # Tests of Statistics functionality class tStatistics( unittest.TestCase ): @@ -16,18 +20,19 @@ def setUp(self): # Check that the Stats Window is linked to the image window by default def test_statsDefaultLinking(self): driver = self.driver - time.sleep(5) # Load a large test image. Util.load_image( self, driver, "aH.fits") # Move to the center of the image window so data appears in the Stats Window - imageWindow = driver.find_element_by_id( "CasaImageLoader") + imageWindow = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) ActionChains(driver).move_to_element( imageWindow ).perform() - time.sleep(2) + + # Sometimes text does not appear, therefore move mouse cursor + ActionChains(driver).move_by_offset( 100, 100 ).perform() # Check that the Stastics window is linked to the image window - statsText = driver.find_element_by_xpath("//div[@qxclass='skel.boundWidgets.Label']") + statsText = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.boundWidgets.Label']"))) statsText = statsText.get_attribute('textContent') # Check that the Default sky text appears in the Stats Window @@ -38,134 +43,137 @@ def test_statsDefaultLinking(self): # after removing the old link from the main image window def test_statsChangeLinkUpdate(self): driver = self.driver - time.sleep(5) + browser = selectBrowser._getBrowser() - # Load an image in a new image window - imageWindow2 = Util.load_image_different_window( self, driver, "aH.fits") + # Test only works on Chrome + if browser ==2: + # Load an image in a new image window + imageWindow2 = Util.load_image_different_window( self, driver, "aH.fits") - # Find and click on the Statistics window - statsWindow = driver.find_element_by_xpath("//div[@id='Statistics']") - self.assertIsNotNone( statsWindow, "Could not find statistics window") - ActionChains(driver).click( statsWindow ).perform() - time.sleep(2) + # Find and click on the Statistics window + statsWindow = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@id='Statistics']"))) + self.assertIsNotNone( statsWindow, "Could not find statistics window") + ActionChains(driver).click( statsWindow ).perform() - # In Stastics context menu, open Link Settings - ActionChains(driver).context_click( statsWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - time.sleep(2) - - # Remove the link from the Statistics Window to the image window - imageWindow = driver.find_element_by_xpath("//div[@qxclass='skel.widgets.Window.DisplayWindowImage']") - ActionChains(driver).move_to_element( imageWindow ).context_click( imageWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - time.sleep(2) + # In Stastics context menu, open Link Settings + ActionChains(driver).context_click( statsWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() + + # Remove the link from the Statistics Window to the image window + imageWindow = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) + ActionChains(driver).move_to_element( imageWindow ).context_click( imageWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - # Change the link to the loaded image - ActionChains(driver).move_to_element( statsWindow ).click( statsWindow ).drag_and_drop( statsWindow, imageWindow2).perform() + # Change the link to the loaded image + ActionChains(driver).move_to_element( statsWindow ).click( statsWindow ).drag_and_drop( statsWindow, imageWindow2).perform() - # Exit links - ActionChains(driver).move_to_element( statsWindow ).context_click( statsWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - time.sleep(2) + # Exit links + ActionChains(driver).move_to_element( statsWindow ).context_click( statsWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - # Move to the center of the image window so data appears in the Stats Window - ActionChains(driver).move_to_element( imageWindow2 ).perform() - time.sleep(2) + # Move to the center of the image window so data appears in the Stats Window + ActionChains(driver).move_to_element( imageWindow2 ).perform() - # First check that there is text in the Stats Window - statsText = len(driver.find_elements_by_xpath("//div[@qxclass='skel.boundWidgets.Label']")) - self.assertEqual( int(statsText), 1, "Should be able to find text in Stats Window") + # Sometimes text does not appear, therefore move mouse cursor + ActionChains(driver).move_by_offset( 100, 100 ).perform() - # Check that the Stastics window is linked to the image window - statsText = driver.find_element_by_xpath("//div[@qxclass='skel.boundWidgets.Label']") - statsText = statsText.get_attribute('textContent') - - # Check that the Default sky text appears in the Stats Window - statsText = statsText.startswith("Default sky") - self.assertEqual( statsText, 1, "Stats window did not link to image after previous link was removed and new link was created to different window") + # First check that there is text in the Stats Window + statsText = len(driver.find_elements_by_xpath("//div[@qxclass='skel.boundWidgets.Label']")) + self.assertEqual( int(statsText), 1, "Should be able to find text in Stats Window") + + # Check that the Stastics window is linked to the image window + statsText = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.boundWidgets.Label']"))) + statsText = statsText.get_attribute('textContent') + + # Check that the Default sky text appears in the Stats Window + statsText = statsText.startswith("Default sky") + self.assertEqual( statsText, 1, "Stats window did not link to image after previous link was removed and new link was created to different window") # Check that the Stats Window is not linked to the main window after changing links def test_statsChangeLink(self): driver = self.driver - time.sleep(5) - - # Find and click on the image window - imageWindow = driver.find_element_by_id( "CasaImageLoader") - self.assertIsNotNone( imageWindow, "Could not find image display window") - ActionChains(driver).click( imageWindow ).perform() - - # Click the Window button - windowButton = driver.find_element_by_xpath( "//div[text()='Window']/..") - self.assertIsNotNone( windowButton, "Could not click window button in the context menu") - ActionChains(driver).click(windowButton).perform() - - # Look for the add button in the submenu. - addButton = driver.find_element_by_xpath( "//div/div[text()='Add']/..") - self.assertIsNotNone( addButton, "Could not click minimize button on window subcontext menu.") - ActionChains(driver).click( addButton ).perform() - time.sleep(2) + browser = selectBrowser._getBrowser() - # Check that we now have a generic empty window in the display and that the window count has gone up by one. - emptyWindow = driver.find_element_by_xpath("//div[@qxclass='skel.widgets.Window.DisplayWindowGenericPlugin']") - self.assertIsNotNone( emptyWindow, "Could not find empty display window") + # This test does not work on Firefox, only Chrome + if browser == 2: + # Find and click on the image window + imageWindow = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) + self.assertIsNotNone( imageWindow, "Could not find image display window") + ActionChains(driver).click( imageWindow ).perform() + + # Click the Window button + windowButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='qx.ui.toolbar.MenuButton']/div[text()='Window']/.."))) + self.assertIsNotNone( windowButton, "Could not find window button in the context menu") + ActionChains(driver).click(windowButton).perform() + + # Look for the add button in the submenu. + addButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div/div[text()='Add']/.."))) + self.assertIsNotNone( addButton, "Could not click minimize button on window subcontext menu.") + ActionChains(driver).click( addButton ).send_keys(Keys.ARROW_RIGHT).send_keys(Keys.ENTER).perform() + + # Check that we now have a generic empty window in the display and that the window count has gone up by one. + emptyWindow = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowGenericPlugin']"))) + self.assertIsNotNone( emptyWindow, "Could not find empty display window") + + # Select the empty window + ActionChains(driver).click( emptyWindow ).perform() + + # Change the plugin of the empty window to an image loader + ActionChains(driver).context_click( emptyWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_RIGHT).send_keys(Keys.ENTER).perform() - # Select the empty window - ActionChains(driver).click( emptyWindow ).perform() - - # Change the plugin of the empty window to an image loader - ActionChains(driver).context_click( emptyWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_RIGHT).send_keys(Keys.ENTER).perform() - time.sleep(2) + # Find and click on the Statistics window + statsWindow = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@id='Statistics']"))) + self.assertIsNotNone( statsWindow, "Could not find statistics window") + ActionChains(driver).click( statsWindow ).perform() - # Find and click on the Statistics window - statsWindow = driver.find_element_by_xpath("//div[@id='Statistics']") - self.assertIsNotNone( statsWindow, "Could not find statistics window") - ActionChains(driver).click( statsWindow ).perform() - time.sleep(2) + # In Stastics context menu, open Link Settings + ActionChains(driver).context_click( statsWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() + + # Remove the link from the Statistics Window to the main image window + imageWindow = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) + ActionChains(driver).move_to_element( imageWindow ).context_click( imageWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - # In Stastics context menu, open Link Settings - ActionChains(driver).context_click( statsWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - time.sleep(2) - - # Remove the link from the Statistics Window to the image window - imageWindow = driver.find_element_by_xpath("//div[@qxclass='skel.widgets.Window.DisplayWindowImage']") - ActionChains(driver).move_to_element( imageWindow ).context_click( imageWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - time.sleep(2) + # Change the link to the new image window + imageWindow2 = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@id='CasaImageLoader2']"))) + ActionChains(driver).move_to_element( statsWindow ).click( statsWindow ).drag_and_drop( statsWindow, imageWindow2).perform() - # Change the link to the new image window - imageWindow2 = driver.find_element_by_xpath("//div[@id='CasaImageLoader2']") - ActionChains(driver).move_to_element( statsWindow ).click( statsWindow ).drag_and_drop( statsWindow, imageWindow2).perform() + # Exit links + ActionChains(driver).move_to_element( statsWindow ).context_click( statsWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - # Exit links - ActionChains(driver).move_to_element( statsWindow ).context_click( statsWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() + # Load an image in the main image window + Util.load_image( self, driver, "aH.fits") - # Load an image in the main image window - Util.load_image( self, driver, "aH.fits") + # Move to the center of the image window so data appears in the Stats Window + ActionChains(driver).move_to_element( imageWindow ).perform() - # Move to the center of the image window so data appears in the Stats Window - ActionChains(driver).move_to_element( imageWindow ).perform() - time.sleep(2) + # Sometimes text does not appear, therefore move mouse cursor + ActionChains(driver).move_by_offset( 100, 100 ).perform() - # Check that the Stastics window is not linked to the main image window - statsText = len(driver.find_elements_by_xpath("//div[@qxclass='skel.boundWidgets.Label']")) - self.assertEqual( int(statsText), 0, "Statistics window is linked to main image window after link was removed") + # Check that the Stastics Window is not linked to the image window + statsText = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.boundWidgets.Label']"))) + statsText = statsText.get_attribute('textContent') + + # Check that the Default sky text appears in the Stats Window + statsText = statsText.startswith("Default sky") + self.assertEqual( statsText, 0, "Stats window is still linked to the main image window after the link was removed") # Check that the Stats Window returns to default values when the linked # image is removed from the image window def test_statsRemoveImage(self): driver = self.driver - time.sleep(5) # Load a large test image. Util.load_image( self, driver, "aH.fits") # Click on the Data->Close->Image button to close the image. - imageWindow = driver.find_element_by_id( "CasaImageLoader") + imageWindow = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) ActionChains(driver).context_click( imageWindow ).send_keys(Keys.ARROW_DOWN).send_keys( Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys( Keys.ARROW_DOWN).send_keys(Keys.ARROW_RIGHT).send_keys(Keys.ARROW_DOWN).send_keys( Keys.ARROW_RIGHT).send_keys(Keys.ENTER).perform() - time.sleep(2) # Move to the center of the image window so data appears in the Stats Window ActionChains(driver).move_to_element( imageWindow ).perform() - time.sleep(2) + + # Sometimes text does not appear, therefore move mouse cursor + ActionChains(driver).move_by_offset( 100, 100 ).perform() # Check that no data appears in the Stastics window statsText = len(driver.find_elements_by_xpath("//div[@qxclass='skel.boundWidgets.Label']")) @@ -174,18 +182,16 @@ def test_statsRemoveImage(self): # Test that the Stats Window updates when an image is added to the main window def test_statsAddImage(self): driver = self.driver - time.sleep(5) # Load a large test image. Util.load_image( self, driver, "aH.fits") # Move to the center of the image window so data appears in the Stats Window - imageWindow = driver.find_element_by_id( "CasaImageLoader") + imageWindow = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) ActionChains(driver).move_to_element( imageWindow ).perform() - time.sleep(2) # Get the Statistics of the loaded image - statsText = driver.find_element_by_xpath("//div[@qxclass='skel.boundWidgets.Label']") + statsText = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.boundWidgets.Label']"))) statsText = statsText.get_attribute('textContent') # Load a different image in the same window @@ -193,10 +199,12 @@ def test_statsAddImage(self): # Move to the center of the image window so data appears in the Stats Window ActionChains(driver).move_to_element( imageWindow ).perform() - time.sleep(2) + + # Sometimes text does not appear, therefore move mouse cursor + ActionChains(driver).move_by_offset( 100, 100 ).perform() # Get the Statistics of the loaded image - newStatsText = driver.find_element_by_xpath("//div[@qxclass='skel.boundWidgets.Label']") + newStatsText = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.boundWidgets.Label']"))) newStatsText = newStatsText.get_attribute('textContent') # Check that the Statistics text changed when new image was loaded @@ -205,19 +213,20 @@ def test_statsAddImage(self): # Test that the Stats Window updates when the image in the image window is changed def test_statsChangeImage(self): driver = self.driver - time.sleep(5) # Load two images in the same window Util.load_image( self, driver, "Default") Util.load_image( self, driver, "aH.fits") # Move to the center of the image window so data appears in the Stats Window - imageWindow = driver.find_element_by_id( "CasaImageLoader") + imageWindow = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) ActionChains(driver).move_to_element( imageWindow ).perform() - time.sleep(2) + + # Sometimes text does not appear, therefore move mouse cursor + ActionChains(driver).move_by_offset( 100, 100 ).perform() # Get the Statistics of the loaded image - statsText = driver.find_element_by_xpath("//div[@qxclass='skel.boundWidgets.Label']") + statsText = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.boundWidgets.Label']"))) statsText = statsText.get_attribute('textContent') # Find and click on the animation window @@ -232,22 +241,22 @@ def test_statsChangeImage(self): ActionChains(driver).context_click( channelText ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys( Keys.ARROW_DOWN ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_RIGHT).send_keys(Keys.SPACE).send_keys( Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - time.sleep(2) # Find the first value button and click the button firstValueButton = driver.find_element_by_xpath( "//div[@class='qx-toolbar']/div[@qxclass='qx.ui.toolbar.Button'][1]") self.assertIsNotNone( firstValueButton, "Could not find button to go to the first valid value") driver.execute_script( "arguments[0].scrollIntoView(true);", firstValueButton) ActionChains(driver).click( firstValueButton ).perform() - time.sleep(2) # Move to the center of the image window so data appears in the Stats Window - imageWindow = driver.find_element_by_id( "CasaImageLoader") + imageWindow = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) ActionChains(driver).move_to_element( imageWindow ).perform() - time.sleep(2) + + # Sometimes text does not appear, therefore move mouse cursor + ActionChains(driver).move_by_offset( 100, 100 ).perform() # Get the Statistics of the loaded image - newStatsText = driver.find_element_by_xpath("//div[@qxclass='skel.boundWidgets.Label']") + newStatsText = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.boundWidgets.Label']"))) newStatsText = newStatsText.get_attribute('textContent') # Check that the Statistics text changed when image in the image window was changed @@ -256,18 +265,16 @@ def test_statsChangeImage(self): # Test that the Stats Window updates its values during the animation of an image def test_statsAnimation(self): driver = self.driver - time.sleep(5) # Load a test image with animation Util.load_image( self, driver, "Default") # Move to the center of the image window so data appears in the Stats Window - imageWindow = driver.find_element_by_id( "CasaImageLoader") + imageWindow = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) ActionChains(driver).move_to_element( imageWindow ).perform() - time.sleep(2) # Get the Statistics of the loaded image - statsText = driver.find_element_by_xpath("//div[@qxclass='skel.boundWidgets.Label']") + statsText = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.boundWidgets.Label']"))) statsText = statsText.get_attribute('textContent') # Click the forward animation button @@ -278,12 +285,14 @@ def test_statsAnimation(self): time.sleep(3) # Move to the center of the image window so data appears in the Stats Window - imageWindow = driver.find_element_by_id( "CasaImageLoader") + imageWindow = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) ActionChains(driver).move_to_element( imageWindow ).perform() - time.sleep(2) + + # Sometimes text does not appear, therefore move mouse cursor + ActionChains(driver).move_by_offset( 100, 100 ).perform() # Get the Statistics of the loaded image - newStatsText = driver.find_element_by_xpath("//div[@qxclass='skel.boundWidgets.Label']") + newStatsText = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.boundWidgets.Label']"))) newStatsText = newStatsText.get_attribute('textContent') # Check that the Statistics text changed when image in the image window was changed @@ -301,14 +310,12 @@ def test_statsAddLink(self): statsWindow = driver.find_element_by_xpath("//div[@id='Statistics']") self.assertIsNotNone( statsWindow, "Could not find statistics window") ActionChains(driver).click( statsWindow ).perform() - time.sleep(2) # In Stastics context menu, open Link Settings ActionChains(driver).context_click( statsWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - time.sleep(2) # Add a link to the new image window - imageWindow2 = driver.find_element_by_xpath("//div[@id='CasaImageLoader2']") + imageWindow2 = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@id='CasaImageLoader2']"))) ActionChains(driver).move_to_element( statsWindow ).click( statsWindow ).drag_and_drop( statsWindow, imageWindow2).perform() # Exit links @@ -316,47 +323,59 @@ def test_statsAddLink(self): # Move to the center of the image window so data appears in the Stats Window ActionChains(driver).move_to_element( imageWindow2 ).perform() - time.sleep(2) + + # Sometimes text does not appear, therefore move mouse cursor + ActionChains(driver).move_by_offset( 100, 100 ).perform() # Check that the Stastics window is not linked to the main image window - statsText = len(driver.find_elements_by_xpath("//div[@qxclass='skel.boundWidgets.Label']")) - self.assertEqual( int(statsText), 0, "Statistics window should not be linked to multiple windows") + statsText = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.boundWidgets.Label']"))) + statsText = statsText.get_attribute('textContent') + + # Check that the Default sky text appears in the Stats Window + statsText = statsText.startswith("Default sky") + self.assertEqual( statsText, 0, "Statistics window should not be linked to multiple windows") # Check that a link to the Statistics window can be removed def test_statsRemoveLink(self): driver = self.driver - time.sleep(5) + browser = selectBrowser._getBrowser() - # Find and click on the Statistics window - statsWindow = driver.find_element_by_xpath("//div[@id='Statistics']") - self.assertIsNotNone( statsWindow, "Could not find statistics window") - ActionChains(driver).click( statsWindow ).perform() - time.sleep(2) + # This test only works on Chrome + if browser == 2: + # Find and click on the Statistics window + statsWindow = driver.find_element_by_xpath("//div[@id='Statistics']") + self.assertIsNotNone( statsWindow, "Could not find statistics window") + ActionChains(driver).click( statsWindow ).perform() - # In Stastics context menu, open Link Settings - ActionChains(driver).context_click( statsWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - time.sleep(2) - - # Remove the link from the Statistics Window to the image window - imageWindow = driver.find_element_by_xpath("//div[@qxclass='skel.widgets.Window.DisplayWindowImage']") - ActionChains(driver).move_to_element( imageWindow ).context_click( imageWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - time.sleep(2) + # In Stastics context menu, open Link Settings + ActionChains(driver).context_click( statsWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() + + # Remove the link from the Statistics Window to the image window + imageWindow = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) + ActionChains(driver).move_to_element( imageWindow ).context_click( imageWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - # Exit links - ActionChains(driver).move_to_element( imageWindow ).context_click( imageWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() + # Exit links + ActionChains(driver).move_to_element( imageWindow ).context_click( imageWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() + + # Load a large test image. + Util.load_image( self, driver, "aH.fits") + + # Move to the center of the image window so data appears in the Stats Window + imageWindow = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) + ActionChains(driver).move_to_element( imageWindow ).perform() + + # Sometimes text does not appear, therefore move mouse cursor + ActionChains(driver).move_by_offset( 100, 100 ).perform() + + # Check that the Stastics Window is not linked to the image window + statsText = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.boundWidgets.Label']"))) + statsText = statsText.get_attribute('textContent') + + # Check that the Default sky text appears in the Stats Window + statsText = statsText.startswith("Default sky") + self.assertEqual( statsText, 0, "Stats window is still linked to the main image window after the link was removed") - # Load a large test image. - Util.load_image( self, driver, "aH.fits") - - # Move to the center of the image window so data appears in the Stats Window - imageWindow = driver.find_element_by_id( "CasaImageLoader") - ActionChains(driver).move_to_element( imageWindow ).perform() - time.sleep(2) - # Check that the Stastics Window is not linked to the image window - statsText = len(driver.find_elements_by_xpath("//div[@qxclass='skel.boundWidgets.Label']")) - self.assertEqual( int(statsText), 0, "Stats Window is still linked to main image window after link was removed") - def tearDown(self): # Close the browser self.driver.close() diff --git a/Skeleton3/html5/common/skel/source/class/skel/simulation/tView.py b/Skeleton3/html5/common/skel/source/class/skel/simulation/tView.py index 8ca80b31..626c04e2 100644 --- a/Skeleton3/html5/common/skel/source/class/skel/simulation/tView.py +++ b/Skeleton3/html5/common/skel/source/class/skel/simulation/tView.py @@ -3,8 +3,11 @@ import time import selectBrowser from selenium import webdriver +from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.action_chains import ActionChains +from selenium.webdriver.support import expected_conditions as EC +from selenium.webdriver.support.ui import WebDriverWait #Test that we can view different plugins. class tView(unittest.TestCase): @@ -15,10 +18,10 @@ def setUp(self): # Test that we can change an animator to a CasaImageLoader def test_animator_to_casaimageloader(self): driver = self.driver - time.sleep(5) + timeout = selectBrowser._getSleep() - # Getting element not found in cache without this. - # driver.implicitly_wait(10) + # Wait for the image window to be present (ensures browser is fully loaded) + imageWindow = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) # Get the animation window count and make sure it is non-zero animWindowList = driver.find_elements_by_xpath("//div[@qxclass='skel.widgets.Window.DisplayWindowAnimation']") @@ -32,6 +35,7 @@ def test_animator_to_casaimageloader(self): # Locate an animator window and bring up the right-context menu, # changing to a CasaImageLoader. Util.animation_to_image_window( self, driver ) + time.sleep( timeout ) # Verify that the animation count has gone down by one and the image count # has increased by one. diff --git a/Skeleton3/html5/common/skel/source/class/skel/simulation/tWindow.py b/Skeleton3/html5/common/skel/source/class/skel/simulation/tWindow.py index b5dc586b..07bc5804 100644 --- a/Skeleton3/html5/common/skel/source/class/skel/simulation/tWindow.py +++ b/Skeleton3/html5/common/skel/source/class/skel/simulation/tWindow.py @@ -5,6 +5,10 @@ from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.action_chains import ActionChains +from selenium.webdriver.support import expected_conditions as EC +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.common.by import By + # Test window manipulation. class tWindow(unittest.TestCase): @@ -14,82 +18,84 @@ def setUp(self): Util.setUp(self, browser) def _clickLayoutButton(self, driver): - # Getting element not found in cache without this - time.sleep(4) + timeout = selectBrowser._getSleep() + # time.sleep clause in required for Chrome, otherwise the element will be stale + time.sleep( timeout ) # Find the layout button on the menu bar and click it. - layoutButton = driver.find_element_by_xpath("//div[text()='Layout']/..") + layoutButton = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[text()='Layout']/.."))) self.assertIsNotNone( layoutButton, "Could not find layout button on the menu bar") ActionChains(driver).click( layoutButton ).perform() - - # Test that a window can be minimized and then restored to its original position def test_minimize_restore(self): driver = self.driver - time.sleep(5) + timeout = selectBrowser._getSleep() - # Find a window capable of loading an image. - imageWindow = driver.find_element_by_xpath("//div[@qxclass='skel.widgets.Window.DisplayWindowImage']") + # Find a window capable of loading an image and select the window + imageWindow = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) self.assertIsNotNone( imageWindow, "Could not find image display window") - - # Select the window - ActionChains(driver).click(imageWindow).perform() + ActionChains(driver).click( imageWindow ).perform() + time.sleep( timeout ) # Click the Window button - windowButton = driver.find_element_by_xpath("//div[text()='Window']/..") + windowButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[text()='Window']/.."))) self.assertIsNotNone( windowButton, "Could not click window button in the context menu") - ActionChains(driver).click(windowButton).perform() + ActionChains(driver).click( windowButton ).perform() # Look for the minimize button in the submenu. - minimizeButton = driver.find_element_by_xpath("//div/div[text()='Minimize']/..") + minimizeButton = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//div/div[text()='Minimize']/.."))) self.assertIsNotNone(minimizeButton, "Could not click minimize button on window subcontext menu.") - ActionChains(driver).click(minimizeButton).perform() + ActionChains(driver).click( minimizeButton ).perform() # Verify that there is a Restore button on the status bar and no DisplayWindowImage. - restoreButton = driver.find_element_by_xpath( "//div[@qxclass='qx.ui.toolbar.MenuButton']/div[contains(text(), 'Restore: CasaImageLoader')]/..") + restoreButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='qx.ui.toolbar.MenuButton']/div[contains(text(), 'Restore: CasaImageLoader')]/.."))) self.assertIsNotNone( restoreButton, "Could not find a restore button on the status bar.") # Restore the window. Verify the restore button is gone from the status bar and there is a DisplayWindowImage - ActionChains(driver).click( restoreButton).perform() + ActionChains(driver).click( restoreButton ).perform() + #Check that the clipping menu item is no longer available try: - restoreLabel = driver.find_element_by_xpath( "//div[@qxclass='qx.ui.toolbar.MenuButton']/div[contains(text(), 'Restore: CasaImageLoader')]") + restoreLabel = WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='qx.ui.toolbar.MenuButton']/div[contains(text(), 'Restore: CasaImageLoader')]"))) self.assertTrue( False, "Should not be able to locate the restore image loader button") except Exception: print "Test restore button was successfully removed" - imageWindow = driver.find_element_by_xpath("//div[@qxclass='skel.widgets.Window.DisplayWindowImage']") + imageWindow = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) self.assertIsNotNone( imageWindow, "Image window was not restored.") def test_maximize_remove(self): driver = self.driver - time.sleep(5) + timeout = selectBrowser._getSleep() + + # Wait for the image window to be present (ensures browser is fully loaded) + imageWindow = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) # Find and select the colormap window. - colorWindow = driver.find_element_by_xpath("//div[@qxclass='skel.widgets.Window.DisplayWindowColormap']") + colorWindow = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowColormap']"))) self.assertIsNotNone( colorWindow, "Could not find color map window") ActionChains(driver).click(colorWindow).perform(); #For later use, determine the number of DisplayWindows. - windowCount = Util.get_window_count(self,driver ) + windowCount = Util.get_window_count( self,driver ) print "Window Count=", windowCount # Click the Window button - windowButton = driver.find_element_by_xpath("//div[@qxclass='qx.ui.toolbar.MenuButton']/div[text()='Window']/..") + windowButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='qx.ui.toolbar.MenuButton']/div[text()='Window']/.."))) self.assertIsNotNone( windowButton, "Could not find window button in the context menu") - ActionChains(driver).click(windowButton).perform() + ActionChains(driver).click( windowButton ).perform() # Look for the maximize button in the submenu. - maximizeButton = driver.find_element_by_xpath("//div[text()='Maximize']/..") + maximizeButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[text()='Maximize']/.."))) self.assertIsNotNone(maximizeButton, "Could not find maximize button on window subcontext menu.") ActionChains(driver).click(maximizeButton).perform() # Verify that there is single colormap window. - colorWindow = driver.find_element_by_xpath("//div[@qxclass='skel.widgets.Window.DisplayWindowColormap']") + colorWindow = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowColormap']"))) self.assertIsNotNone( colorWindow, "Could not find color map window") # Now right click the context menu to remove the colormap window ActionChains(driver).context_click(colorWindow).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_RIGHT).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - time.sleep(1) + time.sleep( timeout ) # Verify that there is one less window than was there originally and the colormap window is not in the list. newWindowCount = Util.get_window_count( self, driver ) @@ -103,10 +109,13 @@ def test_maximize_remove(self): def test_maximize_restore(self): driver = self.driver - time.sleep(5) + timeout = selectBrowser._getSleep() + # Wait for the image window to be present (ensures browser is fully loaded) + imageWindow = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) + # Find and select the colormap window. - colorWindow = driver.find_element_by_xpath("//div[@qxclass='skel.widgets.Window.DisplayWindowColormap']") + colorWindow = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowColormap']"))) self.assertIsNotNone( colorWindow, "Could not find color map window") ActionChains(driver).click(colorWindow).perform(); @@ -115,38 +124,42 @@ def test_maximize_restore(self): print "Window Count=", windowCount # Click the Window button - windowButton = driver.find_element_by_xpath("//div[@qxclass='qx.ui.toolbar.MenuButton']/div[text()='Window']/..") + windowButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='qx.ui.toolbar.MenuButton']/div[text()='Window']/.."))) self.assertIsNotNone( windowButton, "Could not find window button in the context menu") ActionChains(driver).click(windowButton).perform() # Look for the maximize button in the submenu. - maximizeButton = driver.find_element_by_xpath("//div[text()='Maximize']/..") + maximizeButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[text()='Maximize']/.."))) self.assertIsNotNone(maximizeButton, "Could not find maximize button on window subcontext menu.") ActionChains(driver).click(maximizeButton).perform() # Verify that there is single colormap window. - colorWindow = driver.find_element_by_xpath("//div[@qxclass='skel.widgets.Window.DisplayWindowColormap']") + colorWindow = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowColormap']"))) self.assertIsNotNone( colorWindow, "Could not find color map window") # Now right click the context menu to restore the colormap window ActionChains(driver).context_click(colorWindow).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_RIGHT).send_keys(Keys.ENTER).perform() + time.sleep( timeout ) # Verify that there are exactly the same number of windows as was there originally and the colormap window is present. newWindowCount = Util.get_window_count( self, driver ) print "New Window Count=", newWindowCount self.assertEqual( windowCount, newWindowCount, "Window count has changed") - colorWindow = driver.find_element_by_xpath("//div[@qxclass='skel.widgets.Window.DisplayWindowColormap']") + WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowColormap']"))) self.assertIsNotNone( colorWindow, "Colormap window was not restored") # Test that we can add a window and change it into a statistics view. def test_add_window(self): driver = self.driver - time.sleep(5) + timeout = selectBrowser._getSleep() + + # Wait for the image window to be present (ensures browser is fully loaded) + imageWindow = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) # For later use, determine the number of DisplayWindows. windowCount = Util.get_window_count( self, driver ) print "Window Count=", windowCount - + #For later use, we also determine the number of DisplayWindows displaying a histogram plugin histWindowList = driver.find_elements_by_xpath( "//div[@qxclass='skel.widgets.Window.DisplayWindowHistogram']") histCount = len( histWindowList ) @@ -160,20 +173,18 @@ def test_add_window(self): ActionChains(driver).click(imageWindow).perform() # Click the Window button - windowButton = driver.find_element_by_xpath("//div[text()='Window']/..") - self.assertIsNotNone( windowButton, "Could not click window button in the context menu") + windowButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='qx.ui.toolbar.MenuButton']/div[text()='Window']/.."))) + self.assertIsNotNone( windowButton, "Could not find window button in the context menu") ActionChains(driver).click(windowButton).perform() - + # Look for the add button in the submenu. - addButton = driver.find_element_by_xpath("//div/div[text()='Add']/..") - self.assertIsNotNone(addButton, "Could not click minimize button on window subcontext menu.") - ActionChains(driver).click(addButton).perform() - - # Choose to add at the bottom - ActionChains( driver).send_keys( Keys.ARROW_RIGHT ).send_keys( Keys.ENTER ).perform() - + addButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div/div[text()='Add']/.."))) + self.assertIsNotNone( addButton, "Could not click minimize button on window subcontext menu.") + ActionChains(driver).click( addButton ).send_keys(Keys.ARROW_RIGHT).send_keys(Keys.ENTER).perform() + time.sleep( timeout ) + # Check that we now have a generic empty window in the display and that the window count has gone up by one. - emptyWindow = driver.find_element_by_xpath("//div[@qxclass='skel.widgets.Window.DisplayWindowGenericPlugin']") + emptyWindow = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowGenericPlugin']"))) self.assertIsNotNone( emptyWindow, "Could not find empty display window") newWindowCount = Util.get_window_count( self, driver ) print "New Window Count=", newWindowCount @@ -182,12 +193,12 @@ def test_add_window(self): # Select the empty window ActionChains(driver).click( emptyWindow ).perform() - # Change the plugin of the empty window to histogram by clicking the view menu and the statistics + # Change the plugin of the empty window to statistics by clicking the view menu and the statistics # plugin in the submenu. ActionChains(driver).context_click(emptyWindow).send_keys(Keys.ARROW_DOWN).send_keys( Keys.ARROW_RIGHT).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN ).send_keys(Keys.ENTER).perform() - time.sleep(2) + time.sleep( timeout ) #Verify that we have increased the number of histogram windows by one. newHistWindowList = driver.find_elements_by_xpath( "//div[@qxclass='skel.widgets.Window.DisplayWindowHistogram']") @@ -198,10 +209,13 @@ def test_add_window(self): # Test that an existing window can be removed. def test_remove(self): driver = self.driver - time.sleep(5) + timeout = selectBrowser._getSleep() + # Wait for the image window to be present (ensures browser is fully loaded) + imageWindow = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']"))) + # Find and select the colormap window. - colorWindow = driver.find_element_by_xpath("//div[@qxclass='skel.widgets.Window.DisplayWindowColormap']") + colorWindow = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='skel.widgets.Window.DisplayWindowColormap']"))) self.assertIsNotNone( colorWindow, "Could not find color map window") ActionChains(driver).click( colorWindow ).perform(); @@ -210,15 +224,15 @@ def test_remove(self): print "Window Count=", windowCount # Click the Window button - windowButton = driver.find_element_by_xpath("//div[@qxclass='qx.ui.toolbar.MenuButton']/div[text()='Window']/..") + windowButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@qxclass='qx.ui.toolbar.MenuButton']/div[text()='Window']/.."))) self.assertIsNotNone( windowButton, "Could not find window button in the context menu") - ActionChains(driver).click( windowButton ).perform() + ActionChains(driver).click(windowButton).perform() # Look for the remove button in the submenu. - removeButton = driver.find_element_by_xpath("//div[text()='Remove']/..") + removeButton = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[text()='Remove']/.."))) self.assertIsNotNone( removeButton, "Could not find remove button on window subcontext menu.") ActionChains(driver).click( removeButton ).perform() - time.sleep(2) + time.sleep( timeout ) # Verify that there is one less window than was there originally and the colormap window is not in the list. newWindowCount = Util.get_window_count( self, driver ) @@ -230,133 +244,6 @@ def test_remove(self): except Exception: print "Colormap window was successfully removed" - # Test that we can remove one window at a time in a three by three layout - def test_three_by_three_remove(self): - driver = self.driver - time.sleep(5) - - # Set a custom layout of 3 columns and 3 rows - Util.layout_custom(self, driver, 3, 3 ) - - # Find the image window and close the window - imageWindow = driver.find_element_by_xpath("//div[@qxclass='skel.widgets.Window.DisplayWindowImage']") - self.assertIsNotNone( imageWindow, "Could not find image display window") - ActionChains(driver).click( imageWindow ).perform() - ActionChains(driver).context_click( imageWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys( - Keys.ARROW_DOWN).send_keys(Keys.ARROW_RIGHT).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - time.sleep(2) - - # Check that there are 8 windows - windowCount = Util.get_window_count( self, driver ) - print "Testing 3 by 3 layout, remove a window" - print "oldWindowCount=9 newWindowCount=",windowCount - self.assertEqual( windowCount, 8, "Layout does not have the correct number of Windows") - - # Test that we can remove one window at a time in a two column layout - def test_two_column_removing(self): - driver = self.driver - time.sleep(5) - - # Set a custom layout of 6 rows and 2 columns - Util.layout_custom(self, driver, 6, 2 ) - - # Find the image window and close the window - imageWindow = driver.find_element_by_xpath("//div[@qxclass='skel.widgets.Window.DisplayWindowImage']") - self.assertIsNotNone( imageWindow, "Could not find image display window") - ActionChains(driver).click( imageWindow ).perform() - ActionChains(driver).context_click( imageWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys( - Keys.ARROW_DOWN).send_keys(Keys.ARROW_RIGHT).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - time.sleep(2) - - # Check that there are 11 windows - windowCount = Util.get_window_count( self, driver ) - print "Testing 2 by 2 layout, remove a window" - print "oldWindowCount=12 newWindowCount=",windowCount - self.assertEqual( windowCount, 11, "Layout does not have the correct number of Windows") - - # Test that we can add one window at a time in a two column layout - def test_two_column_adding(self): - driver = self.driver - time.sleep(5) - - # Set a custom layout of 2 columns and 2 rows - Util.layout_custom(self, driver, 2, 2 ) - - # Find and click on the image window - imageWindow = driver.find_element_by_xpath( "//div[@qxclass='skel.widgets.Window.DisplayWindowImage']") - self.assertIsNotNone( imageWindow, "Could not find image display window") - ActionChains(driver).click( imageWindow ).perform() - - # Click the Window button - windowButton = driver.find_element_by_xpath( "//div[text()='Window']/..") - self.assertIsNotNone( windowButton, "Could not click window button in the context menu") - ActionChains(driver).click(windowButton).perform() - - # Look for the add button in the submenu. - addButton = driver.find_element_by_xpath( "//div/div[text()='Add']/..") - self.assertIsNotNone( addButton, "Could not click minimize button on window subcontext menu.") - ActionChains(driver).click( addButton ).perform() - time.sleep(2) - - # Choose to add at the bottom - ActionChains( driver).send_keys( Keys.ARROW_RIGHT ).send_keys( Keys.ENTER ).perform() - - # Check that there are 5 windows - windowCount = Util.get_window_count( self, driver ) - print "Testing 2 by 2 layout, add a window" - print "oldWindowCount=4 newWindowCount=",windowCount - self.assertEqual( windowCount, 5, "Layout does not have the correct number of Windows") - - # Test that we can remove a column in a five by five layout - def test_five_by_five_remove_column(self): - driver = self.driver - time.sleep(5) - - # Set a custom layout of 5 columns and 5 rows - Util.layout_custom(self, driver, 5, 5 ) - - # Remove the rightmost column from the layout - imageWindow = driver.find_element_by_id( "Empty2") - self.assertIsNotNone( imageWindow, "Could not find image window") - ActionChains(driver).click( imageWindow ).perform() - ActionChains(driver).context_click( imageWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys( - Keys.ARROW_DOWN).send_keys(Keys.ARROW_RIGHT).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - time.sleep(2) - - imageWindow = driver.find_element_by_id( "Empty5") - self.assertIsNotNone( imageWindow, "Could not find image window") - ActionChains(driver).click( imageWindow ).perform() - ActionChains(driver).context_click( imageWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys( - Keys.ARROW_DOWN).send_keys(Keys.ARROW_RIGHT).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - time.sleep(2) - - imageWindow = driver.find_element_by_id( "Empty10") - self.assertIsNotNone( imageWindow, "Could not find image window") - ActionChains(driver).click( imageWindow ).perform() - ActionChains(driver).context_click( imageWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys( - Keys.ARROW_DOWN).send_keys(Keys.ARROW_RIGHT).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - time.sleep(2) - - imageWindow = driver.find_element_by_id( "Empty15") - self.assertIsNotNone( imageWindow, "Could not find image window") - ActionChains(driver).click( imageWindow ).perform() - ActionChains(driver).context_click( imageWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys( - Keys.ARROW_DOWN).send_keys(Keys.ARROW_RIGHT).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - time.sleep(2) - - imageWindow = driver.find_element_by_id( "Empty20") - self.assertIsNotNone( imageWindow, "Could not find image window") - ActionChains(driver).click( imageWindow ).perform() - ActionChains(driver).context_click( imageWindow ).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys( - Keys.ARROW_DOWN).send_keys(Keys.ARROW_RIGHT).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() - time.sleep(2) - - # Check that there are 20 windows - windowCount = Util.get_window_count( self, driver ) - print "Testing 5 by 5 layout, remove a column" - print "oldWindowCount=25 newWindowCount=",windowCount - self.assertEqual( windowCount, 20, "Layout does not have the correct number of Windows") - def tearDown(self): # Close the browser self.driver.close()