Попытка нажать кнопку формы, чтобы элемент стал видимым, включенным и стабильным

Я пытаюсь нажать кнопку «Отправить» с помощью Playwright, но не могу заставить это работать. У меня есть следующий HTML-код.

<table>
    <tr>
      <td id = "ct100" onscroll = "scollPosition(this);">
        <!-- some html form -->
         <input value = "Save" type = "submit" class = "btn" />
      </td>
      <td id = "ct101" onscroll = "scollPosition(this);">
         <input type = "text" id = "input_01" onchange = "updateValue();" />
         <!-- form input -->
      </td>
</table>

Код драматурга:

   async saveSetupPage(): Promise<void> {
      // If I try to click submit button before any filling up any input, click is working 

      await page.locator("#input_01").click();
      await page.locator("#input_01").fill("some value");
      // trying to fill 10-12 input with same above code

      // now trying to click on submit button
      await page.locator("//*[@id='ct100_btn']").click();
   }); 
      

Теперь у меня следующая ошибка:

 locator.click: Timeout 30000ms exceeded.

 Call log:
   - waiting for locator('//*[@id = "ct100_btn"]')
   -   locator resolved to <input value = "Save" type = "submit" class = "btn" id = "../>
   - attempting click action
   -   waiting for element to be visible, enable and stable
   -   scrolling into view if needed
   -   done scrolling
   -   <div class = "UpdateProgress">
Избегайте XPath . ct100_btn нет в вашем HTML. Попробуйте "#ct100 .btn". Но если исправление не помогло, поделитесь дополнительной информацией о странице, чтобы воспроизвести проблему. Это может быть оверлей, iframe, блок Cloudflare, произвольное поведение или время JS или некоторый дополнительный контекст, который необходимо предоставить для объяснения сбоя. См. минимальный воспроизводимый пример.
ggorlen 15.07.2024 20:24

Спасибо большое за помощь, моя проблема пока не решена. Судя по вашему предложению, похоже, проблема не в кнопке сохранения. Существует много js-кода, который может быть проблемой.

sabbir 16.07.2024 16:16
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
89
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

как @ggorlen сказал, что ваш локатор кажется неправильным ("//*[@id='ct100_btn']"), поскольку в вашем фрагменте HTML такого элемента нет. Вместо этого используйте более точный локатор, основанный на доступных атрибутах, таких как класс или значение. а также убедитесь, что драматург ждет, пока элементы станут видимыми, включенными и стабильными, прежде чем взаимодействовать с ними, например, для вашего Playwrite code

async saveSetupPage(): Promise<void> {
  await page.locator("#input_01").fill("some value");
  await page.waitForTimeout(1000); 
  await page.locator("input[type='submit'][value='Save']").click();
  await page.waitForNavigation(); 

}

waitForTimeout() не рекомендуется. Вы должны использовать его только для отладки. .click() имеет автоматическое ожидание, поэтому waitForTimeout() не требуется. waitForNavigation() устарел и заменен на waitForUrl(), но я не понимаю, с какой целью вы это предлагаете.
Klim Bim 16.07.2024 08:03

Спасибо за ваш отзыв! Я понимаю, что использование `waitForTimeout()` обычно не рекомендуется, но я чувствовал, что элементы формы приложения и их взаимодействия, такие как onscroll и onchange, могут вызвать дополнительную динамическую загрузку или обновление контента, а использование waitForTimeout() гарантирует, что все эти динамические изменения будут завершены раньше переходим к следующим действиям, поскольку это обеспечивает буферный период для обработки любых непредвиденных задержек при рендеринге или выполнении JavaScript. Еще раз спасибо за полезный совет, я прочитаю об этом больше и попробую в дальнейшем.

GifftyCode 16.07.2024 10:23

Спасибо большое за помощь, моя проблема пока не решена. Я пытаюсь это понять.

sabbir 16.07.2024 16:17

@GifftyCode waitForTImeout для этого использовать не следует. Используйте waitForFunction, waitForResponse или waitForSelector, чтобы дождаться конкретных изменений. В любом случае, ОП никогда не делился страницей, так откуда вы знаете, что есть динамические загрузки? waitForNavigation устарел и находится не в том месте, поэтому это вызывает состояние гонки, которое может привести к зависанию скрипта. Его необходимо установить до действия, вызывающего навигацию, а не после.

ggorlen 16.07.2024 16:49

@sabbir Подумайте о том, чтобы поделиться минимально воспроизводимым примером по запросу, чтобы людям не приходилось угадывать ваш вариант использования. Что именно еще не решено?

ggorlen 16.07.2024 16:52

Вот как вы можете решить проблему, нажав кнопку «Отправить» с помощью Playwright в вашем конкретном сценарии:

Проблема

Время действия действия locator.click истекает, поскольку Playwright не может найти кнопку отправки с указанным селектором (//*[@id='ct100_btn']). В предоставленном HTML-коде нет элемента с идентификатором ct100_btn.

Решение

Обновите селектор, чтобы правильно нацелить кнопку отправки на основе предоставленного вами HTML.

HTML

<table>
    <tr>
      <td id = "ct100" onscroll = "scollPosition(this);">
        <!-- some html form -->
         <input value = "Save" type = "submit" class = "btn" />
      </td>
      <td id = "ct101" onscroll = "scollPosition(this);">
         <input type = "text" id = "input_01" onchange = "updateValue();" />
         <!-- form input -->
      </td>
    </tr>
</table>

Кодекс драматурга

async saveSetupPage(): Promise<void> {
// Fill the input field
await page.locator("#input_01").fill("some value");

// Click the submit button
await page.locator('td#ct100 input[type = "submit"]').click();
}
Ответ принят как подходящий

У меня была аналогичная проблема раньше. Моя проблема заключалась в том, что когда я заполнял ввод, какой-то клиентский валидатор давал сбой, поэтому кнопка отправки была отключена.

Попробуйте проверить, не удалась ли какая-либо проверка на стороне сервера/клиента или нет, и кнопка отправки отключена или нет.

Надеюсь, это будет полезно.

Другие вопросы по теме