helpers.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. import { createApp } from 'vue'
  2. import puppeteer from 'puppeteer'
  3. export function mount (store, component) {
  4. const el = createElement()
  5. component.render = () => {}
  6. const app = createApp(component)
  7. app.use(store)
  8. return app.mount(el)
  9. }
  10. function createElement () {
  11. const el = document.createElement('div')
  12. document.body.appendChild(el)
  13. return el
  14. }
  15. export const E2E_TIMEOUT = 30 * 1000
  16. const puppeteerOptions = process.env.CI
  17. ? { args: ['--no-sandbox', '--disable-setuid-sandbox'] }
  18. : {}
  19. export function setupPuppeteer () {
  20. let browser
  21. let page
  22. beforeEach(async () => {
  23. browser = await puppeteer.launch(puppeteerOptions)
  24. page = await browser.newPage()
  25. page.on('console', (e) => {
  26. if (e.type() === 'error') {
  27. const err = e.args()[0]
  28. console.error(
  29. `Error from Puppeteer-loaded page:\n`,
  30. err._remoteObject.description
  31. )
  32. }
  33. })
  34. })
  35. afterEach(async () => {
  36. await browser.close()
  37. })
  38. async function click (selector, options) {
  39. await page.click(selector, options)
  40. }
  41. async function hover (selector) {
  42. await page.hover(selector)
  43. }
  44. async function keyUp (key) {
  45. await page.keyboard.up(key)
  46. }
  47. async function count (selector) {
  48. return (await page.$$(selector)).length
  49. }
  50. async function text (selector) {
  51. return await page.$eval(selector, (node) => node.textContent)
  52. }
  53. async function value (selector) {
  54. return await page.$eval(selector, (node) => node.value)
  55. }
  56. async function html (selector) {
  57. return await page.$eval(selector, (node) => node.innerHTML)
  58. }
  59. async function classList (selector) {
  60. return await page.$eval(selector, (node) => {
  61. const list = []
  62. for (const index in node.classList) {
  63. list.push(node.classList[index])
  64. }
  65. return list
  66. })
  67. }
  68. async function hasClass (selector, name) {
  69. return (await classList(selector)).find(c => c === name) !== undefined
  70. }
  71. async function isVisible (selector) {
  72. const display = await page.$eval(selector, (node) => {
  73. return window.getComputedStyle(node).display
  74. })
  75. return display !== 'none'
  76. }
  77. async function isChecked (selector) {
  78. return await page.$eval(selector, (node) => node.checked)
  79. }
  80. async function isFocused (selector) {
  81. return await page.$eval(selector, (node) => node === document.activeElement)
  82. }
  83. async function setValue (selector, value) {
  84. const el = (await page.$(selector))
  85. await el.evaluate((node) => { node.value = '' })
  86. await el.type(value)
  87. }
  88. async function enterValue (selector, value) {
  89. const el = (await page.$(selector))
  90. await el.evaluate((node) => { node.value = '' })
  91. await el.type(value)
  92. await el.press('Enter')
  93. }
  94. async function clearValue (selector) {
  95. return await page.$eval(selector, (node) => { node.value = '' })
  96. }
  97. async function sleep (ms = 0) {
  98. return new Promise((resolve) => {
  99. setTimeout(resolve, ms)
  100. })
  101. }
  102. return {
  103. page: () => page,
  104. click,
  105. hover,
  106. keyUp,
  107. count,
  108. text,
  109. value,
  110. html,
  111. classList,
  112. hasClass,
  113. isVisible,
  114. isChecked,
  115. isFocused,
  116. setValue,
  117. enterValue,
  118. clearValue,
  119. sleep
  120. }
  121. }