1.自带send_keys输入1000个字符
# 自带send_keys发送1000个字符,耗时
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
search_input = driver.find_element(value="kw") # 百度输入框
start_time = time.time()
search_input.send_keys('在' * 1000) # 发送1000个字符串
end_time = time.time()
print(f'耗时:{end_time-start_time} 秒')
driver.quit()
耗时:1.4954700469970703 秒
2.修改send_keys输入1000个字符
用到pyperclip,先pip install pyperclip
import time
import pyperclip
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
search_input = driver.find_element(value="kw") # 百度输入框
start_time = time.time()
# search_input.send_keys('在' * 1000) # 发送1000个字符串
pyperclip.copy('在' * 1000) # 粘贴到剪切板
search_input.send_keys(Keys.CONTROL, 'v') # 发送ctrl+v 粘贴
end_time = time.time()
print(f'耗时:{end_time-start_time} 秒')
driver.quit()
耗时:0.15184330940246582 秒
对比自带send_keys,快了进10倍
3.分析
自带send_keys:模拟键盘一个一个字符串敲进去
pyperclip:通过复制粘贴的方式,明显提高效率
4.采用pyperclip复制粘贴的缺点
当用例在运行过程中,如果想复制其他代码或者文本、文件,会被pyperclip.copy的内容覆盖掉,导致粘贴的结果是【1000个“在”】
5.解决方法
封装send_keys,作为基类的方法供其他代码调用,虽然不能避免上述缺点,但强过每次想复制时都是得到的1000个在
class BasePage:
def __init__(self, driver):
self.driver = driver
self.pro_path = os.path.dirname(os.path.dirname(__file__))
# 输入value的操作
def send(self, element, value):
try:
self.driver.clear(element)
# 如果是字符串类型,且长度大于15,则复制粘贴;否则用自带的send_keys,可以发送文件
if type(value) == str and len(value) > 15:
pyperclip.copy(value) # 粘贴到剪切板
self.driver.find_ele(element).send_keys(Keys.CONTROL, 'v') # 发送ctrl+v 粘贴
else:
self.driver.find_ele(element).send_keys(value)
except Exception:
log.error(f'元素 {element} 输入 {value} 失败', exc_info=1)
raise
6.不用js传值的原因
网上可以搜到很多js传值的方法,一般用的是value赋值,碰到textarea(富文本),则失效,textarea没有value属性
driver.execute_script(f"arguments[0].value='{value}';", ele)
# 上面的方法其实就是给input标签的value属性赋值
<input aria-invalid="false" name="name.value" type="text" class="MuiInputBase-input" value="">
# 但textarea 标签中并没有value属性,所以赋值会失败
<textarea aria-invalid="false" name="description.value" rows="2" class="MuiInputBase-input"></textarea>
版权归原作者 老白tester 所有, 如有侵权,请联系我们删除。