Python Selenium取整计算异常、send_keys输入丢点及全选删除问题
Python Selenium 脚本三类问题修复方案
1. 数值计算精度异常修复
Python默认用二进制存储浮点数,本身存在固有精度损耗。原代码用round做四舍五入后再手动判断减0.1的逻辑,既没有严格实现「向下取整到1位小数」的需求,还极易触发浮点尾差,出现类似500.000000006的异常值。
直接用decimal模块做精确十进制计算,指定向下舍入规则即可彻底规避精度问题,代码如下:
from decimal import Decimal, ROUND_FLOOR import math # 方案1(推荐,无精度误差):精确实现向下取整保留1位小数 amount_value = float( Decimal(str(equity / price)).quantize(Decimal('0.1'), rounding=ROUND_FLOOR) ) # 方案2(轻量,绝大多数业务场景可用):整数放大取整规避浮点误差 # amount_value = math.floor(equity / price * 10) / 10 amount_leverage = amount_value * 5 print(amount_leverage)
上述逻辑不需要额外加判断修正舍入结果,从计算规则层面直接保证结果符合要求。
2. 输入时小数点丢失修复
小数点丢失的核心原因是直接向send_keys传入了浮点数类型的数值,部分网页输入框会绑定自定义键盘输入监听事件,非字符串类型的数值传入时,键值解析逻辑会跳过小数点这类非数字字符。
修复方法:传入输入内容前先转成字符串类型,同时输入前先点击输入框确保焦点落在输入区域,避免按键发送到其他页面元素。
3. 输入框清空逻辑优化
不需要连续发送多次退格,直接调用Selenium的组合键API实现全选删除即可,代码如下:
from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 先等待输入框可交互再操作,避免元素未加载完成就发送按键 wait = WebDriverWait(driver, 10) amount = wait.until(EC.element_to_be_clickable(amount_locator)) # 聚焦输入框 amount.click() # Ctrl+A全选现有内容(Mac系统适配可替换为Keys.COMMAND + 'a',绝大多数网页场景下Ctrl+A通用) amount.send_keys(Keys.CONTROL, 'a') # 按退格删除选中内容 amount.send_keys(Keys.BACK_SPACE)
如果页面输入框有复杂的输入校验、键盘事件拦截,发组合键清空不稳定,可以直接用JS强制清空输入框值,兼容性更强:
# JS直接重置输入框value,不受页面自定义事件影响 driver.execute_script("arguments[0].value = '';", amount)
修复后完整代码参考
from decimal import Decimal, ROUND_FLOOR from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 等待输入框可交互 wait = WebDriverWait(driver, 10) amount = wait.until(EC.element_to_be_clickable(amount_locator)) # 精确计算目标值 amount_value = float( Decimal(str(equity / price)).quantize(Decimal('0.1'), rounding=ROUND_FLOOR) ) amount_leverage = amount_value * 5 print(amount_leverage) # 清空输入框 amount.click() amount.send_keys(Keys.CONTROL, 'a') amount.send_keys(Keys.BACK_SPACE) # 传入字符串格式的结果,避免小数点丢失 amount.send_keys(str(amount_leverage))
内容的提问来源于stack exchange,提问作者Francesco Battisti
相关产品推荐
相关产品推荐

