Исправление 1: подождать, пока элемент не станет видимым
Просто ожидание селектора не будет работать, мы должны подождать, пока элемент будет правильно виден в окне просмотра и запросы навигации выполнены.
// wait until all requests are done
await page.goto(homeUrl, { waitUntil: "networkidle0" });
// wait until the email selector is visible on viewport
await page.waitForSelector(emailInputSel, { visible: true });
Просто добавив вышеуказанные изменения в ваш текущий код, я получил такой результат,
Обратите внимание, что на приведенном выше снимке экрана нет содержимого для отправки.Кнопка, то же самое происходит и с другими вашими селекторами.
Исправление 2: Передайте данные правильно
Это необязательно, если первое исправление ничего не меняет.
Шаг1
Вместо передачи двух аргументов передайте один аргумент с фигурными скобками.
await page.evaluate((sel, val) => {
const ele = document.querySelector(sel);
if (!ele) {
return;
}
ele.value = val;
}, (sel, val)); // <-- Look here
Шаг 2
Если вышеуказанный шаг 1 не работает, попробуйте вызвать изменение .Так что, если это угловое приложение, оно должно знать, что элемент изменился. Измените приведенное выше на это,
await page.evaluate((sel, val) => {
const ele = document.querySelector(sel);
if (!ele) {
return;
}
ele.value = val;
// Trigger the change here
var event = new Event('input', {
'bubbles': true,
'cancelable': true
});
ele.dispatchEvent(event);
}, (sel, val));
Необязательно
Если вы хотите использовать одну и ту же вещь несколько раз, выможно переписать их таким образом,
const fillInput = (sel, val) => {
await page.waitForSelector(sel, { visible: true });
await page.evaluate((sel, val)=>{}) // the code from above function should be here
}
, затем позвонить вот так:
await fillInput(emailInputSel, email)