e2eUtils.ts 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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: puppeteer.Browser
  8. let page: puppeteer.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] as any
  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: string, options?: puppeteer.ClickOptions) {
  26. await page.click(selector, options)
  27. }
  28. async function count(selector: string) {
  29. return (await page.$$(selector)).length
  30. }
  31. async function text(selector: string) {
  32. return await page.$eval(selector, node => node.textContent)
  33. }
  34. async function value(selector: string) {
  35. return await page.$eval(selector, (node: HTMLInputElement) => node.value)
  36. }
  37. async function html(selector: string) {
  38. return await page.$eval(selector, node => node.innerHTML)
  39. }
  40. async function classList(selector: string) {
  41. return await page.$eval(selector, (node: any) => [...node.classList])
  42. }
  43. async function children(selector: string) {
  44. return await page.$eval(selector, (node: any) => [...node.children])
  45. }
  46. async function isVisible(selector: string) {
  47. const display = await page.$eval(selector, (node: HTMLElement) => {
  48. return window.getComputedStyle(node).display
  49. })
  50. return display !== 'none'
  51. }
  52. async function isChecked(selector: string) {
  53. return await page.$eval(selector, (node: HTMLInputElement) => node.checked)
  54. }
  55. async function isFocused(selector: string) {
  56. return await page.$eval(selector, node => node === document.activeElement)
  57. }
  58. async function setValue(selector: string, value: string) {
  59. const el = (await page.$(selector))!
  60. await el.evaluate((node: HTMLInputElement) => (node.value = ''))
  61. await el.type(value)
  62. }
  63. async function enterValue(selector: string, value: string) {
  64. const el = (await page.$(selector))!
  65. await el.evaluate((node: HTMLInputElement) => (node.value = ''))
  66. await el.type(value)
  67. await el.press('Enter')
  68. }
  69. async function clearValue(selector: string) {
  70. return await page.$eval(
  71. selector,
  72. (node: HTMLInputElement) => (node.value = '')
  73. )
  74. }
  75. return {
  76. page: () => page,
  77. click,
  78. count,
  79. text,
  80. value,
  81. html,
  82. classList,
  83. children,
  84. isVisible,
  85. isChecked,
  86. isFocused,
  87. setValue,
  88. enterValue,
  89. clearValue
  90. }
  91. }