You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Puppeteer修改希尔顿网站Maximum Price输入框失败求助

问题:无法修改希尔顿官网筛选器中的Maximum Price输入框内容

在希尔顿官网搜索结果页中,点击All Filters按钮打开筛选界面后,无法修改Maximum Price对应的文本输入框内容。尝试了三种操作方法,执行无报错但输入框内容始终未改变,使用环境为Node.js。

输入框界面截图

解决方案

这类问题大多是因为直接修改input.value或简单输入操作,没有触发前端框架(如React/Vue)依赖的输入事件,导致页面未感知到值的变化,筛选逻辑也无法生效。可以尝试以下几种有效方法:

方法1:手动触发输入/变更事件

修改输入框值后,主动触发input和change事件,让前端框架识别到值的更新:

const inputSelector = 'input[id="maxPrice"]';
await page.evaluate((selector) => {
  const input = document.querySelector(selector);
  input.value = '123';
  // 触发输入事件
  input.dispatchEvent(new Event('input', { bubbles: true }));
  // 触发变更事件
  input.dispatchEvent(new Event('change', { bubbles: true }));
}, inputSelector);

方法2:模拟真实用户的完整输入流程

通过快捷键选中原有内容后删除,再输入新值,完全模拟用户操作路径:

const inputSelector = 'input[id="maxPrice"]';
await page.focus(inputSelector);
// Ctrl+A 选中全部内容
await page.keyboard.down('Control');
await page.keyboard.press('A');
await page.keyboard.up('Control');
// 删除选中内容
await page.keyboard.press('Backspace');
// 输入新值,添加小延迟模拟真实输入
await page.keyboard.type('123', { delay: 100 });
// 可选:按回车确认变更
await page.keyboard.press('Enter');

方法3:确保输入框可交互后再操作

先等待输入框完全可见且可交互,再执行清空和输入操作:

const inputSelector = 'input[id="maxPrice"]';
// 等待输入框就绪
await page.waitForSelector(inputSelector, { visible: true, timeout: 5000 });
await page.focus(inputSelector);
// 选中并清空现有内容
await page.keyboard.press('End');
await page.keyboard.down('Shift');
await page.keyboard.press('Home');
await page.keyboard.up('Shift');
await page.keyboard.press('Backspace');
// 输入新值
await page.type(inputSelector, '123', { delay: 100 });

原尝试代码

完整初始代码

console.time('program'); // * Start the timer

const puppeteer = require('puppeteer-extra');
const constants = require('./hilton_constants.js');
const fs = require('fs/promises');

