אוטומיצה ללא דרייברים | אלכס קומנוב

 פריימוורק מבוסס JavaScript

 במהלך עבודתי על פרויקט האוטומציה בשפת ג'אווה עם סלניום בחברה בה אני עובד נולד רעיון  אשר ישמש גם את מחלקת הבדיקות וגם את מחלקת הפיתוח. הרעיון היה לבנות פרויקט אוטומציה באמצעות אחד מהפריימוורקים מבוססי JS וזאת בשל השימוש במחלקת הפיתוח בשפות JS ו-TS. החלטנו להתחיל בפיילוט אשר מטרתו, לבדוק את האפשרות שמפתחים יוכלו לכתוב טסטים של UI בסיסיים לפיצ׳רים חדשים, וזאת לצד ה-System Tests שהם כותבים. מטרה נוספת הייתה לבדוק את עקומת הלמידה של השימוש בפריימוורק.

חשוב לי לציין שמטרת המאמר היא לא להציג שרק הפריימוורק הזה הוא הכי טוב ושהוא מושלם, חלילה, גם בו לא חסר באגים, בעיות וכו'. המטרה היא להציג את הפריימוורק הזה לצד היתרונות והחסרונות שלו, וקצת להעביר את החוויה שלי מהשימוש בו.

במהלך החיפוש ברשת, גיליתי עד כמה פתרונות מבוססי JS תפסו תאוצה וגיליתי קהילות גדולות שמקדמות את הפתרונות שלהן החל ממענה מהיר על שאלות ועד תיקון באגים ושחרור גרסאות בצורה עקבית. אחד המקורות שהתבססתי עליהם היה אתר NPM Trends. האתר משווה את כמות ההורדות של packages ועל סמך זה מראה את הפופולריות של פריימוורק כזה או אחר. בנוסף, האתר מראה את המידע על כמות ה-issues[1] ושל stars[2] וכמו כן מראה את תאריך עדכון הגרסה האחרונה של אותו פריימוורק. כאמור, יש לא מעט פריימוורקים מבוססי JS והחלטתי להתמקד בהשוואה שלי בין 4 הבאים: Puppeteer, Cypress, Playwright, Test Cafe. הרצת החיפוש ב-NPM Trends[3] הניבה את הגרף הבא:

כפי שניתן לראות מתוצאת החיפוש, הזוג המוביל הינו cypress ו-puppeteer. גם playwright צובר תאוצה מאוד גדולה, למרות שבגרף לעיל הוא נמצא במקום יותר נמוך. ניתן לראות שגם Test Cafe נמצא במיקום נמוך בהשוואה לזוג המוביל. במהלך ההשוואה שלי בניתי כמה תסריטים פשוטים בעזרת כל אחד מ-4 הנ״ל ותוך כדי העבודה איתם התחלתי להכיר את היתרונות והחסרונות של כל אחד מהם.

אז מה זה בכלל Test Café?

לפני שנצלול לתוך הפריימוורק עצמו, קצת היסטוריה.

הפריימוורק פותח ע״י חברת DevExpress בשנת 2015. זהו פריימוורק חינמי וגם קוד פתוח. הוא מוצג כפריימוורק לכתיבת תסריטי E2E. יצא לי לשמוע הרצאה של אחת המתפתחות של הפריימוורק שסיפרה איך בכלל נולד הרעיון לפתח פריימוורק הזה (אציין שההרצאה היא בשפה הרוסית). חברת DevExpress חיפשה בהתחלה פריימוורק שייתן מענה לצרכים הבאים:

- התקנה פשוטה.

- הרצת טסטים בצורה מקומית ומרוחקת,

  בסביבות ודפדפנים מרובים.

- לא דורש למידה של שפת תכנות חדשה (בחברה השתמשו ב-JS וב- TS).

- מנגנון מובנה של תמיכה ביציבות הטסטים, בהשוואה לאי יציבות שהם חוו בשימוש בסלניום.

 לאחר ולא מצאו פתרון הולם בשבילם, הם החליטו ליצור אחד משלהם.

הפתרון שנולד הינו Test Cafe. הפריימוורק עובד בצורה הבאה:

הפריימוורק מתחיל להריץ URL-rewriting proxy. במילים פשוטות הוא מריץ proxy server מקומי על המכונה, ולאחר מכן מתחיל להריץ את הטסט בדפדפן. לכן הכתובת שנראה בדפדפן תהיה עם תוספת הכתובת של ה-proxy server:

