import { test, expect, Page } from '@playwright/test'; import { strictEqual } from 'assert'; let page: Page; let isLoginSuccessful = false; test.beforeAll(async ({ browser }) => { page = await browser.newPage(); }); test.afterAll(async () => { if (page !== undefined) { await page.close(); } }); async function login(page) { try { // Login await page.goto('http://192.168.1.62:20101/'); await expect(page).toHaveTitle(/^Sign in to /); await page.fill("input[name='username']", 'admin'); await page.fill("input[name='password']", '1234'); await page.click('id=kc-login'); await page.waitForTimeout(2000); // await page.click('id=acceptBtn'); // เข้าสู่เมนูลูกค้า await page.click('id=menu.manage'); await page.waitForSelector('id=sub-menu-customer'); await page.click('id=sub-menu-customer'); await page.waitForTimeout(2000); await page.click('id=row-table-cm38dee6s000dip2c6vye04bw'); await page.click('id=btn-add'); await page.waitForTimeout(2000); isLoginSuccessful = true; console.log('Login สำเร็จ'); } catch (error) { console.error('เกิดข้อผิดพลาดในการ Login', error); isLoginSuccessful = false; } } test('Login', async () => { await login(page); }); test('ทดสอบการเพิ่มสาขาในนายจ้างนิติบุคคล', async () => { if (!isLoginSuccessful) { await login(page); } try { // ส่วนเกี่ยวกับ await page.fill( 'id=input-register-name', 'บริษัท พีคเวิลด์ คอนซัลติ้ง จำกัด', ); await page.fill( 'id=input-register-name-en', 'Peak World Consulting Co., Ltd.', ); await page.fill('id=input-legal-person-no', 'ธนกฤต ศรีประเสริฐ'); await page.fill('id=input-legal-person-code', '2202264280648'); //จดทะเบียนเมื่อ await page.click('id=dialog-input-register-date'); await page.waitForSelector( "(//button[@class='dp__btn dp__month_year_select'])[2]", ); await page.click("(//button[@class='dp__btn dp__month_year_select'])[2]"); await page.waitForSelector("//div[text()='2020']"); await page.click("//div[text()='2020']"); await page.waitForSelector( "(//button[@class='dp__btn dp__month_year_select'])[1]", ); await page.click("(//button[@class='dp__btn dp__month_year_select'])[1]"); await page.waitForSelector("//div[text()='ส.ค.']"); await page.click("//div[text()='ส.ค.']"); await page.waitForSelector("//div[@id='2020-08-06']/div[1]"); await page.click("//div[@id='2020-08-06']/div[1]"); await page.fill('id=input-authorized-capital', '10000000'); await page.fill('id=input-telephone-no', '022066060'); // ส่วนข้อมูลธุรกิจ await page.click('id=employer-branch-select-business-type'); await page.waitForSelector('id=employer-branch-select-business-type_3'); await page.click('id=employer-branch-select-business-type_3'); await page.click('id=employer-branch-select-job-position'); await page.waitForSelector('id=employer-branch-select-job-position_0'); await page.click('id=employer-branch-select-job-position_0'); await page.fill( 'id=employer-branch-input-job-description', 'รายละเอียดงาน', ); await page.fill( "(//input[@id='employer-branch-input-pay-rate'])[1]", 'วันที่จ่ายเงินเดือน', ); await page.fill( "(//input[@id='employer-branch-input-pay-rate'])[2]", 'Pay day', ); await page.fill( "(//input[@id='employer-branch-input-pay-rate'])[3]", '550', ); // ส่วนผู้มีอำนาจลงนาม await page.fill( "(//input[@id='employer-branch-input-contact-name'])[1]", 'ธนกฤต ศรีประเสริฐ', ); await page.fill( "(//input[@id='employer-branch-input-contact-name'])[2]", 'Thanakrit Sriprasert', ); // ส่วนที่อยู่นายจ้าง await page.fill( "(//input[@id='employer-branch-input-address'])[1]", '20264282028', ); await page.fill( 'id=employer-branch-input-address-no', '99/12 อาคารซัมเมอร์ฮับ ชั้น 8', ); await page.fill( "(//input[@id='employer-branch-input-soi'])[1]", 'สุขุมวิท 23', ); await page.fill( "(//input[@id='employer-branch-input-street'])[1]", 'สุขุมวิท', ); await page.click('id=employer-branch-select-province'); await page.waitForSelector('id=employer-branch-select-province_0'); await page.click('id=employer-branch-select-province_0'); // คลิก dropdown เพื่อเปิด await page.click('id=employer-branch-select-district'); // กำหนดตัวเลือกที่ต้องการ const targetOptionId = 'id=employer-branch-select-district_13'; // id ของตัวเลือกที่ต้องการ let isVisible = false; const maxScrollAttempts = 10; // จำนวนครั้งสูงสุดในการเลื่อน let attempt = 0; while (!isVisible && attempt < maxScrollAttempts) { // ตรวจสอบว่า dropdown แสดงหรือไม่ const dropdown = page.locator('#employer-branch-select-district_lb'); if ((await dropdown.count()) === 0) { console.error('ไม่พบ dropdown ที่ต้องการ'); break; } // ใช้ page.locator() เลื่อน dropdown ลงไป await dropdown.evaluate((element) => { element.scrollTop += 150; // เลื่อนลง 150px }); // รอให้เลื่อนเสร็จ await page.waitForTimeout(100); // รอ 0.1 วินาทีเพื่อให้การเลื่อนเสร็จสิ้น // ตรวจสอบว่าตัวเลือกแสดงอยู่ใน viewport หรือไม่ isVisible = await page.locator(targetOptionId).isVisible(); attempt++; } // หากตัวเลือกที่ต้องการอยู่ใน viewport ให้คลิก if (isVisible) { const targetOption = page.locator(targetOptionId); await targetOption.click(); } else { console.error('ไม่พบตัวเลือกที่ต้องการ'); } await page.click('id=employer-branch-select-sub-district'); await page.waitForSelector('id=employer-branch-select-sub-district_0'); await page.click('id=employer-branch-select-sub-district_0'); await page.fill( 'id=employer-branch-input-address-en', '99/12 Summer Hub Building, 8th Floor', ); await page.fill( "(//input[@id='employer-branch-input-soi'])[2]", 'Sukhumvit 23', ); await page.fill( "(//input[@id='employer-branch-input-street'])[2]", 'Sukhumvit', ); // ส่วนข้อมูลติดต่อ await page.fill('id=dialog-input-contact-name', 'ธนกฤต ศรีประเสริฐ'); await page.fill('id=dialog-input-mail', 'peakworld@support.com'); await page.fill("(//input[@id='dialog-input-telephone'])[1]", '0864462828'); await page.fill("(//input[@id='dialog-input-telephone'])[2]", '022066060'); // การเลือก Dropdown โดยการวนลูป เพราะว่าหลังจากคลิก Dropdown ครั้งแรกแล้วข้อมูลที่ให้เลือกใน Dropdown ไม่แสดง // กำหนดการคลิก dropdown หลายครั้งเพราะคลิกครั้งแรกแล้วไม่เจอ let dropdownVisible = false; const maxAttempts = 5; // จำนวนครั้งสูงสุดในการคลิก dropdown let attemptCount = 0; while (!dropdownVisible && attemptCount < maxAttempts) { // คลิกเปิด dropdown await page.click('id=quotation-branch'); // ตรวจสอบว่าตัวเลือกภายใน dropdown ถูกแสดงแล้วหรือยัง try { await page.waitForSelector('id=quotation-branch_0', { state: 'visible', timeout: 1000, // รอ 1 วินาทีในแต่ละรอบ }); dropdownVisible = true; // ถ้าตัวเลือกถูกแสดงแล้ว เปลี่ยนสถานะเป็น true } catch (error) { console.warn( `ไม่เจอ dropdown ในรอบที่ ${attemptCount + 1}, ลองใหม่อีกครั้ง`, ); } attemptCount++; } if (dropdownVisible) { // เมื่อ dropdown แสดงผลแล้ว คลิกตัวเลือกที่ต้องการ await page.click('id=quotation-branch_0'); } else { console.error('ไม่สามารถแสดง dropdown ได้หลังจากพยายามหลายครั้ง'); } await page.waitForSelector("//button[@type='submit']"); await page.click("//button[@type='submit']"); await page.waitForTimeout(2000); await page.waitForSelector('id=btn-form-close'); await page.click('id=btn-form-close'); await page.waitForTimeout(2000); const subBranchCheck = await page.locator( "//tr[contains(.,'บริษัท พีคเวิลด์ คอนซัลติ้ง จำกัด') and contains (.,'0')]", ); await expect(subBranchCheck).toContainText( 'บริษัท พีคเวิลด์ คอนซัลติ้ง จำกัด', ); await expect(subBranchCheck).toContainText('0'); console.log('ระบบทำการสร้างสาขาในนายจ้างนิติบุคคลแล้ว'); } catch (error) { console.error('เกิดข้อผิดพลาดในการทดสอบ', error); isLoginSuccessful = false; throw error; } await page.waitForTimeout(2000); }); test('ทดสอบการสร้างลูกจ้างภายในนายจ้างนิติบุคคลในกรณีที่ใช้ที่อยู่ของนายจ้าง', async () => { if (!isLoginSuccessful) { await login(page); } try { await page.waitForSelector( "(//button[@id='btn-show-employee-บริษัท เอเชียเทค ซิสเต็มส์ จำกัด '])[2]", ); await page.click( "(//button[@id='btn-show-employee-บริษัท เอเชียเทค ซิสเต็มส์ จำกัด '])[2]", ); await page.waitForSelector( 'id=บริษัท พีคเวิลด์ คอนซัลติ้ง จำกัด-btn-add-employee', ); await page.click('id=บริษัท พีคเวิลด์ คอนซัลติ้ง จำกัด-btn-add-employee'); // ส่วนข้อมูลพื้นฐาน await page.fill('id=form-employee-input-nrc-no', '2202282262260'); // ส่วนข้อมูลส่วนตัว await page.click('id=form-employee-select-prefix-name'); await page.waitForSelector('id=form-employee-select-prefix-name_0'); await page.click('id=form-employee-select-prefix-name_0'); await page.fill( "(//input[@id='form-employee-input-first-name'])[1]", 'ณัฐวุฒิ', ); await page.fill('id=form-employee-input-last-name', 'วงศ์เจริญ'); await page.fill('id=form-employee-input-first-name-en', 'Nattawut'); await page.fill('id=form-employee-input-last-name-en', 'Wongcharoen'); //วันเกิด await page.click('id=form-employee-input-birth-date'); await page.waitForSelector( "(//button[@class='dp__btn dp__month_year_select'])[2]", ); await page.click("(//button[@class='dp__btn dp__month_year_select'])[2]"); await page.waitForSelector("//div[text()='1990']"); await page.click("//div[text()='1990']"); await page.waitForSelector( "(//button[@class='dp__btn dp__month_year_select'])[1]", ); await page.click("(//button[@class='dp__btn dp__month_year_select'])[1]"); await page.waitForSelector("//div[text()='พ.ค.']"); await page.click("//div[text()='พ.ค.']"); await page.waitForSelector("//div[@id='1990-05-10']/div[1]"); await page.click("//div[@id='1990-05-10']/div[1]"); await page.click('id=form-employee-select-nationality'); await page.waitForSelector('id=form-employee-select-nationality_4'); await page.click('id=form-employee-select-nationality_4'); await page.waitForSelector('id=btn-info-basic-save'); await page.click('id=btn-info-basic-save'); await page.waitForTimeout(2000); await page.waitForSelector('id=btn-form-close'); await page.click('id=btn-form-close'); await page.waitForTimeout(2000); const employeeCheck = await page.locator( "(//tr[@id='row-table-Nattawut'])[2]", ); console.log('แสดงข้อความ :', employeeCheck); await expect(employeeCheck).toHaveText( '1Nattawut Wongcharoen ณัฐวุฒิ วงศ์เจริญ34 ปี 6 เดือน 15 วัน เวียดนาม---- ', ); console.log('ระบบสามารถสร้างลูกจ้างได้'); } catch (error) { console.error('เกิดข้อผิดพลาดในการทดสอบ', error); isLoginSuccessful = false; throw error; } await page.waitForTimeout(2000); }); test('ทดสอบการสร้างลูกจ้างภายในนายจ้างนิติบุคคลในกรณีที่ใช้ที่อยู่แบบกำหนดเอง', async () => { if (!isLoginSuccessful) { await login(page); } try { await page.waitForSelector( 'id=บริษัท พีคเวิลด์ คอนซัลติ้ง จำกัด-btn-add-employee', ); await page.click('id=บริษัท พีคเวิลด์ คอนซัลติ้ง จำกัด-btn-add-employee'); // ส่วนข้อมูลพื้นฐาน await page.fill('id=form-employee-input-nrc-no', '2202282262262'); // ส่วนข้อมูลส่วนตัว await page.click('id=form-employee-select-prefix-name'); await page.waitForSelector('id=form-employee-select-prefix-name_1'); await page.click('id=form-employee-select-prefix-name_1'); await page.fill( "(//input[@id='form-employee-input-first-name'])[1]", 'พิชชา', ); await page.fill('id=form-employee-input-last-name', 'สุวรรณภา'); await page.fill('id=form-employee-input-first-name-en', 'Pitcha'); await page.fill('id=form-employee-input-last-name-en', 'Suwannapha'); //วันเกิด await page.click('id=form-employee-input-birth-date'); await page.waitForSelector( "(//button[@class='dp__btn dp__month_year_select'])[2]", ); await page.click("(//button[@class='dp__btn dp__month_year_select'])[2]"); await page.waitForSelector("//div[text()='1999']"); await page.click("//div[text()='1999']"); await page.waitForSelector( "(//button[@class='dp__btn dp__month_year_select'])[1]", ); await page.click("(//button[@class='dp__btn dp__month_year_select'])[1]"); await page.waitForSelector("//div[text()='ธ.ค.']"); await page.click("//div[text()='ธ.ค.']"); await page.waitForSelector("//div[@id='1999-12-06']/div[1]"); await page.click("//div[@id='1999-12-06']/div[1]"); await page.click('id=form-employee-select-nationality'); await page.waitForSelector('id=form-employee-select-nationality_6'); await page.click('id=form-employee-select-nationality_6'); // ส่วนข้อมูลที่อยู่ await page.waitForSelector('id=form-employee-custom'); await page.click('id=form-employee-custom'); await page.fill( 'id=form-employee-input-address-no', '88/14 หมู่บ้านลักขณา', ); await page.fill("(//input[@id='form-employee-input-moo'])[1]", '7'); await page.fill("(//input[@id='form-employee-input-soi'])[1]", 'เจริญสุข'); await page.fill( "(//input[@id='form-employee-input-street'])[1]", 'ร้อยเอ็ด-กาฬสินธุ์', ); await page.click('id=form-employee-select-province'); // กำหนดตัวเลือกที่ต้องการ const targetOptionId = 'id=form-employee-select-province_23'; // id ของตัวเลือกที่ต้องการ let isVisible = false; const maxScrollAttempts = 10; // จำนวนครั้งสูงสุดในการเลื่อน let attempt = 0; while (!isVisible && attempt < maxScrollAttempts) { // ตรวจสอบว่า dropdown แสดงหรือไม่ const dropdown = page.locator('#form-employee-select-province_lb'); if ((await dropdown.count()) === 0) { console.error('ไม่พบ dropdown ที่ต้องการ'); break; } // ใช้ page.locator() เลื่อน dropdown ลงไป await dropdown.evaluate((element) => { element.scrollTop += 150; // เลื่อนลง 150px }); // รอให้เลื่อนเสร็จ await page.waitForTimeout(100); // รอ 0.1 วินาทีเพื่อให้การเลื่อนเสร็จสิ้น // ตรวจสอบว่าตัวเลือกแสดงอยู่ใน viewport หรือไม่ isVisible = await page.locator(targetOptionId).isVisible(); attempt++; } // หากตัวเลือกที่ต้องการอยู่ใน viewport ให้คลิก if (isVisible) { const targetOption = page.locator(targetOptionId); await targetOption.click(); } else { console.error('ไม่พบตัวเลือกที่ต้องการ'); } await page.click('id=form-employee-select-district'); await page.waitForSelector('id=form-employee-select-district_9'); await page.click('id=form-employee-select-district_9'); await page.click('id=form-employee-select-sub-district'); await page.waitForSelector('id=form-employee-select-sub-district_11'); await page.click('id=form-employee-select-sub-district_11'); await page.fill( 'id=form-employee-input-address-en', '88/14 Lakkana Village', ); await page.fill("(//input[@id='form-employee-input-moo'])[2]", '7'); await page.fill( "(//input[@id='form-employee-input-soi'])[2]", 'Charoen Suk', ); await page.fill( "(//input[@id='form-employee-input-street'])[2]", 'Roi Et-Kalasin', ); // บันทึกการสร้างลูกจ้าง await page.waitForSelector('id=btn-info-basic-save'); await page.click('id=btn-info-basic-save'); await page.waitForTimeout(2000); await page.waitForSelector('id=btn-form-close'); await page.click('id=btn-form-close'); await page.waitForTimeout(2000); const employeeCheck = await page.locator( "(//tr[@id='row-table-Pitcha'])[2]", ); console.log('แสดงข้อความ :', employeeCheck); await expect(employeeCheck).toHaveText( '2Pitcha Suwannapha พิชชา สุวรรณภา24 ปี 11 เดือน 18 วัน จีน---- ', ); console.log('ระบบสามารถสร้างลูกจ้างได้'); } catch (error) { console.error('เกิดข้อผิดพลาดในการทดสอบ', error); isLoginSuccessful = false; throw error; } await page.waitForTimeout(2000); });