Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 
 
 
 

139 rader
3.4 KiB

  1. # Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
  2. # MIT License. See license.txt
  3. from __future__ import unicode_literals
  4. from selenium.webdriver.common.keys import Keys
  5. from selenium import webdriver
  6. from selenium.webdriver.common.by import By
  7. from selenium.webdriver.support.ui import WebDriverWait
  8. from selenium.webdriver.support import expected_conditions as EC
  9. from selenium.common.exceptions import TimeoutException
  10. from urllib import unquote
  11. import time, frappe, subprocess
  12. host = "http://localhost:8888"
  13. pipe = None
  14. driver = None
  15. verbose = None
  16. host = None
  17. logged_in = False
  18. cur_route = False
  19. def start(_verbose=None):
  20. global driver, verbose
  21. verbose = _verbose
  22. start_test_server(verbose)
  23. driver = webdriver.PhantomJS()
  24. def start_test_server(verbose):
  25. global pipe
  26. pipe = subprocess.Popen(["frappe", "--serve", "--port", "8888"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  27. while not pipe.stderr.readline():
  28. time.sleep(0.5)
  29. if verbose:
  30. print "Test server started"
  31. def get(url):
  32. driver.get(url)
  33. def login(wait_for_id="#page-desktop"):
  34. global logged_in
  35. if logged_in:
  36. return
  37. get(host + "/login")
  38. wait("#login_email")
  39. set_input("#login_email", "Administrator")
  40. set_input("#login_password", "admin" + Keys.RETURN)
  41. wait(wait_for_id)
  42. logged_in = True
  43. def go_to_module(module_name, item=None):
  44. global cur_route
  45. # desktop
  46. find(".navbar-brand")[0].click()
  47. cur_route = None
  48. wait("#page-desktop")
  49. page = "Module/" + module_name
  50. m = find('#page-desktop [data-link="{0}"]'.format(page))
  51. if not m:
  52. page = "List/" + module_name
  53. m = find('#page-desktop [data-link="{0}"]'.format(page))
  54. if not m:
  55. raise Exception, "Module {0} not found".format(module_name)
  56. m[0].click()
  57. wait_for_page(page)
  58. if item:
  59. elem = find('[data-label="{0}"]'.format(item))[0]
  60. elem.click()
  61. page = unquote(elem.get_attribute("href").split("#", 1)[1])
  62. wait_for_page(page)
  63. def new_doc(module, doctype):
  64. go_to_module(module, doctype)
  65. find('.appframe-iconbar .icon-plus')[0].click()
  66. wait_for_page("Form/" + doctype)
  67. def add_child(fieldname):
  68. find('[data-fieldname="{0}"] .grid-add-row'.format(fieldname))[0].click()
  69. wait('[data-fieldname="{0}"] .form-grid'.format(fieldname))
  70. def find(selector, everywhere=False):
  71. if cur_route and not everywhere:
  72. selector = cur_route + " " + selector
  73. return driver.find_elements_by_css_selector(selector)
  74. def set_field(fieldname, value):
  75. set_input('input[data-fieldname="{0}"]'.format(fieldname), value + Keys.TAB)
  76. wait_for_ajax()
  77. time.sleep(0.5)
  78. def primary_action():
  79. find(".appframe-titlebar .btn-primary")[0].click()
  80. wait_for_ajax()
  81. def wait_for_ajax():
  82. wait('body[data-ajax-state="complete"]', True)
  83. def wait_for_page(name):
  84. global cur_route
  85. cur_route = None
  86. route = '[data-page-route="{0}"]'.format(name)
  87. elem = wait(route)
  88. wait_for_ajax()
  89. cur_route = route
  90. return elem
  91. def wait_for_state(state):
  92. return wait(cur_route + '[data-state="{0}"]'.format(state), True)
  93. def wait(selector, everywhere=False):
  94. if cur_route and not everywhere:
  95. selector = cur_route + " " + selector
  96. try:
  97. elem = WebDriverWait(driver, 10).until(
  98. EC.presence_of_element_located((By.CSS_SELECTOR, selector)))
  99. if verbose:
  100. print "found " + selector
  101. except TimeoutException:
  102. print "not found " + selector
  103. raise
  104. return elem
  105. def set_input(selector, text):
  106. elem = find(selector)[0]
  107. elem.clear()
  108. elem.send_keys(text)
  109. def close():
  110. global driver, pipe
  111. driver.quit()
  112. pipe.kill()
  113. driver = pipe = None