e2eUtils.ts 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import puppeteer from 'puppeteer'
  2. const puppeteerOptions = process.env.CI
  3. ? { args: ['--no-sandbox', '--disable-setuid-sandbox'] }
  4. : {}
  5. export function setupPuppeteer() {
  6. let browser: puppeteer.Browser
  7. let page: puppeteer.Page
  8. beforeEach(async () => {
  9. browser = await puppeteer.launch(puppeteerOptions)
  10. page = await browser.newPage()
  11. page.on('console', e => {
  12. if (e.type() === 'error') {
  13. console.error(`Error from Puppeteer-loaded page:`, e)
  14. }
  15. })
  16. })
  17. afterEach(async () => {
  18. await browser.close()
  19. })
  20. async function click(selector: string, options?: puppeteer.ClickOptions) {
  21. await page.click(selector, options)
  22. }
  23. async function count(selector: string) {
  24. return (await page.$$(selector)).length
  25. }
  26. async function text(selector: string) {
  27. return await page.$eval(selector, node => node.textContent)
  28. }
  29. async function value(selector: string) {
  30. return await page.$eval(selector, (node: HTMLInputElement) => node.value)
  31. }
  32. async function html(selector: string) {
  33. return await page.$eval(selector, node => node.innerHTML)
  34. }
  35. async function classList(selector: string) {
  36. return await page.$eval(selector, (node: any) => [...node.classList])
  37. }
  38. async function children(selector: string) {
  39. return await page.$eval(selector, (node: any) => [...node.children])
  40. }
  41. async function isVisible(selector: string) {
  42. const display = await page.$eval(selector, (node: HTMLElement) => {
  43. return window.getComputedStyle(node).display
  44. })
  45. return display !== 'none'
  46. }
  47. async function isChecked(selector: string) {
  48. return await page.$eval(selector, (node: HTMLInputElement) => node.checked)
  49. }
  50. async function isFocused(selector: string) {
  51. return await page.$eval(selector, node => node === document.activeElement)
  52. }
  53. async function enterValue(selector: string, value: string) {
  54. const el = (await page.$(selector))!
  55. await el.evaluate((node: HTMLInputElement) => (node.value = ''))
  56. await el.type(value)
  57. await el.press('Enter')
  58. }
  59. async function clearValue(selector: string) {
  60. return await page.$eval(
  61. selector,
  62. (node: HTMLInputElement) => (node.value = '')
  63. )
  64. }
  65. return {
  66. page: () => page,
  67. click,
  68. count,
  69. text,
  70. value,
  71. html,
  72. classList,
  73. children,
  74. isVisible,
  75. isChecked,
  76. isFocused,
  77. enterValue,
  78. clearValue
  79. }
  80. }