http://192.168.1.247:53314/rDJ1yCUBp*QiboiwYTm/https://devexpress.github.io/testcafe/example/

הסקריפט של הטסט מושתל מתוך ה-proxy לתוך העמוד עצמו. העבודה דרך ה-proxy נותנת שליטה מלאה בכל מה שנדרש לטסטים: פעולות המשתמש (דרך DOM API), ריצה של סקריפטים נוספים, http requests, וכו׳. מצד שני כל הקוד של הטסט רץ בצד השרת בסביבת Node.js. הפקודות לביצוע נשלחות לדפדפן והשרת מחכה לתשובה חזרה. להלן תרשים העבודה של ה-Test Cafe[4]:

מבחינת העמוד בדפדפן, זה נראה כאילו משתמש אמיתי ולא סימולציה מבצעת בו את הפעולות.

החלק הכי מהותי בצורת עבודה זו – אין צורך בדרייבר, כלומר כל דפדפן שמותקן על המכונה ירוץ בעזרת פקודה אחת פשוטה.

 להלן מספר תכונות נוספות של הפריימוורק:

  • תומך בדפדפנים מודרניים (כולל safari)
  • תומך בדפדפנים שהם legacy (למשל  Edge בגרסתו הישנה, או IE)
  • תומך בדפדפני סלולר
  • תומך בהרצה על מכשירים מרוחקים, ללא צורך בהתקנה של test cafe עליו, רק בהזנת כתובת IP (דורש חיבור לאותה הרשת של המכשירים).
  • מתאים לעבודה במצב headless, דפדפן ללא UI.
  • Cross platform
  • לא דורש plugins
  • כולל בתוכו פונקציות מיוחדות לפריימוורקים של frontend כגון: Angular, React, Vue.
  • מתאים לעבודה עם כל האתרים ויישומוני דפדפנים
  • תמיכה בהרצה מקבילית.
  • מעולה בשביל העבודה עם IFrames, ריבוי חלונות.
  • תומך ב-Page Object Model.
  • תומך ב-BDD.
  • תומך ב Javascript / Typescript / Coffeescript.
  • תמיכה בהרצה ב-CI.
  • תמיכה מובנית ב-reporter generator.
  • תמיכה מובנית ב-json report.
  • תמיכה מובנית ב-XUnit report.

התקנה של Test Café

לפני שמתחילים להתקין ולעבוד עם הפריימוורק, יש צורך בשני דברים מקדימים:

  • js וגם NPM שיהיו מותקנים על המערכת.
  • עורך קוד, כאשר ההמלצה היא על Visual Studio Code, שהוא חינמי וניתן להוריד לו תוספים מיוחדים לעבודה הנוחה עם Test Cafe.

לאחר שיש לנו את 2 הדברים שצוינו לעיל – ניתן לפתוח תיקיה ייעודית שתכלול את כל הפרויקט. לאחר מכן נמשיך בכמה צעדים פשוטים:

  1. פתחו את התיקייה בעזרת עורך הקוד.
  2. הריצו את הפקודה npm init -y, זוהי פקודה שמייצרת את הקובץ json, אשר יכיל את כל ה-dependencies של הפרויקט (בדומה ל-pom.xml למי שבא מעולם ה-JAVA למשל).  
  3. לאחר מכן יש להריץ את הפקודה הבאה:

 npm install -g testcafe

זו הפקודה שתתחיל להוריד את הספריות של הפריימוורק.

וזהו! סיימנו! אין צורך כאמור בשום תוסף או דרייבר נוסף, על מנת להתחיל לעבוד ולהריץ את הטסטים שלנו. הייתי ממליץ לבדוק בכל זאת שאכן נוצרה תיקיית node_modules וגם שה-dependency של ה-test cafe התווסף כנדרש:

אציין שההתקנה היא סופר מהירה (מספר דקות בודדות, תלוי במהירות האינטרנט שלכם) מאחר והפריימוורק לא מוריד יחד איתו דפדפנים (כמו במקרה של puppeteer שמוריד יחד איתו את chromium).

 

כתיבה והרצה של טסט ראשון

 הטסט הפשוט נראה בצורה הבאה:

כפי שניתן לראות בצילום מסך - הטסטים מאורגנים בקטגוריות הנקראות fixtures. מומלץ שכל קובץ יכיל קטגוריה (fixture) אחת, אך בהחלט ניתן גם להכיל מספר קטגוריות בתוך הקובץ.

