web自动化时,sendkeys输入长文本时浏览器响应慢或错误时处理

本文介绍了在自动化测试中遇到的长文本输入问题及其解决方案。详细分析了sendkeys方法的局限性,并提供了两种替代方案:使用JavaScript直接设置文本值和通过复制粘贴的方式快速输入长文本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在做某个测试时,要在文本框中输入大量的文本,文件内容如下:

 

"-----BEGIN CERTIFICATE-----\n
MIIBozCCAQwCAQEwDQYJKoZIhvcNAQEFBQAwGjEYMBYGA1UEAwwPY2EtaW50QGFj\n
\"bWUuY29tMB4XDTE2MDMwNzExNTcyOVoXDTI2MDMwNTExNTcyOVowGjEYMBYGA1UE\n“
\"AwwPc2VydmVyQGFjbWUuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+\n"
"RI+2JepsS1UuuLNne3sk/1nuLdXsDN/VH1+80tzfijSduFK3c+sg4NNwXsqV3D5Y\n"
"E1Ymi0/fvhRdo7J9yJJNq4ZM42nIgTM5jV9BW8JlE7UHZTUP3YomJcnTjfrsH2U5\n"
"rJPuxvwxJukrDDYqrrS/37Nhrr3UbMUBDETLFGg9BQIDAQABMA0GCSqGSIb3DQEB\n"
"BQUAA4GBACKvFUpVayVWgDGdwZpkr0EgXyifjO36a8IqTA55Bj4/5VLyUt+sCvNz\n"
"6Up64t+akAGPajrDv5IrmwDGYj88fE/vTd1lmCkt8Xi8ODgDhASQYh0lzEQ2nzyU\n"
"L7gyKtPvfZG5BZuf7whrV6y7klGDia9qL4dCmNUbOyRBeJON2DR5\n"
"-----END CERTIFICATE-----"

 

在FireFox中使用sendkeys输入时,等待很久后提示

此页面的某个脚本可能正忙,或者已停止响应。您可以立即终止该脚本、在调试器中打开该脚本,或者继续等待该脚本完成

 

在使用chrome sendkeys后,没有提示错误,但耗时很久。

解决思路:

1、查看问题原因:

看看sendkeys实现原理:

def send_keys(self, *value):
        """Simulates typing into the element.

        :Args:
            - value - A string for typing, or setting form fields.  For setting
            file inputs, this could be a local file path.

        Use this to send simple key events or to fill out form fields::

            form_textfield = driver.find_element_by_name('username')
            form_textfield.send_keys("admin")

        This can also be used to set file inputs.

        ::

            file_input = driver.find_element_by_name('profilePic')
            file_input.send_keys("path/to/profilepic.gif")
            # Generally it's better to wrap the file path in one of the methods
            # in os.path to return the actual path to support cross OS testing.
            # file_input.send_keys(os.path.abspath("path/to/profilepic.gif"))

        """
        # transfer file to another machine only if remote driver is used
        # the same behaviour as for java binding
        if self.parent._is_remote:
            local_file = self.parent.file_detector.is_local_file(*value)
            if local_file is not None:
                value = self._upload(local_file)

        self._execute(Command.SEND_KEYS_TO_ELEMENT, {'value': keys_to_typing(value)})
View Code

再看keys_to_typing 可以看出,sendkeys是一个字符一个字符发的,所以在长文本时时间肯定会长,且在firefox中好像还有相关超时限制,这个不得而知了。

既然这样的话,就不用senkeys 来输入文本了。

解决方案二个:

1、使用js来输入

示范代码

js='document.getElementsByTagName("textarea")[0].value="'+lb_cert+"'"
driver.execute_script(js)

因为元素没有id,所以只能用tagName

2、使用复制黏贴方式:

将文本写入粘贴板,然后再发送CTRL+v,快速输入,但需要安装第三方库

