e2eUtils.ts 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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. })
  12. afterEach(async () => {
  13. await browser.close()
  14. })
  15. async function click(selector: string, options?: puppeteer.ClickOptions) {
  16. await page.click(selector, options)
  17. }
  18. async function count(selector: string) {
  19. return (await page.$$(selector)).length
  20. }
  21. async function text(selector: string) {
  22. return await page.$eval(selector, node => node.textContent)
  23. }
  24. async function value(selector: string) {
  25. return await page.$eval(selector, (node: any) => node.value)
  26. }
  27. async function classList(selector: string) {
  28. return await page.$eval(selector, (node: any) => [...node.classList])
  29. }
  30. async function children(selector: string) {
  31. return await page.$eval(selector, (node: any) => [...node.children])
  32. }
  33. async function isVisible(selector: string) {
  34. const display = await page.$eval(selector, (node: HTMLElement) => {
  35. return window.getComputedStyle(node).display
  36. })
  37. return display !== 'none'
  38. }
  39. async function isChecked(selector: string) {
  40. return await page.$eval(selector, (node: any) => node.checked)
  41. }
  42. async function isFocused(selector: string) {
  43. return await page.$eval(selector, node => node === document.activeElement)
  44. }
  45. async function enterValue(selector: string, value: string) {
  46. const el = (await page.$(selector))!
  47. await el.evaluate((node: any) => (node.value = ''))
  48. await el.type(value)
  49. await el.press('Enter')
  50. }
  51. async function clearValue(selector: string) {
  52. return await page.$eval(selector, (node: any) => (node.value = ''))
  53. }
  54. return {
  55. page: () => page,
  56. click,
  57. count,
  58. text,
  59. value,
  60. classList,
  61. children,
  62. isVisible,
  63. isChecked,
  64. isFocused,
  65. enterValue,
  66. clearValue
  67. }
  68. }