מתחת לקטגוריה נכתבת מתודה שנקראת page. זוהי מתודה שתכלול את הכתובת של העמוד עליו נבצע את הטסטים.

לאחר מכן מגיע הטסט עצמו שאותו אנחנו כותבים בתוך מתודה שנקראת test. כפי שניתן לראות בצילום מסך - אחד הפרמטרים שלה זהו השם של הטסט ולאחר מכן ישנה פונקציה אסינכרונית עם אובייקט שנקרא Test Controller, שהוא בעצם זה שמכיל בתוכו את כל המתודות למניפולציה עם העמוד, בטסט עצמו אנחנו פוגשים אותו בתור אות t. לאחר מכן ניתן להתחיל להשתמש במתודות שמציע לנו הפריימוורק. רק אל תשכחו שמדובר בפונקציה אסינכרונית, ועל כן נשתמש ב-async/await. שימוש בפונקציה אסינכרונית בתוך הטסט אולי יהיה קצת מוזר וקשה להבנה למי שבא מעולם ה-java למשל, אך ניתן להשתמש בחומר מהרשת, למשל באתר הזה. לאחר שקצת מבינים על מה מדובר – אז השד כבר לא כזה נורא.

לאחר שכתבנו את הטסט הבסיסי שלנו, ניתן להריץ את הטסט ע״י פקודה סופר פשוטה ישירות מהטרמינל של עורך הקוד (למשל במקרה שלי מהטרמינל של Visual Studio Code):

וזהו! הטסט יתחיל להריץ את הדפדפן שצוין בפקודה עם הטסט שצוין.