至于粘贴板后方法,python里太多库可以支持,这里偷懒,从stackoverflow 拿来一段代码直接使用

import win32clipboard  

def copy(text):
    win32clipboard.OpenClipboard()
    win32clipboard.EmptyClipboard()
    win32clipboard.SetClipboardText(text, win32clipboard.CF_UNICODETEXT)
    win32clipboard.CloseClipboard()
def paste():
    win32clipboard.OpenClipboard()
    data = win32clipboard.GetClipboardData(win32clipboard.CF_UNICODETEXT)
    win32clipboard.CloseClipboard()
    return data

text=u"这里写需要粘贴的文字"
copy(text)  --放入粘贴板
driver.findElements(By.tagname("textarea")).type(Keys.chord(keys.control, 'v')); ---粘贴

 

这里,可以根据实际使用不用的方法来实现

 

转载于:https://www.cnblogs.com/landhu/p/6110445.html

### Web自动化测试中处理弹窗的方法 在Web自动化测试领域,处理JavaScript生成的弹窗(如`alert`、`confirm`和`prompt`),以及基于HTML元素构建的自定义弹窗是非常重要的任务之一[^1]。 #### 使用Selenium处理标准JavaScript弹窗 对于标准的JavaScript弹窗,Selenium WebDriver提供了一套简洁而有效的接口来进行交互: - **接受警报对话框**:当遇到简单的提示确认对话框,可以调用`accept()`方法来模拟点击“确定”按钮的行为。 ```python from selenium import webdriver driver = webdriver.Chrome() alert = driver.switch_to.alert alert.accept() # 点击 "OK" ``` - **拒绝/关闭警告框**:如果需要模拟用户取消操作,则应使用`dismiss()`函数代替。 ```python alert.dismiss() # 点击 "Cancel" 者关闭窗口 ``` - **读取并验证消息内容**:有还需要获取显示给用户的文本信息以便于断言其他逻辑判断,在这种情况下可利用`text`属性访问当前活动的警告框内的文字描述。 ```python message = alert.text print(f"The alert says: {message}") ``` - **向Prompt输入数据**:针对带有文本域的提示框(`prompt`),可以通过`send_keys()`发送字符串至该字段内完成填写动作后再做进一步响应。 ```python alert.send_keys("Emily") # 向 prompt 输入指定的内容 alert.accept() # 提交所填入的信息 ``` 以上功能均适用于浏览器内置的标准JS弹窗,并且能够很好地满足大多数场景下的需求[^3]。 #### 应对复杂类型的模态对话框 除了上述提到的基础类型外,现代网站还经常采用更加复杂的UI组件作为通知机制的一部分。这类高级别的弹出层往往不是纯粹依靠原生DOM事件创建出来的简单对象;相反它们可能是借助第三方库者框架精心设计而成的高度定制化的界面控件。为了应对这种情况,开发者通常会采取如下策略: - 首先确保触发条件已经达成从而使得目标弹窗得以显现出来; - 接着运用常规的选择器语法(ID, Class Name, XPath等)精确定位到构成此浮层结构的关键节点上; - 最终执行必要的鼠标指针移动、按键按下释放等一系列仿真指令以达到预期效果。 ```python from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver.get('https://example.com') wait = WebDriverWait(driver, 10) # 假设这里有一个按钮用于打开模态框 open_modal_button = wait.until(EC.element_to_be_clickable((By.ID, 'openModal'))) open_modal_button.click() # 定位模态框内部的具体元素进行互动 modal_element = wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'modal-content'))) input_field_in_modal = modal_element.find_element(By.TAG_NAME, 'input') input_field_in_modal.send_keys('Test Input') submit_btn_inside_modal = modal_element.find_element(By.CSS_SELECTOR, '.btn-primary') submit_btn_inside_modal.click() ``` 这段代码展示了如何等待特定元素变得可用之后再对其进行操作的过程,这对于那些加载间不确定性的动态网页来说尤为重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值