Created
January 23, 2012 23:47
-
-
Save miohtama/1666559 to your computer and use it in GitHub Desktop.
Testing Three.js 3d rendered with Selenium + Python
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| """ | |
| See that rendering Javascript loads jobs properly. | |
| Skeleton based on https://github.com/Pylons/deformdemo/blob/master/deformdemo/test.py | |
| Running:: | |
| ./run-selenium.sh | |
| If you get:: | |
| Traceback (most recent call last): | |
| File "alphadog/tests/test_selenium_render.py", line 63, in <module> | |
| setUpModule() | |
| File "alphadog/tests/test_selenium_render.py", line 44, in setUpModule | |
| browser = webdriver.Firefox(firefox_profile=profile) | |
| File "/Users/moo/code/mixnap-base/venv/lib/python2.7/site-packages/selenium-2.7.0-py2.7.egg/selenium/webdriver/firefox/webdriver.py", line 46, in __init__ | |
| self.binary, timeout), | |
| File "/Users/moo/code/mixnap-base/venv/lib/python2.7/site-packages/selenium-2.7.0-py2.7.egg/selenium/webdriver/firefox/extension_connection.py", line 46, in __init__ | |
| self.binary.launch_browser(self.profile) | |
| File "/Users/moo/code/mixnap-base/venv/lib/python2.7/site-packages/selenium-2.7.0-py2.7.egg/selenium/webdriver/firefox/firefox_binary.py", line 44, in launch_browser | |
| self._wait_until_connectable() | |
| File "/Users/moo/code/mixnap-base/venv/lib/python2.7/site-packages/selenium-2.7.0-py2.7.egg/selenium/webdriver/firefox/firefox_binary.py", line 87, in _wait_until_connectable | |
| raise WebDriverException("Can't load the profile. Profile Dir : %s" % self.profile.path) | |
| selenium.common.exceptions.WebDriverException: Message: "Can't load the profile. Profile Dir : /var/folders/O8/O8pt7q52F7Oi+P3O0pNqq++++TI/-Tmp-/tmp74FwCp" | |
| Selenium update most likely needed. | |
| """ | |
| # -*- coding: utf-8 -*- | |
| import time | |
| import unittest | |
| from selenium import webdriver | |
| from selenium.common.exceptions import NoSuchElementException | |
| from selenium.webdriver.common.keys import Keys | |
| from selenium.webdriver.support.ui import WebDriverWait | |
| HOST_BASE="http://localhost:8521" | |
| # Webdriver instance | |
| browser = None | |
| def setUpModule(): | |
| global browser | |
| profile = webdriver.firefox.firefox_profile.FirefoxProfile() | |
| # Fiddle with FF preferences | |
| set_pref = profile.set_preference | |
| set_pref("signed.applets.codebase_principal_support", True) | |
| set_pref("capability.principal.codebase.p0.granted", "UniversalXPConnect"); | |
| set_pref("capability.principal.codebase.p0.id", HOST_BASE); | |
| set_pref("capability.principal.codebase.p0.subjectName", ""); | |
| set_pref("webgl.prefer-native-gl", True); | |
| set_pref("webgl.force-enabled", True); | |
| set_pref("dom.max_script_run_time", 60); | |
| # https://developer.mozilla.org/En/Same-origin_policy_for_file%3A_URIs | |
| # http://www.generalinterface.org/docs/display/DEVBLOG/2010/04/15/Stopping+the+repetitious+security+prompt+on+Firefox+GI+Builder | |
| set_pref("security.fileuri.strict_origin_policy", False); | |
| # Set anti-aliasing | |
| set_pref("webgl.msaa-force", True); | |
| set_pref("webgl.msaa-level", 4); | |
| browser = webdriver.Firefox(firefox_profile=profile) | |
| def tearDownModule(): | |
| browser.close() | |
| def _getFile(name): | |
| import os | |
| path = os.path.join(os.path.abspath(os.path.dirname(__file__)), name) | |
| filename = os.path.split(path)[-1] | |
| return path, filename | |
| class TestRenderShow(unittest.TestCase): | |
| page = "/test_render_show_with_two_images/" | |
| def test_render_default(self): | |
| # Available Selenium API calls: | |
| # http://code.google.com/p/selenium/source/browse/trunk/py/selenium/webdriver/remote/webdriver.py | |
| # Open the page | |
| browser.get(HOST_BASE + self.page) | |
| loaded = False | |
| timeout = time.time() + 30.0 | |
| # If the page has Javascript errors you have here 30 seconds time to open FF console | |
| # thru FF UI to inspect the problem Tools > Web Developer > Web console | |
| # XXX: Can it be opened thru selenium / reading log thru selenium? | |
| while not loaded and time.time() < timeout: | |
| # <div id=load-status /> is set on the page by document.ready() javascript when all async resources | |
| # have been loaded | |
| # find_elem* returns http://code.google.com/p/selenium/source/browse/trunk/py/selenium/webdriver/remote/webelement.py | |
| elem = browser.find_elements_by_id("load-status") | |
| if len(elem) > 0: | |
| loaded = (elem[0].text == "loaded") | |
| time.sleep(1) | |
| # To debug Javasscript error case | |
| # 1) Manually launch paster: paster serve selenium.ini | |
| # 2) Go to with Firefox http://127.0.0.1:8521/test_render_show_with_two_images/ and open Firebug | |
| self.assertTrue(loaded, "Could not initialize async Javascripts on render page") | |
| # Slice few frames on the show. | |
| # Frame 1 is rendered on launch, frame 2,3... are rendered when a button is clicked | |
| for frame in range(2, 4): | |
| done = False | |
| timeout = time.time() + 5 | |
| # Press Tick button on the page | |
| button = browser.find_elements_by_id("tick")[0] | |
| button.click() | |
| # Check that after pressing the button the current rendered frame | |
| # number updates on the page. Frame number is not updated | |
| # if there is a Javascript error in the render loop; | |
| # frame number update is the last action done in render() | |
| while not done and time.time() < timeout: | |
| elem = browser.find_elements_by_id("frame-number") | |
| if len(elem) > 0: | |
| done = (elem[0].text == str(frame)) | |
| time.sleep(1) | |
| self.assertTrue(time.time() < timeout, "Rendering frame timeout %d" % frame) | |
| self.assertTrue(done, "Could not render frame %d" % frame) | |
| print "Rendered frame %d" % frame | |
| if __name__ == '__main__': | |
| setUpModule() | |
| try: | |
| unittest.main() | |
| finally: | |
| tearDownModule() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
+1000, this has been driving me nuts