使用thirtyfour时,如何不提交表单触发onchange事件?
问题描述
我正在使用thirtyfour库编写Rust自动化代码,代码如下:
let transfer_balance = self .driver .find(By::XPath("//*[contains(@name, 'transfer_balance')]")) .await?; transfer_balance.send_keys(amount.to_string()).await?; transfer_balance.send_keys(Key::Return.to_string()).await?;
其中transfer_balance.send_keys(Key::Return.to_string()).await?;这段代码按下回车键后会直接提交表单,而非仅触发输入框的onchange事件。对应的Yew前端HTML代码如下:
<div class="container"> <form onsubmit={onsubmit} id="balance-transfer-from"> <div class="mb-3"> <label for="Destination Account" class="form-label">{"Destination Account Address:"}</label> <input name="destination_account" type="text" class="form-control" required={true} onchange={dest_account_onchanged}/> </div> <div class="mb-3"> <label for="Transfer Balance" class="form-label">{"Transfer Balance:"}</label> <input name="transfer_balance" type="text" class="form-control" required={true} onchange={transfer_balance_onchanged}/> </div> if let Some(_value) = *spinner { <button type="submit" disabled={true} id="tranfer-balance-submit">{"Submit"}</button> <Icon icon_id={IconId::FontAwesomeSolidSpinner} /> } else { <button type="submit" id="tranfer-balance-submit">{"Submit"}</button> } </form>
请问该如何解决此问题?
解决方法
方法1:手动触发onchange事件
放弃按回车的方式,通过JavaScript直接触发输入框的onchange事件,既能触发目标逻辑,又不会提交表单:
let transfer_balance = self .driver .find(By::XPath("//*[contains(@name, 'transfer_balance')]")) .await?; transfer_balance.send_keys(amount.to_string()).await?; // 执行JS代码触发change事件 self.driver.execute_script(r#" const element = arguments[0]; const event = new Event('change', { bubbles: true }); element.dispatchEvent(event); "#, vec![transfer_balance.into()]).await?;
方法2:移开输入框焦点触发onchange
输入完成后,点击页面空白区域让输入框失去焦点,同样会触发onchange事件:
let transfer_balance = self .driver .find(By::XPath("//*[contains(@name, 'transfer_balance')]")) .await?; transfer_balance.send_keys(amount.to_string()).await?; // 点击页面body区域,使输入框失去焦点 self.driver.find(By::Css("body")).await?.click().await?;
方法3:修改前端阻止回车提交(若有权限修改前端代码)
在表单上添加keydown事件处理,阻止回车的默认提交行为:
// 在Yew的表单组件中添加onkeydown回调 <form onsubmit={onsubmit} id="balance-transfer-from" onkeydown={Callback::from(|e: KeyboardEvent| { if e.key() == "Enter" { e.prevent_default(); } })}> // 原有表单内容... </form>
内容的提问来源于stack exchange,提问作者Amiya Behera
相关产品推荐
相关产品推荐

