Вы можете переписать ClientFunction следующим образом:
const query = ClientFunction(() => {
const results = [];
const allLinks = document.querySelectorAll('a');
allLinks.forEach(link => results.push(link));
const foundElement = results.find(el => el.textContent === "Filter DOM Nodes");
return foundElement;
});
Но тогда вы получите еще одну ошибку:
ClientFunction cannot return DOM elements. Use Selector functions for this purpose.
Код внутри ClientFunction выполняется в браузере.
Код, который вызывает эту ClientFunction и получает ее результат, выполняется в процессе NodeJS вне браузера.
То, что вы пытаетесь достичь, называется объектом Marshalling. Вы пытаетесь перенести объект DOM, который находится в процессе браузера, в другой отдельный процесс. Это может быть достигнуто только через сериализацию, но объекты DOM не сериализуемы.
Оператор return внутри ClientFunction должен возвращать POJO (простой старый объект Javascript).
Вы можете достичь того же, используя объект Selector, подобный этому:
const nextButton = Selector('span')
.find('a')
.withAttribute('title', 'NEXT')
.withText('NEXT');
await t.click(nextButton);
Если вам нужна специальная фильтрация, кроме атрибутов и textContent, вы можете написать селектор следующим образом:
const nextButton = Selector('span')
.find('a')
.filter((link) => {
if (/* some condition processed on link element */) {
// this link element is the one to be clicked
return true;
}
return false;
});