|
- # Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
- # MIT License. See license.txt
-
- from __future__ import unicode_literals
-
- from selenium.webdriver.common.keys import Keys
- from selenium import webdriver
- from selenium.webdriver.common.by import By
- from selenium.webdriver.support.ui import WebDriverWait
- from selenium.webdriver.support import expected_conditions as EC
- from selenium.common.exceptions import TimeoutException
- from urllib import unquote
- import time, frappe, subprocess
-
- host = "http://localhost:8888"
- pipe = None
- driver = None
- verbose = None
- host = None
- logged_in = False
- cur_route = False
-
- def start(_verbose=None):
- global driver, verbose
- verbose = _verbose
-
- start_test_server(verbose)
- driver = webdriver.PhantomJS()
-
- def start_test_server(verbose):
- global pipe
- pipe = subprocess.Popen(["frappe", "--serve", "--port", "8888"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
- while not pipe.stderr.readline():
- time.sleep(0.5)
- if verbose:
- print "Test server started"
-
- def get(url):
- driver.get(url)
-
- def login(wait_for_id="#page-desktop"):
- global logged_in
- if logged_in:
- return
- get(host + "/login")
- wait("#login_email")
- set_input("#login_email", "Administrator")
- set_input("#login_password", "admin" + Keys.RETURN)
- wait(wait_for_id)
- logged_in = True
-
-
- def go_to_module(module_name, item=None):
- global cur_route
-
- # desktop
- find(".navbar-brand")[0].click()
- cur_route = None
- wait("#page-desktop")
-
- page = "Module/" + module_name
- m = find('#page-desktop [data-link="{0}"]'.format(page))
- if not m:
- page = "List/" + module_name
- m = find('#page-desktop [data-link="{0}"]'.format(page))
- if not m:
- raise Exception, "Module {0} not found".format(module_name)
-
- m[0].click()
- wait_for_page(page)
-
- if item:
- elem = find('[data-label="{0}"]'.format(item))[0]
- elem.click()
- page = unquote(elem.get_attribute("href").split("#", 1)[1])
- wait_for_page(page)
-
- def new_doc(module, doctype):
- go_to_module(module, doctype)
- find('.appframe-iconbar .icon-plus')[0].click()
- wait_for_page("Form/" + doctype)
-
- def add_child(fieldname):
- find('[data-fieldname="{0}"] .grid-add-row'.format(fieldname))[0].click()
- wait('[data-fieldname="{0}"] .form-grid'.format(fieldname))
-
- def find(selector, everywhere=False):
- if cur_route and not everywhere:
- selector = cur_route + " " + selector
- return driver.find_elements_by_css_selector(selector)
-
- def set_field(fieldname, value):
- set_input('input[data-fieldname="{0}"]'.format(fieldname), value + Keys.TAB)
- wait_for_ajax()
- time.sleep(0.5)
-
- def primary_action():
- find(".appframe-titlebar .btn-primary")[0].click()
- wait_for_ajax()
-
- def wait_for_ajax():
- wait('body[data-ajax-state="complete"]', True)
-
- def wait_for_page(name):
- global cur_route
- cur_route = None
- route = '[data-page-route="{0}"]'.format(name)
- elem = wait(route)
- wait_for_ajax()
- cur_route = route
- return elem
-
- def wait_for_state(state):
- return wait(cur_route + '[data-state="{0}"]'.format(state), True)
-
- def wait(selector, everywhere=False):
- if cur_route and not everywhere:
- selector = cur_route + " " + selector
- try:
- elem = WebDriverWait(driver, 10).until(
- EC.presence_of_element_located((By.CSS_SELECTOR, selector)))
- if verbose:
- print "found " + selector
- except TimeoutException:
- print "not found " + selector
- raise
- return elem
-
- def set_input(selector, text):
- elem = find(selector)[0]
- elem.clear()
- elem.send_keys(text)
-
- def close():
- global driver, pipe
- driver.quit()
- pipe.kill()
- driver = pipe = None
|