【问题标题】:puppeteer - how to submit formpuppeteer - 如何提交表单
【发布时间】:2018-02-21 19:13:00
【问题描述】:

如何提交表单? 我有一个简单的搜索栏和一个搜索按钮。下面输入搜索字符串,但不触发click事件。当 headless 设置为 false 并且我在 serachfield 中手动单击 enter 时,搜索正在工作。如何提交按钮?

  const puppeteer = require('puppeteer');

(async () => {
const browser = await puppeteer.launch({headless: false});
const page = await browser.newPage();
await page.goto('http://localhost:3000', {waitUntil: 'networkidle'});

await page.focus('#search');

// Type our query into the search bar
await page.type('michael');

// Submit form
await page.press('Enter');

await page.screenshot({path: './screenshots/search3.png'});

browser.close();
})();

我的搜索栏

search(e) {
 e.preventDefault();
this.props.onClick(this.props.value);}

render() {
return (<form className="form-inline" id="search-form" onSubmit
{this.search}>
  <div className="form-group">
    <input
      type="text"
      className="form-control"
      id="search"
      value={this.props.value}
      placeholder={this.props.placeHolder}
      onChange={this.props.onChange}
    />

    <button primary type="submit" >
      {this.props.buttonText}
    </button>
  </div>
</form>);
}

更新

这不起作用:

const searchForm = await page.$('#search-form'); 
await searchForm.evaluate(searchForm => searchForm.submit()); 

它执行回发并且表单中的文本被清除,即使它应该使用 preventDefault 触发该函数。

所以问题似乎是这行代码等待

searchForm.evaluate(searchForm => searchForm.submit());

这是有效的:

我把代码改成:

await page.click('#search-button'); 
await page.waitForNavigation(); 

【问题讨论】:

  • 如果问题还没有解决,截图是什么样子的。请考虑附上它。

标签: javascript node.js google-chrome-headless puppeteer


【解决方案1】:

我通过使用这个而不是提交表单来解决它:

await page.click('#search-button'); 
await page.waitForNavigation(); 

【讨论】:

  • 点击按钮时出现验证错误,如何返回上一页?
【解决方案2】:

您可以发送表单提交:
await page.click("button[type=submit]");

在这里找到:https://stackoverflow.com/a/46965168/8839237

【讨论】:

    【解决方案3】:

    假设您的搜索栏的 ID 为“搜索”,

    基本上你需要使用选择器表达式来获取你的搜索栏的句柄,然后使用evaluate函数你可以进行表单提交,

    您需要具备以下 sn-p 才能提交表单,

    const searchForm = await page.$('#search');
    await searchForm.evaluate(searchForm => searchForm.submit());
    

    希望对你有帮助

    【讨论】:

    • 现在表单被触发了,但是我的 onSubmit 函数没有被使用。我已将表单代码添加到问题中。提交表单后,搜索字符串消失,我的 url 变成了localhost:3000/?。手动执行时,searchString 存储在搜索字段中,并且 url 变为 localhost:3000/?searchString=michael
    • @Kristoffer 您尝试添加我的建议了吗?..(或)您的代码现在已经开始工作了?
    • 我添加了您的建议,现在 puppeteer 似乎可以运行(它不会中断),但我没有得到预期的输出。好像没有触发正确的 onSubmit 函数。
    • @Kristoffer 您能否删除您的onSubmit 处理程序并检查它是否按预期运行?
    • 没有我的 onSubmit 处理程序&lt;form className="form-inline" id="search-form"&gt; 它仍然会清空搜索输入框。如果我手动执行此操作,由于缺少 onSubmit 处理程序,我不会得到任何搜索结果。
    【解决方案4】:

    首先点击此链接

    puppeteer-how-to-submit-a-form

    您的问题

    当你按下回车键而不是截图时,这就是问题。

    // this code just await press event finished, but not form submitted finished,
    //in this way, you can not screenshot form submit finished status
    await page.press('Enter'); 
    await page.screenshot({path: './screenshots/search3.png'});
    // form submitting ...
    

    这就是您的代码不起作用的原因。

    希望能帮到你

    【讨论】:

    • 问题不是截图,而是提交表单。如果我禁用屏幕截图,它仍然没有正确提交表单。我尝试在没有 headless 的情况下运行它,所以我可以看到即使在屏幕截图之后表单也没有正确提交。
    猜你喜欢
    • 2018-01-28
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多