0


selenium自带send_keys发送长字符串很慢

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>

本文转载自: https://blog.csdn.net/denjor/article/details/124245913
版权归原作者 老白tester 所有, 如有侵权,请联系我们删除。

“selenium自带send_keys发送长字符串很慢”的评论:

还没有评论