2.basic_input.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. import json
  2. import subprocess
  3. import time
  4. from percy import percySnapshot
  5. from selenium.webdriver import Chrome
  6. from selenium.webdriver.support.ui import Select
  7. import pywebio
  8. from pywebio import start_server
  9. from pywebio.input import *
  10. from pywebio.output import *
  11. from os import path
  12. here_dir = path.dirname(path.abspath(__file__))
  13. def basic():
  14. set_auto_scroll_bottom(True)
  15. age = input("How old are you?", type=NUMBER)
  16. put_markdown(f'`{repr(age)}`')
  17. password = input("Input password", type=PASSWORD)
  18. put_markdown(f'`{repr(password)}`')
  19. # 下拉选择框
  20. gift = select('Which gift you want?', ['keyboard', 'ipad'])
  21. put_markdown(f'`{repr(gift)}`')
  22. # CheckBox
  23. agree = checkbox("用户协议", options=['I agree to terms and conditions'])
  24. put_markdown(f'`{repr(agree)}`')
  25. # Text Area
  26. text = textarea('Text Area', rows=3, placeholder='Some text')
  27. put_markdown(f'`{repr(text)}`')
  28. # 文件上传
  29. img = file_upload("Select a image:", accept="image/*")
  30. put_markdown(f'`{repr(img)}`')
  31. # 输入参数
  32. res = input('This is label', type=TEXT, placeholder='This is placeholder,required=True',
  33. help_text='This is help text', required=True)
  34. put_markdown(f'`{repr(res)}`')
  35. # 校验函数
  36. def check_age(p): # 检验函数校验通过时返回None,否则返回错误消息
  37. if p < 10:
  38. return 'Too young!!'
  39. if p > 60:
  40. return 'Too old!!'
  41. age = input("How old are you?", type=NUMBER, valid_func=check_age, help_text='age in [10, 60]')
  42. put_markdown(f'`{repr(age)}`')
  43. # Codemirror
  44. code = textarea('Code Edit', code={
  45. 'mode': "python", # 编辑区代码语言
  46. 'theme': 'darcula', # 编辑区darcula主题, Visit https://codemirror.net/demo/theme.html#cobalt to get more themes
  47. }, value='import something\n# Write your python code')
  48. put_markdown(f'`{repr(code)}`')
  49. # 输入组
  50. info = input_group("Cancelable", [
  51. input('Input your name', name='name'),
  52. input('Input your age', name='age', type=NUMBER, valid_func=check_age, help_text='age in [10, 60]')
  53. ], cancelable=True)
  54. put_markdown(f'`{repr(info)}`')
  55. def check_form(data): # 检验函数校验通过时返回None,否则返回 (input name,错误消息)
  56. if len(data['password']) > 6:
  57. return ('password', 'password太长!')
  58. check_item_data = []
  59. def check_item(data):
  60. check_item_data.append(repr(data))
  61. info = input_group('Input group', [
  62. input('Text', type=TEXT, datalist=['data-%s' % i for i in range(10)], name='text',
  63. required=True, help_text='required=True', valid_func=check_item),
  64. input('Number', type=NUMBER, value="42", name='number', valid_func=check_item),
  65. input('Float', type=FLOAT, name='float', valid_func=check_item),
  66. input('Password', type=PASSWORD, name='password', valid_func=check_item),
  67. textarea('Textarea', rows=3, maxlength=20, name='textarea',
  68. help_text='rows=3, maxlength=20', valid_func=check_item),
  69. textarea('Code', name='code', code={
  70. 'lineNumbers': False,
  71. 'indentUnit': 2,
  72. }, value='import something\n# Write your python code', valid_func=check_item),
  73. select('select-multiple', [
  74. {'label': '标签0,selected', 'value': '0', 'selected': True},
  75. {'label': '标签1,disabled', 'value': '1', 'disabled': True},
  76. ('标签2,selected', '2', True),
  77. ('标签3', '3'),
  78. ('标签4,disabled', '4', False, True),
  79. '标签5,selected',
  80. ], name='select-multiple', multiple=True, value=['标签5,selected'], required=True,
  81. help_text='required至少选择一项', valid_func=check_item),
  82. select('select', [
  83. {'label': '标签0', 'value': '0', 'selected': False},
  84. {'label': '标签1,disabled', 'value': '1', 'disabled': True},
  85. ('标签2', '2', False),
  86. ('标签3', '3'),
  87. ('标签4,disabled', '4', False, True),
  88. '标签5,selected',
  89. ], name='select', value=['标签5,selected'], valid_func=check_item),
  90. checkbox('checkbox-inline', [
  91. {'label': '标签0,selected', 'value': '0', 'selected': False},
  92. {'label': '标签1,disabled', 'value': '1', 'disabled': True},
  93. ('标签2,selected', '2', True),
  94. ('标签3', '3'),
  95. ('标签4,disabled', '4', False, True),
  96. '标签5,selected',
  97. ], inline=True, name='checkbox-inline', value=['标签5,selected', '标签0', '标签0,selected'], valid_func=check_item),
  98. checkbox('checkbox', [
  99. {'label': '标签0,selected', 'value': '0', 'selected': True},
  100. {'label': '标签1,disabled', 'value': '1', 'disabled': True},
  101. ('标签2,selected', '2', True),
  102. ('标签3', '3'),
  103. ('标签4,disabled', '4', False, True),
  104. '标签5',
  105. ], name='checkbox', valid_func=check_item),
  106. radio('radio-inline', [
  107. {'label': '标签0', 'value': '0', 'selected': False},
  108. {'label': '标签1,disabled', 'value': '1', 'disabled': True},
  109. ('标签2', '2', False),
  110. ('标签3', '3'),
  111. ('标签4,disabled', '4', False, True),
  112. '标签5,selected',
  113. ], inline=True, name='radio-inline', value='标签5,selected', valid_func=check_item),
  114. radio('radio', [
  115. {'label': '标签0', 'value': '0', 'selected': False},
  116. {'label': '标签1,disabled', 'value': '1', 'disabled': True},
  117. ('标签2', '2', False),
  118. ('标签3', '3'),
  119. ('标签4,disabled', '4', False, True),
  120. '标签5,selected',
  121. ], inline=False, name='radio', value='标签5,selected', valid_func=check_item),
  122. file_upload('file_upload', name='file_upload'),
  123. actions('actions', [
  124. {'label': '提交', 'value': 'submit'},
  125. ('提交2', 'submit2'),
  126. '提交3',
  127. {'label': 'disabled', 'disabled': True},
  128. ('重置', 'reset', 'reset'),
  129. {'label': '取消', 'type': 'cancel'},
  130. ], name='actions', help_text='actions'),
  131. ], valid_func=check_form)
  132. put_text('`valid_func()` log:')
  133. put_code(json.dumps(sorted(check_item_data), indent=4, ensure_ascii=False), 'json')
  134. put_text('Form result:')
  135. if info:
  136. put_code(json.dumps([repr(i) for i in sorted(info.items())], indent=4, ensure_ascii=False), 'json')
  137. def start_test_server():
  138. pywebio.enable_debug()
  139. start_server(basic, port=8080, debug=False, auto_open_webbrowser=False)
  140. def test(server_proc: subprocess.Popen, browser: Chrome):
  141. browser.find_element_by_css_selector('input').send_keys("22")
  142. browser.find_element_by_tag_name('form').submit()
  143. time.sleep(0.5)
  144. browser.find_element_by_css_selector('input').send_keys("secret")
  145. browser.find_element_by_tag_name('form').submit()
  146. time.sleep(0.5)
  147. browser.find_element_by_tag_name('form').submit()
  148. # checkbox
  149. time.sleep(0.5)
  150. browser.find_element_by_css_selector('input').click()
  151. browser.find_element_by_tag_name('form').submit()
  152. # Text Area
  153. time.sleep(0.5)
  154. browser.find_element_by_css_selector('textarea').send_keys(" ".join(str(i) for i in range(20)))
  155. browser.find_element_by_tag_name('form').submit()
  156. # file
  157. time.sleep(0.5)
  158. img_path = path.join(here_dir, 'assets', 'img.png')
  159. browser.find_element_by_css_selector('input').send_keys(img_path)
  160. browser.find_element_by_tag_name('form').submit()
  161. # text
  162. time.sleep(0.5)
  163. browser.find_element_by_css_selector('input').send_keys("text")
  164. browser.find_element_by_tag_name('form').submit()
  165. # valid func, age in [10, 60]
  166. time.sleep(0.5)
  167. browser.find_element_by_css_selector('input').send_keys("1")
  168. browser.find_element_by_tag_name('form').submit()
  169. time.sleep(0.5)
  170. browser.find_element_by_css_selector('input').clear()
  171. browser.find_element_by_css_selector('input').send_keys("90")
  172. browser.find_element_by_tag_name('form').submit()
  173. time.sleep(0.5)
  174. browser.find_element_by_css_selector('input').clear()
  175. browser.find_element_by_css_selector('input').send_keys("23")
  176. browser.find_element_by_tag_name('form').submit()
  177. # code
  178. time.sleep(0.5)
  179. # browser.find_element_by_css_selector('textarea').send_keys(" ".join(str(i) for i in range(20)))
  180. browser.find_element_by_tag_name('form').submit()
  181. # Cancelable from group
  182. time.sleep(0.5)
  183. browser.find_element_by_css_selector('input[name="name"]').send_keys("name")
  184. browser.find_element_by_css_selector('input[name="age"]').send_keys("90")
  185. browser.find_element_by_tag_name('form').submit()
  186. percySnapshot(browser=browser, name='input group invalid')
  187. browser.find_element_by_css_selector('input[name="age"]').clear()
  188. browser.find_element_by_css_selector('input[name="age"]').send_keys("23")
  189. browser.find_element_by_tag_name('form').submit()
  190. # Input group
  191. time.sleep(0.5)
  192. percySnapshot(browser=browser, name='input group all')
  193. browser.find_element_by_css_selector('[name="text"]').send_keys("name")
  194. browser.find_element_by_css_selector('[name="number"]').send_keys("20")
  195. browser.find_element_by_css_selector('[name="float"]').send_keys("3.1415")
  196. browser.find_element_by_css_selector('[name="password"]').send_keys("password")
  197. browser.find_element_by_css_selector('[name="textarea"]').send_keys(" ".join(str(i) for i in range(20)))
  198. # browser.find_element_by_css_selector('[name="code"]').send_keys(" ".join(str(i) for i in range(10)))
  199. Select(browser.find_element_by_css_selector('[name="select-multiple"]')).select_by_index(0)
  200. # browser. find_element_by_css_selector('[name="select"]'). send_keys("name")
  201. # browser. find_element_by_css_selector('[name="checkbox-inline"]'). send_keys("name")
  202. # browser. find_element_by_css_selector('[name="checkbox"]'). send_keys("name")
  203. # browser. find_element_by_css_selector('[name="radio-inline"]'). send_keys("name")
  204. # browser. find_element_by_css_selector('[name="radio"]'). send_keys("name")
  205. browser.find_element_by_css_selector('[name="file_upload"]').send_keys(img_path)
  206. browser.find_element_by_css_selector('button[value="submit2"]').click()
  207. time.sleep(0.5)
  208. percySnapshot(browser=browser, name='input group all invalid')
  209. browser.find_element_by_css_selector('[name="password"]').clear()
  210. browser.find_element_by_css_selector('[name="password"]').send_keys("123")
  211. browser.find_element_by_css_selector('button[value="submit2"]').click()
  212. time.sleep(0.5)
  213. percySnapshot(browser=browser, name='input group all submit')
  214. if __name__ == '__main__':
  215. import util
  216. util.run_test(start_test_server, test)