Size: a a a

2019 December 30

VB

Vitalii Budniak in JS for testing
+
источник

OI

Oleksii Ihnatiuk in JS for testing
waitFor самописная штука, вы можете использовать любую ф-цию либы, которая ждет пока предиката будет true (например мы хотим ждать 10 секунд и чекать каждые пол секунды наше условие).
Вот так я получаю элемент в puppeteer
источник

OI

Oleksii Ihnatiuk in JS for testing
export const forceElement = async (page: Page, selector: string): Promise<ElementHandle> => {
 await waitFor(
   () => isElementFound(page, selector),
   `Element with selector: "${selector}" was not found`
 );
 await waitFor(
   () => isElementVisible(page, selector),
   `Element with selector: "${selector}" was not visible, but found`
 );
 return await page.$(selector);
};
источник

OI

Oleksii Ihnatiuk in JS for testing
нас интерисует два метода здесь: isElementFound() и isElementVisible()
источник

OI

Oleksii Ihnatiuk in JS for testing
const isElementFound = async (page: Page, selector: string): Promise<boolean> => {
 const element = await page.$(selector);
 return element !== null;
};
пупетир $ ищет элемент в ДОМе. Если его еще нет там, то остальные проверки бесмысленные
источник

OI

Oleksii Ihnatiuk in JS for testing
const isElementVisible = async (page: Page, selector: string): Promise<boolean> => {
 const element = await page.$(selector);
 const style = await page.evaluate((node) => window.getComputedStyle(node as unknown as Element), element);
 const hasVisible = await hasVisibleBoundingBox(element);
 return style && style.visibility !== 'hidden' && hasVisible;
};
эти части я подсмотрел внутри puppeteer
источник

OI

Oleksii Ihnatiuk in JS for testing
как вы видите есть еще одна функция hasVisibleBoundingBox()
источник

OI

Oleksii Ihnatiuk in JS for testing
const hasVisibleBoundingBox = async (element: ElementHandle): Promise<boolean> => {
 const rect = await element.boundingBox();
 return rect !== null;
};
источник

OI

Oleksii Ihnatiuk in JS for testing
хочу напомнить что вначале я беру инстанс страницы и строку с локатором
источник

OI

Oleksii Ihnatiuk in JS for testing
потом получается вот такое:
export const click = async (
 page: Page, selector: string, delay: number = clickDelay
): Promise<void> => {
 const element = await forceElement(page, selector);
 await element.click({ delay });
};
источник

OI

Oleksii Ihnatiuk in JS for testing
пока работает хорошо, потом может соберу либу какую-то с такими хелперами
источник

SC

Sergey Chepets in JS for testing
Oleksii Ihnatiuk
пока работает хорошо, потом может соберу либу какую-то с такими хелперами
Неплохо, ты смотрю тоже юзаешь условное ожидание предиката, а ведь про такие вещи хоть бы кто-то поделился на конфе. Я сам к такому решению пришел. Я еще сделал реализацию с ожиданием определенного значения. Полезно когда надо дождаться определенного объекта в базе или в кафке.
источник

SC

Sergey Chepets in JS for testing
👍
источник

BO

Boris Osipov in JS for testing
>ты смотрю тоже юзаешь условное ожидание предиката, а ведь про такие вещи хоть бы кто-то поделился на конфе.

просто этому подходу 100 лет) и я думаю рассказывали не раз в докладах\статьях
источник

SC

Sergey Chepets in JS for testing
Boris Osipov
>ты смотрю тоже юзаешь условное ожидание предиката, а ведь про такие вещи хоть бы кто-то поделился на конфе.

просто этому подходу 100 лет) и я думаю рассказывали не раз в докладах\статьях
я когда пару лет назад врывался в автоматизацию нигде такое не встречал. Хотя возможно что-то с предикатами было в селениде Java - оно и натолкнуло на реализацию ожидания определенного результата
источник

BO

Boris Osipov in JS for testing
ага. там точно. и Солнцев наверняка где-то рассказывал про это
источник

B

Bola in JS for testing
Но согласитесь, это решение лежит на поверхности
источник

VB

Vitalii Budniak in JS for testing
Oleksii Ihnatiuk
const isElementVisible = async (page: Page, selector: string): Promise<boolean> => {
 const element = await page.$(selector);
 const style = await page.evaluate((node) => window.getComputedStyle(node as unknown as Element), element);
 const hasVisible = await hasVisibleBoundingBox(element);
 return style && style.visibility !== 'hidden' && hasVisible;
};
эти части я подсмотрел внутри puppeteer
await page.$(selector); - похоже работать будет только если  CSS селектор
источник

OI

Oleksii Ihnatiuk in JS for testing
А мне подходит :)
источник

OI

Oleksii Ihnatiuk in JS for testing
Ни разу не пользовался xpath
источник