לאחר שהטסט הסתיים (במקרה הזה בהצלחה – ניתן לראות בטרמינל מידע על הריצה עצמה:

כפי שניתן לראות – כבר במצב הסטנדרטי, ניתן להבחין שהמידע המסופק הוא מאוד ברור. ניתן לראות על איזו מערכת הפעלה הרצנו, על איזה דפדפן, גרסאות, מה הטסט שהרצנו וכמה זמן זה לקח.

בעזרת הפקודה הפשוטה דרך הטרמינל ניתן לראות את הדפדפנים הזמינים לטסטים:

testcafe –list-browsers

הפלט יציג לנו את המידע אודות הדפדפנים.

ניתן לראות שבבכמה שורות קוד פשוטות – אפשר כבר לבצע פעולות בסיסיות, כמו כן ניתן לשים לב שהשמות של המתודות מאוד פשוטות להבנה של מה שהן אמורות לעשות.

מניסיוני האישי, אני חייב לומר שלאחר קריאת ההסבר הראשון באתר של test cafe לקח לי מספר דקות בודדות עד להרצת הטסט הראשון. הדוקומנטציה מאוד ברורה. כבר בשלב הזה יש מתודות רבות ומגוונות שניתן להשתמש בהן (על חלקן אני אספר בהמשך המאמר) וניתן לגשת לדוקומנטציה הרשמית, שכאמור מעולה.

פונקציות מעניינות

מפתחי הפריימוורק הכניסו לא מעט מתודות מעניינות לסינטקס שהופכות את השימוש בו למאוד מהנה ונוח. להלן מספר דוגמאות לפונקציות שאני אישית מאוד התחברתי אליהן:

Selector

הפריימוורק מביא איתו פונקציונליות מורחבת והרבה יותר מובנת מעבר לחיפוש סטנדרטי בעזרת CSS. למשל אם החיפוש הסטנדרטי של CSS יראה ככה:

div.my-button:nth(2)

אז בעזרת הפריימוורק ניתן לכתוב את זה קצת יותר מסודר:

 Selector(‘div’).filter(‘.my-button’).nth(1);

ניתן לחפש לשני הכיוונים (גם למטה בעץ וגם למעלה):

 Selector(‘label’).nth(4).parent(3).child(‘ul’);

ואחת המתודות שאני אהבתי – זה חיפוש מאוד פשוט ע״פ הטקסט של אלמנט:

 Selector(‘label’).withText(‘Login’);

אבל מה זה ה-Selector הזה בכלל?

מדובר בפונקציה אסינכרונית שמחזירה בסופו של דבר promise. זה בנוי ככה מתוך נקודת מחשבה שהטסט כאמור רץ בשרת. הסלקטור נוצר גם כן בתוך צד השרת והוא צריך גישה לעמוד עצמו לביצוע הפעולה. לכן סלקטור מועבר לעמוד עצמו, מתבצע שם, ומחזיר תשובה לצד השרת. מאחר ואין לדעת כמה זמן תיקח פעולה שכזו, לכן מדובר בפונקציה אסינכרונית. הסלקטור לא מחזיר את האלמנט עצמו, אלא מאין צילום סטטי של האלמנט ושל המאפיינים שלו.

מנגנון המתנה אוטומטי

הפריימוורק מגיע עם מנגנון המתנה מובנה (כאמור, בעיקר לאור הניסיון המר של מפתחי הפריימוורק עם selenium), על מנת להבטיח יציבות טובה יותר של הטסטים. המנגנון יודע להמתין ב-5 חזיתות עיקריות

  • המתנה לסלקטור
  • המתנה לפעולה
  • המתנה ל-assertion
  • המתנה להפניה לעמוד אחר (redirect)
  • המתנה ל-xhr request

המנגנון יחכה במסגרת timeout שמוגדר אוטומטית, אך ניתן גם להגדיר אותו מחדש בצורה ידנית. אם במסגרת ההמתנה למשל האלמנט זמין, הטסט ימשיך, אחרת הוא ייפול. (אתמקד עוד קצת במימוש של המתנה לאלמנט). ההמתנה כוללת כמה חלקים:

  • מתבצע request למציאת האלמנט
  • בדיקה האם האלמנט קיים
  • בדיקה האם האלמנט נראה ולא מוסתר ע״י אלמנט אחר
  • בדיקה שאין לאלמנט הגדרות CSS שמסתירות אותו (display:none למשל)
  • בדיקה האם האלמנט לא זז

לדעתי נעשתה פה עבודה לא קטנה מצד מפתחי הפריימוורק.

אציין, שאני לרגע לא שוכח שאפשר גם להגדיר המתנות גמישות ב-selenium, אבל כאמור במקרה של test cafe זה כבר מוגדר אוטומטית אחרי המון ניסיונות שהם עשו עם אלפי אתרים ויישומונים. לכן, מהצד שלנו לא נדרש כלום, מלבד להשתמש וליהנות מזה.

מהחוויה האישית זה אחד הצדדים הכי חזקים שקיימים בפריימוורקים מבוססי JS, וזה אחד הדברים המהנים!

הרצה במצב Live

ניתן להפעיל הרצה במצב זה ע״י שימוש ב-flags הבאים: live-- או L- .

במצב כזה הטסט ירוץ עד הסוף, אך הדפדפן לא ייסגר. בפלט של הטרמינל נראה את הפלט הבא:

ניתן לעשות שינויים בתוך הטסט ולאחר שמירת השינויים – הטסט ירוץ מחדש. יתרון בולט של מצב

זה – הרצה חוזרת מהירה מאחר והדפדפן לא נסגר.

צילומי מסך

הפריימוורק מגיע עם מתודות מובנות לצילום מסך. המתודה הבסיסית הינה: 

t.takeScreenshot()

בין האופציות: צילום מסך, צילום מסך מלא, צילום אלמנט. ישנה גם אפשרות מעניינת לבצע צילום מסך רק בעת שקרתה נפילה בטסט.

צילומי וידאו

ישנה תמיכה מובנית בהקלטת וידאו, ללא צורך בפתרון ע״י צד שלישי. על מנת לבצע הקלטת וידאו ניתן להוסיף flag פשוט בפקודת הרצה: video-- . זה הכול! ישנן הגדרות נוספות שניתן להגדיר והן מפורטות היטב בדוקומנטציה. כמו במקרה של צילומי מסך, גם פה ניתן לעשות צילום וידאו של הטסט רק בעת שקרתה נפילה בטסט, וזה מוביל לשאלה – איך הדבר מתבצע בפועל? הרי הטסט כבר רץ. מה שקורה בפועל, שברגע שמפעילים flag להקלטה בעת נפילת הטסט, כל הטסטים יוקלטו, אך רק ההקלטה של הטסט שנכשל תישמר.

חשוב לציין שעל מנת לבצע הקלטת וידאו של הטסטים נדרש להוריד dependency של FFmpeg, שזה codec סטנדרטי שנדרש גם בפריימוורקים אחרים לביצוע הקלטות וידאו. ניתן להוריד אותו ישירות דרך טרמינל של visual studio code, ע״י הרצת פקודה: 

npm install --save @ffmpeg-installer/ffmpeg 

מהתנסות קלה עם ההקלטות, שמתי לב שיש האטה של בערך 5% בזמן הריצה של הטסט.

הרצה במצב Debug

אופציה מאוד שימושית המאפשרת לדבג בקלות את הטסטים מבלי להשתמש בכלים של IDE. ישנן כמה אפשרויות להפעלת מצב דיבאג:

  • ע״י מתודה ()debug, ואז הטסט יעצור בעת הגעה למתודה הזו.
  • ע״י הפעלת flag דרך הטרמינל:  debug-mode-במצב זה הטסט יעצור ברגע שהוא יגיע לפעולה ראשונה או ל-assert הראשון בטסט.
  • ע״י הפעלת flag למעבר לדיבאג בעת נפילת הטסט: debug-on-fail--.

 

בעת מעבר למצב של דיבוג, יופיע סרגל כלים בתחתית העמוד של הדפדפן עם כמה פקודות בסיסיות:

מהחוויה שלי, זו אופציה מאוד נוחה ושימושית. כמובן שאפשר גם לדבג דרך ה-IDE, אבל אם יש משהו מובנה ונוח – מבורך!

הרצה מרוחקת על מחשב אחר

הרצה מרוחקת מאפשרת להריץ את הטסטים על גבי מחשב אחר. לא נדרשת התקנה של test cafe על גבי המחשב המרוחק. יש צורך שהמחשב יהיה מחובר לאותה רשת כמו המחשב שממנו מריצים את הפקודה בפועל. נריץ את הפקודה הבאה: 

testcafe remote test.js

הפקודה תוציא פלט בטרמינל של URL שאותו יש להעתיק למחשב עליו רוצים להריץ את הטסטים בצורה מרוחקת ואז המחשב המרוחק יתחיל להריץ את הטסטים.

הרצה מרוחקת על מכשיר סלולרי

אותו עיקרון כמו במקרה של הרצה על מחשב מרוחק. ישנה תמיכה ב-safari mobile וגם ב-chrome mobile.

במקרה של סלולר הכול עוד יותר פשוט – מריצים פקודה:

 testcafe remote test.js –qr-code 

הפקודה תוציא את הפלט הבא בטרמינל:

סורקים דרך יישומון במכשיר הסלולרי והכל מתחיל לרוץ! ניתן לראות בטרמינל שאכן נוצר חיבור עם המכשיר הסלולרי:

מחוויה שלי זוהי אפשרות מאוד נוחה וקלה להריץ טסטים על אתרים רספונסיביים, עם אותו קוד בכמה לחיצות.

דוחות

תוספת דוחות מובנה

הפריימוורק מגיע עם תוסף דוחות מובנה שנקרא spec. הוא מאוד פשוט מצד אחד, אך מאוד אינפורמטיבי. הדוח מודפס לטרמינל של סביבת פיתוח וכולל מידע על הטסט (איזה דפדפן, איזו מערכת, איזה טסט רץ). במקרה של נפילה - הדוח מראה בצורה מאוד ברורה את מיקום הנפילה בקוד ואת השגיאה:

 

TestCafe HTML Report

 תוסף דוחות מאוד פופולרי שנכתב במיוחד לפריימוורק. ניתן להתקין אותו כ dependency-דרך פקודה פשוטה:

npm install testcafe-html-reporter.


על מנת להוסיף את הדוח לריצה של הטסט יש להוסיף flag פשוט.

--reporter html


הדוח הסופי יראה ככה:


כפי שניתן לראות, הדוח מציג בצורה פשוטה ומובנת את התוצאות של הטסטים. במידה ויש נפילה, הדוח מראה את הטסט שבו קרתה הנפילה, את מקור השגיאה מהקוד ובנוסף גם עושה צילום מסך בזמן הנפילה.

Xunit Reporter

 תוסף דוחות נוסף שמציג דוח של ריצה בפורמט  .XML

מאוד שימושי כאשר מריצים את האוטומציה באיזו שהיא סביבת .CI כמו כן על בסיס תצורת XML אפשר לייצר מגוון דוחות גרפיים אישיים.
ההתקנה של התוסף מתבצעת ע"י פקודה:

npm install testcafe-reporter-xunit


הדוח הסופי מראה גם את הטסטים שעברו וגם כאלו שנכשלו:

   LLURE

 תוסף מאוד מוכר על בסיס פריימוורק ,ALLURE המאפשר יצירת דוחות על בסיס פרמטרים מרובים. ניתן לחלק את את הטסטים בדוח ע"פ קבוצות, חומרת הטסטים וכו'. כאמור לדוח יש המון הגדרות ואופציות וניתן למצוא מידע נוסף בדוקומנטציה הרשמית.
ניתן להתקין את התוסף ע"י פקודה הבאה

npm install testcafe-reporter-allure

הדוח יראה בצורה כזו:

זה היו מספר דוגמאות על דוחות שניתן לצרף לריצה האוטומטית של הפריימוורק. מידע נוסף ניתן למצוא בדוקומנטציה הרשמית.

יתרונות

  • התקנה פשוטה בשורה אחת, ללא צורך בדרייברים.
  • תומך בכל הדפדפנים.
  • מגיע עם RUNNER מובנה.
  • מגיע עם ספרייה מובנית של ASSERTIONS.
  • מגיע עם מספר דוחות מובנים.
  • מנגנון המתנה אוטומטי לאלמנטים, טעינת העמוד, assertions וכו'.
  • תמיכה מובנית בצילומי מסך והקלטות וידאו.
  • תמיכה בריצה מרוחקת, כולל על טלפונים ניידים, וכל זה בפקודה אחת.
  • סינטקס פשוט עם עקומת למידה מאוד מהירה.
  • שחרור גרסאות מהיר. למשל גרסת 13.0 שוחררה בתאריך 22.03.2021, גרסת 1.14.0 שוחררה בתאריך 07.04.2021

חסרונות

כמובן שזה פריימוורק לא מושלם ולא נטול חסרונות. בין הבולטים שבהם:

  • אין תמיכה מובנית בסלקטורים של xpath, כמו נגיד במקרה של playwright.
  • קהילה קטנה יחסית לקהילות של פריימוורקים אחרים. למרות שהקהילה של test cafe הולכת וגדלה לצד הפופולריות של פריימוורק, אך זה עדיין לא מגיע אפילו קרוב למספרים של puppeteer למשל.
  • בעיות שלא תמיד נותנים להן פתרון מהיר. המשך ישיר של הסעיף הקודם. יש לא מעט תגובות ברשת שלפעמים חווים בעיות שלוקח לקהילה של test cafe לפתור אותן. הנתון הזה משתפר לאור הקהילה שהולכת וגדלה.
  • אי תמיכה בשפות מלבד JavaScript TypeScript, CoffeeScript, כמו למשל במקרה של playwright שתומך גם בשפות אחרות כמו למשל Java.

 

 סיכום

חווית העבודה שלי עם הפריימוורק הייתה מדהימה. הוא קל ללמידה, נוח מאוד בשימוש ומביא הרבה פתרונות טובים. אני כמובן לא בא להגיד שהוא הכי טוב ונטול בעיות, כפי שניתן לראות במאמר, ישנם פריימוורקים יותר פופולריים (כמו למשל puppeteer), ויש לא מעט חסרונות ל-test cafe עצמו. כמובן שאין לשכוח את selenium הוותיק עם קהילה ענקית ומענה על כמעט כל שאלה אפשרית שיכולה להיווצר. אך יחד עם זאת, מדובר בפריימוורק שכן כדאי לשים לב אליו וקצת להתנסות בו ולגלות את הצדדים החיוביים של הפריימוורק.

אציין שבכוונה לא נכנסתי לקטעי קוד לעומק מאחר ומטרת המאמר היא להעביר טעימה מהחוויה בפריימוורק ולא מדובר ב-tutorial. קטעי קוד והרחבה בנושאים שונים ניתן למצוא בדוקומנטציה הרשמית שכאמור היא מעולה!

 

מקורות נוספים:

כתבה על איך עובד Test Café: אתר Dzone

האתר הרשמי של Test Cafe: אתר

עמוד של getting started: כאן

מנגנון המתנה: מקור

 

[1] https://docs.github.com/en/github/managing-your-work-on-github/about-issues

[2] https://opensource.stackexchange.com

[3] https://www.npmtrends.com/cypress-vs-puppeteer-vs-testcafe-vs-playwright

[4] https://dz2cdn1.dzone.com/storage/temp/6724595-what-hammerhead-does.png