๋๋๋ก Autify Nexus์์ ํ ์คํธ๋ฅผ ์๋ํํ ๋, ํ์ค ๋ ธ์ฝ๋ ์คํ ๋ง์ผ๋ก๋ ์ฝ๊ฒ ํด๊ฒฐํ ์ ์๋ ๋ฌธ์ ์ ์ง๋ฉดํ ์ ์์ต๋๋ค.
์์:
ํน์ ์ขํ์์ ํด๋ฆญ์ด ํ์ํ ์บ๋ฒ์ค ๊ธฐ๋ฐ UI
์ฌ์๋๊ฐ ํ์ํ ๋ถ์์ ํ ์์
์๋์ผ๋ก ๋๊ธฐ๊ฐ ๋ฐ์ํ์ง ์๋ ๋ด๋น๊ฒ์ด์
์ค์ํ ์์๋ฅผ ๊ฐ๋ฆฌ๋ ๊ด๊ณ ๋ ํ์
๋ ์ด์์์ ๋ฐ๋ผ ๋ทฐํฌํธ ํฌ๊ธฐ๋ฅผ ๋ง์ถฐ์ผ ํ๋ ์ ํ๋ฆฌ์ผ์ด์
๋ค์ ๋จ๊ณ๋ก ์งํํ๊ธฐ ์ ์ ํ์ด์ง๊ฐ ์์ ํ ๋ก๋๋์๋์ง ํ์ธ์ด ํ์ํ ๊ฒฝ์ฐ
์ด๋ฌํ ๋ฌธ์ ๋ Playwright ์ฝ๋ ์ค๋ํซ์ ์ฌ์ฉํ์ฌ ์ ๋ขฐ์ฑ ์๊ฒ ํด๊ฒฐํ ์ ์์ต๋๋ค.
์ค๋ํซ ์ฌ์ฉ ๋ฐฉ๋ฒ
ํ ์คํธ์ Playwright ์ฝ๋ ์คํ ์ ์ถ๊ฐํ ๋ค์, ํด๋น ์คํ ์ ์ฝ๋ ์ค๋ํซ์ ๋ณต์ฌ/๋ถ์ฌ๋ฃ๊ธฐ ํ์ธ์.
์ค๋ํซ์ ์๋ ๋ก์ผ์ดํฐ๋ ํ์ด์ง ์์ ์ค์ ๋์ ์์์ ๋ก์ผ์ดํฐ๋ ์
๋ ํฐ๋ก ๊ต์ฒดํ๋ ๊ฒ์ ์์ง ๋ง์ธ์.
JavaScript ์
๋ ํฐ, CSS ์
๋ ํฐ, ๋๋ Playwright ๋ก์ผ์ดํฐ ์ค ํธํ ๊ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ธ๋ผ์ฐ์ ๋ค๋ก/์์ผ๋ก ๋ด๋น๊ฒ์ด์
๋ด๋น๊ฒ์ด์ ์ด ํ์ํ ์๋๋ฆฌ์ค ์์น์ Playwright ์ฝ๋ ์คํ ์ ์ถ๊ฐํฉ๋๋ค.
๋ค๋ก ๊ฐ๊ธฐ:
await page.goBack()
์์ผ๋ก ๊ฐ๊ธฐ:
await page.goForward()
๋ทฐํฌํธ ํฌ๊ธฐ ๋ณ๊ฒฝ
์์๋ ๋ ๋๋ง์ ๋ง๊ฒ ํ์ด์ง ํฌ๊ธฐ๋ฅผ ํน์ ๋๋น์ ๋์ด๋ก ์กฐ์ ํฉ๋๋ค.
await page.setViewportSize({ width: 999, height: 999 });
์์ ๊ฐ์ ํด๋ฆญ
์์๊ฐ "์ด์์ ์ธ" ํด๋ฆญ ๊ฐ๋ฅํ ์ํ๊ฐ ์๋๋๋ผ๋(์: ๋ค๋ฅธ ์์์ ๊ฐ๋ ค์ ธ ์๋ ๊ฒฝ์ฐ), ๊ฐ์ ๋ก ํด๋ฆญ์ ์ํํฉ๋๋ค.
await page.click('#my-button', { force: true });
๋ฐฉํด ์์ ์ ๊ฑฐ (์: ๊ด๊ณ )
ํ ์คํธ ์์ ์ ๋ฐฉํด๊ฐ ๋ ์ ์๋ ๊ด๊ณ ๋ ํ๋กํ ๋ฐฐ๋๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
await page.evaluate(() => {
const ad = document.querySelector('.ads-banner');
if (ad) ad.remove();
});
๋ถ์์ ํ ๋ฒํผ์ ๋ํ ํด๋ฆญ ์ฌ์๋
์ผ๋ถ ๋ฒํผ์ ์ฒซ ์๋์์ ์์ ์ ์ผ๋ก ์๋ํ์ง ์์ ์ ์์ต๋๋ค. ์ด ์ฝ๋๋ ์คํจ ์ ํ ๋ฒ ๋ ์๋ํฉ๋๋ค.
try {
await page.click('#unstable-button');
} catch (e) {
console.warn('Retrying button click...');
await page.click('#unstable-button');
}
ํ์ด์ง ๋๋ ์์๊ฐ ์ค๋น๋ ๋๊น์ง ํ ์คํธ ๋ฐ ์๋ก๊ณ ์นจ
ํ์ด์ง๊ฐ ๊ฐ๋ ๋ถ์์ ํ ์ํ๋ก ๋ก๋๋๋ ๊ฒฝ์ฐ, ์๋ก๊ณ ์นจํ์ฌ ์ค๋น ์ํ๋ฅผ ํ์ธํฉ๋๋ค.
for (let i = 0; i < 5; i++) {
await page.reload();
if (await page.isVisible('#ready')) break;
console.log("Element/page is not ready!");
}
๋งํฌ ํด๋ฆญ ํ ๋ด๋น๊ฒ์ด์ ๋๊ธฐ
๋งํฌ ํด๋ฆญ์ผ๋ก ์ธํด ๋ด๋น๊ฒ์ด์ ์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ, ํ์ด์ง๊ฐ ์์ ํ ๋ก๋๋ ๋๊น์ง ๋ช ์์ ์ผ๋ก ๊ธฐ๋ค๋ฆฐ ํ ๋ค์ ๋จ๊ณ๋ก ์งํํ์ธ์.
await Promise.all([
page.waitForNavigation(),
page.click('a.next-page'),
]);