// * Main Function
let browser;
async function hiltonScan() {
  browser = await puppeteer.launch({
    // * select `false` if you want to run non-headless mode for testing
    headless: false
  });
  const [page] = await browser.pages();
  const ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36";
  await page.setUserAgent(ua);
  await page.setViewport({ width: 1065, height: 15000 });

  // Block resources
  await page.setRequestInterception(true);
  page.on('request', (request) => {
      if (request.resourceType() === 'image' || request.resourceType() === 'font' || request.resourceType() === 'media') {
        request.abort();
      } else {
        request.continue()
      }
  });

  await page.goto('https://www.hilton.com/en/', { waitUntil: "domcontentloaded" });

  // Fill in Where to
  await page.type('[class="form-input w-full"]', "Seattle, WA, USA");

  // Click calendar UI 
  await page.click('[data-testid="search-dates-button"]');
  await page.waitForSelector('[data-testid="calendar-container"]');

  await fill_stayDates(page, constants);

  // Fill in # Room, # Guest
  await page.click('[data-osc-product="search-rooms-button"]');
  await page.waitForSelector('[data-osc-product="search-rooms-button"]');

  //* Number of Rooms and Adults logic for Hilton
  if (constants.NUM_ROOMS != 1 && constants.NUM_ADULTS != 1) {
    if (constants.NUM_ROOMS == 1) {
      // Add Adults
      const add_adults_icon = await page.$$('[data-testid="rooms-room-1"] [aria-label="Add adult to room 1"]');
      for (let i = 1; i < constants.NUM_ADULTS; i++) {
        // Press the "+" button in Rooms
        await add_adults_icon[0].click();
      }
      await page.click('[class="stroke-text"]');
    } else {
      // Add Rooms
      const add_rooms_icon = await page.$$('[data-testid="rooms-add-room"]');
      for (let i = 1; i < constants.NUM_ROOMS; i++) {
        await add_rooms_icon[0].click();
      }
      const add_adults_icon = await page.$$('[data-testid="rooms-room-1"] [aria-label="Add adult to room 1"]');
      const adult_diff_addn = constants.NUM_ADULTS - constants.NUM_ROOMS + 1

      for (let i = 1; i < adult_diff_addn; i++) {
        // Press the "+" button in Rooms
        await add_adults_icon[0].click();
      }
      await page.click('[class="stroke-text"]');
    }
  }

  // Click Find a Hotel button
  await page.click('[data-testid="search-submit-button"]');

  await page.waitForNavigation({waitUntil: 'networkidle2'});

  // Click Filter button
  await page.click('#filters-button-with-icon');

  // Click Show available hotels only
  await page.click('#showAvailHotels');

  await page.waitForNavigation({waitUntil: 'networkidle2'});

  // !THIS IS NOT WORKING: Change maximum price
  const inputSelector = 'input[id="maxPrice"]';

  await page.focus(inputSelector);
  await page.$eval(inputSelector, input => {
        input.value = '';
        input.click();
  });

  await page.keyboard.type('123', {delay: 200});

  //* HELPER FX: click to the correct starting month
  async function fill_stayDates(page, constants){
    const findMonth = async targetMonth => {
      for (let i = 0; i < 12; i++) {
        const month = await page.$eval('[id^="calendar-month-"]', el => el.textContent);
        if (month.includes(targetMonth)) break;

        const arrows = await page.$$('[data-testid="calendar-container"] > [class="flex justify-between"] button:not([disabled])');
        await arrows[arrows.length - 1].click();
      }
    };

      const chooseDay = async day => {
        const dayResult = await page.$$eval('button[id*=day-] span:not([class*=sr-only])', elements => elements.map(element => element.textContent));
        const dayIndex = dayResult.indexOf(`${day}`)
        await page.$$('button[id*=day-] span:not([class*=sr-only])').then(el => el[dayIndex].click());
      };

      await findMonth(constants.START_MONTH);
      await chooseDay(constants.START_DAY);
      await findMonth(constants.END_MONTH);
      await chooseDay(constants.END_DAY);

      // Close pop-up
      await page.click('[class="stroke-text"]');
    };
  }


// * Call the main function
(async () => {
  console.log('Starting the Hilton scraper program...');
  await hiltonScan()
    .catch(err => console.error(err))
    // Close browser regardless of what Promise returns only if browser is not null or undefined (`?` keyword)
    .finally(() => browser?.close());

    console.timeEnd('program'); // * End the timer and output the execution time
})();

第二次尝试代码

// !THIS IS NOT WORKING: Change maximum price
  async function clearFocusedInput(page) {
    await page.keyboard.press('Home');
    await page.keyboard.down('Shift');
    await page.keyboard.press('End');
    await page.keyboard.up('Shift');
    await page.keyboard.press('Backspace');
  }
  // your test
  const inputSelector = 'input[id="maxPrice"]';
  
  await page.focus(inputSelector);
  await clearFocusedInput(page);
  await page.waitForSelector(inputSelector).then(input => input.type('222'));

第三次尝试代码

// !THIS IS NOT WORKING: Change maximum price
  const inputSelector = 'input[id="maxPrice"]';

  await page.focus(inputSelector);
  await page.$eval(inputSelector, input => {
        input.value = '';
        input.click();
  });

  await page.keyboard.type('123', {delay: 200});

内容的提问来源于stack exchange,提问作者Nelson Mak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 21:15:53