e2eUtils.ts 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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. const err = e.args()[0] as any
  14. console.error(
  15. `Error from Puppeteer-loaded page:\n`,
  16. err._remoteObject.description
  17. )
  18. }
  19. })
  20. })
  21. afterEach(async () => {
  22. await browser.close()
  23. })
  24. async function click(selector: string, options?: puppeteer.ClickOptions) {
  25. await page.click(selector, options)
  26. }
  27. async function count(selector: string) {
  28. return (await page.$$(selector)).length
  29. }
  30. async function text(selector: string) {
  31. return await page.$eval(selector, node => node.textContent)
  32. }
  33. async function value(selector: string) {
  34. return await page.$eval(selector, (node: HTMLInputElement) => node.value)
  35. }
  36. async function html(selector: string) {
  37. return await page.$eval(selector, node => node.innerHTML)
  38. }
  39. async function classList(selector: string) {
  40. return await page.$eval(selector, (node: any) => [...node.classList])
  41. }
  42. async function children(selector: string) {
  43. return await page.$eval(selector, (node: any) => [...node.children])
  44. }
  45. async function isVisible(selector: string) {
  46. const display = await page.$eval(selector, (node: HTMLElement) => {
  47. return window.getComputedStyle(node).display
  48. })
  49. return display !== 'none'
  50. }
  51. async function isChecked(selector: string) {
  52. return await page.$eval(selector, (node: HTMLInputElement) => node.checked)
  53. }
  54. async function isFocused(selector: string) {
  55. return await page.$eval(selector, node => node === document.activeElement)
  56. }
  57. async function setValue(selector: string, value: string) {
  58. const el = (await page.$(selector))!
  59. await el.evaluate((node: HTMLInputElement) => (node.value = ''))
  60. await el.type(value)
  61. }
  62. async function enterValue(selector: string, value: string) {
  63. const el = (await page.$(selector))!
  64. await el.evaluate((node: HTMLInputElement) => (node.value = ''))
  65. await el.type(value)
  66. await el.press('Enter')
  67. }
  68. async function clearValue(selector: string) {
  69. return await page.$eval(
  70. selector,
  71. (node: HTMLInputElement) => (node.value = '')
  72. )
  73. }
  74. return {
  75. page: () => page,
  76. click,
  77. count,
  78. text,
  79. value,
  80. html,
  81. classList,
  82. children,
  83. isVisible,
  84. isChecked,
  85. isFocused,
  86. setValue,
  87. enterValue,
  88. clearValue
  89. }
  90. }