helpers.js 2.8 KB

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