todomvc.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. module.exports = {
  2. 'todomvc': function (browser) {
  3. browser
  4. .url('http://localhost:8080/todomvc/')
  5. .waitForElementVisible('.todoapp', 1000)
  6. .assert.notVisible('.main')
  7. .assert.notVisible('.footer')
  8. .assert.count('.filters .selected', 1)
  9. .assert.evaluate(function () {
  10. return document.querySelector('.filters .selected').textContent === 'All'
  11. }, null, 'filter should be "All"')
  12. createNewItem('test')
  13. .assert.count('.todo', 1)
  14. .assert.notVisible('.todo .edit')
  15. .assert.containsText('.todo label', 'test')
  16. .assert.containsText('.todo-count strong', '1')
  17. .assert.checked('.todo .toggle', false)
  18. .assert.visible('.main')
  19. .assert.visible('.footer')
  20. .assert.notVisible('.clear-completed')
  21. .assert.value('.new-todo', '')
  22. createNewItem('test2')
  23. .assert.count('.todo', 2)
  24. .assert.containsText('.todo:nth-child(2) label', 'test2')
  25. .assert.containsText('.todo-count strong', '2')
  26. // toggle
  27. browser
  28. .click('.todo .toggle')
  29. .assert.count('.todo.completed', 1)
  30. .assert.cssClassPresent('.todo:nth-child(1)', 'completed')
  31. .assert.containsText('.todo-count strong', '1')
  32. .assert.visible('.clear-completed')
  33. createNewItem('test3')
  34. .assert.count('.todo', 3)
  35. .assert.containsText('.todo:nth-child(3) label', 'test3')
  36. .assert.containsText('.todo-count strong', '2')
  37. createNewItem('test4')
  38. createNewItem('test5')
  39. .assert.count('.todo', 5)
  40. .assert.containsText('.todo-count strong', '4')
  41. // toggle more
  42. browser
  43. .click('.todo:nth-child(4) .toggle')
  44. .click('.todo:nth-child(5) .toggle')
  45. .assert.count('.todo.completed', 3)
  46. .assert.containsText('.todo-count strong', '2')
  47. // remove
  48. removeItemAt(1)
  49. .assert.count('.todo', 4)
  50. .assert.count('.todo.completed', 2)
  51. .assert.containsText('.todo-count strong', '2')
  52. removeItemAt(2)
  53. .assert.count('.todo', 3)
  54. .assert.count('.todo.completed', 2)
  55. .assert.containsText('.todo-count strong', '1')
  56. // remove all
  57. browser
  58. .click('.clear-completed')
  59. .assert.count('.todo', 1)
  60. .assert.containsText('.todo label', 'test2')
  61. .assert.count('.todo.completed', 0)
  62. .assert.containsText('.todo-count strong', '1')
  63. .assert.notVisible('.clear-completed')
  64. // prepare to test filters
  65. createNewItem('test')
  66. createNewItem('test')
  67. .click('.todo:nth-child(2) .toggle')
  68. .click('.todo:nth-child(3) .toggle')
  69. // active filter
  70. browser
  71. .click('.filters li:nth-child(2) a')
  72. .assert.count('.todo', 1)
  73. .assert.count('.todo.completed', 0)
  74. // add item with filter active
  75. createNewItem('test')
  76. .assert.count('.todo', 2)
  77. // complted filter
  78. browser.click('.filters li:nth-child(3) a')
  79. .assert.count('.todo', 2)
  80. .assert.count('.todo.completed', 2)
  81. // toggling with filter active
  82. browser
  83. .click('.todo .toggle')
  84. .assert.count('.todo', 1)
  85. .click('.filters li:nth-child(2) a')
  86. .assert.count('.todo', 3)
  87. .click('.todo .toggle')
  88. .assert.count('.todo', 2)
  89. // editing triggered by blur
  90. browser
  91. .click('.filters li:nth-child(1) a')
  92. .dblClick('.todo:nth-child(1) label')
  93. .assert.count('.todo.editing', 1)
  94. .assert.focused('.todo:nth-child(1) .edit')
  95. .clearValue('.todo:nth-child(1) .edit')
  96. .setValue('.todo:nth-child(1) .edit', 'edited!')
  97. .click('footer') // blur
  98. .assert.count('.todo.editing', 0)
  99. .assert.containsText('.todo:nth-child(1) label', 'edited!')
  100. // editing triggered by enter
  101. browser
  102. .dblClick('.todo label')
  103. .enterValue('.todo:nth-child(1) .edit', 'edited again!')
  104. .assert.count('.todo.editing', 0)
  105. .assert.containsText('.todo:nth-child(1) label', 'edited again!')
  106. // cancel
  107. browser
  108. .dblClick('.todo label')
  109. .clearValue('.todo:nth-child(1) .edit')
  110. .setValue('.todo:nth-child(1) .edit', 'edited!')
  111. .trigger('.todo:nth-child(1) .edit', 'keyup', 27)
  112. .assert.count('.todo.editing', 0)
  113. .assert.containsText('.todo:nth-child(1) label', 'edited again!')
  114. // empty value should remove
  115. browser
  116. .dblClick('.todo label')
  117. .enterValue('.todo:nth-child(1) .edit', ' ')
  118. .assert.count('.todo', 3)
  119. // toggle all
  120. browser
  121. .click('.toggle-all')
  122. .assert.count('.todo.completed', 3)
  123. .click('.toggle-all')
  124. .assert.count('.todo:not(.completed)', 3)
  125. .end()
  126. function createNewItem (text) {
  127. return browser.enterValue('.new-todo', text)
  128. }
  129. function removeItemAt (n) {
  130. return browser
  131. .moveToElement('.todo:nth-child(' + n + ')', 10, 10)
  132. .click('.todo:nth-child(' + n + ') .destroy')
  133. }
  134. }
  135. }