Skip to content

Instantly share code, notes, and snippets.

@miohtama
Created January 23, 2012 23:47
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save miohtama/1666559 to your computer and use it in GitHub Desktop.
Save miohtama/1666559 to your computer and use it in GitHub Desktop.
Testing Three.js 3d rendered with Selenium + Python
"""
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()
@steinbachr
Copy link

+1000, this has been driving me nuts

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment