Selenium input 框的删除问题汇总。

醋精测试媛 · 2020年12月02日 · 最后由 醋精测试媛 回复于 2020年12月04日 · 5739 次阅读

最初的疑惑:

又遇到了这个问题,input 框里面的东西无法删除。即使删除了,我也点击提交了,刷新之后仍然是删除前的值。

不是 readonly 的输入框。

用例显示提交后,它的 value 变成了”“,但是一刷新,input 框中的值还在。

有什么办法能够把它删掉呢???

以下是更新后的问题:

我明白了上面的问题是由于提交引起的,因此选择了 submit,但是表单提交不会发生任何改变。

如果表单在点击提交按钮后需要用 JS 进行处理(包括输入验证)后再提交的话,通常都必须把 submit 改成 button,即取消其 bai 动提交的行为,否则,将会造成提交两次的效果,对于动态网页 du 说,也就是对数据库操作两次。或者在使用 submit 时验证时加 return true 或 false。

因此这一般是 button。

回到最初的问题,为什么手动去删再点击表格能发送正确的请求,而用 clear() 或者各种各样的方法不行呢?

这可能是 vue 等前端的框架对自动化框架的限制。

当我用 selenium 仿人工操作呢?

首先我会点击输入框一下,然后全选 ctrl+a,然后点击回格键 backspace。

我按照这样修改了 clear 的封装,删除成功了,并且发送了正确的请求。

汇总这次折腾的经过:

  • 直接 ctrl+a+del
  • js:双击并 self.driver.execute_script("arguments[0].value=''", ele)
  • 双击再 clear
  • click 改为 submit
  • click ctrl+a backspace

开发源码:

使用 v-model,类似:


<template>
  <div class="from_box">
    <form action="">
      <input type="text"  placeholder="请输入昵称" v-model="formMess.account">
      <input type="password" placeholder="请输入密码" v-model="formMess.act_pwd">
      <input type="text" placeholder="请输入手机号" v-model="formMess.phone">
    </form>
    <span class="but" @user1="onSubmit()">提交</span>
  </div>
</template>
<script>
import axios from 'axios';

export default {
  name: "from",
  data() {
    return {
        formMess:{
        "account":"",
        "act_pwd":"",
        "phone":""
    }
    };
  },
  methods: {
    onSubmit() {
      /* json格式提交: */
      // let formData = JSON.stringify(this.formMess);

      /* formData格式提交: */
      let formData = new FormData();
      for(var key in this.formMess){
        formData.append(key,this.formMess[key]);
      }

        axios({
        method:"post",
        url:"xxxxxxx",
        headers: {
          "Content-Type": "multipart/form-data"
        },
        withCredentials:true,
        data:formData
    }).then((res)=>{
            console.log(res);
        });
    }
  }
};
最佳回复

贴下开发相关的源码吧?看描述有点一头雾水。如果用的 vue ,把 *.vue 文件的源码贴上来,包括模板部分和 js 部分

得先搞清楚开发怎么实现的输入框提交,才能对应找到最佳的清除方式。vue 这类框架底层自动做了双向数据绑定,输入框的值变化会自动引起某个 js 里面变量的变化,js 变量变化也会自动引起界面绑定元素的变化,所以光看 F12 的编译后代码 html 部分是看不出怎么做的,很多动作是在 js 库中实现的。

PS:如果用了 vue,一般都不会用这个 html 内置的 submit 事件来提交了,因为限制了必须用 form 格式提交,服务端不一定用这个格式解析。结合用 axios 调后端接口更爽呀。

看到正文更新的源码了,确实是基于双向绑定获取 input 的内容,然后再把 双向绑定的 js 中属性值(在你正文源码里对应的是 formMess.phone ) 放到请求里发给服务端。很常见的 vue 写法,没什么问题。

我也试验了下,vue 的双向绑定应该是基于输入框的一些内容变化的 event 触发的,具体是哪些 event 没深入研究过不大了解。而这些 event 可能没法监听你用 selenium 直接操作 input 输入框 value 这种场景(这种场景用户是做不出来的,只有程序能做出来,所以 vue 不考虑也正常),所以没有触发属性值的更新。

具体试验方式:在 https://vuejs.org/v2/guide/forms.html#Basic-Usage 中,找到 text 的示例,通过 js 直接修改 input 输入框的 value ,输入框的值更新了,但进行双向绑定的 message 没有更新:

一般用 vue 编程,实际发送请求用的是双向绑定后 v-model 里面的属性值,所以有可能这个原因你通过编程直接改变的 input 值,没有同步更新到 v-model 对应属性值里。而你 ctrl+a 再用退格键,基本就和用户操作一样了,所以 event 能捕获到。

共收到 21 条回复 时间 点赞

刷新是页面刷新吗?

Jerry li 回复

是的

Jerry li 回复

ActionChains(self.driver).double_click(ele).perform()
self.driver.execute_script("arguments[0].value=''", ele)
都试过了

有没有可能是浏览器自动填充?

Chen 回复

浏览器应该没有自动填充,而且刷新前页面显示是清空了,但是点击提交时,我也 F12 看了请求,value 值没有被清掉,但是我使用了self.driver.execute_script("arguments[0].value=''", ele)也没有清除掉 value 值。

你的意思是你页面显示输入框已经没有值了,但是提交的请求参数中还有值? 这个值是自带的,还是用户输入的?

Chen 回复

是原来输入并提交的,原来输入框中有东西,所以需要清空。

听你这么描述感觉很像是浏览器自动填充啊,你尝试过 send_keys('') 发送一个空字符串吗?

Chen 回复

尝试过,没有用。

emm,没什么好办法了,可以试试其他的浏览器有没有这个问题,或者看看这块有没有特殊需求。

Chen 回复

有输入空的需求

图中的 input 连 name 属性都没有,可以看下表单提交部分的代码处理,可能不是从这里取的。
“我也 F12 看了请求,value 值没有被清掉” -- 可以搜下 value 对应的 key 在哪里

北溟 回复

好的,我问一下前端

北溟 回复

现在还没看到前端的代码,但是你提醒了我这应该不是 clear 的问题,而是提交按钮的问题,所以我尝试使用了submit(),这时候表单压根没有提交【刚刚看错了】

可能还是用的是 button。

贴下开发相关的源码吧?看描述有点一头雾水。如果用的 vue ,把 *.vue 文件的源码贴上来,包括模板部分和 js 部分

得先搞清楚开发怎么实现的输入框提交,才能对应找到最佳的清除方式。vue 这类框架底层自动做了双向数据绑定,输入框的值变化会自动引起某个 js 里面变量的变化,js 变量变化也会自动引起界面绑定元素的变化,所以光看 F12 的编译后代码 html 部分是看不出怎么做的,很多动作是在 js 库中实现的。

PS:如果用了 vue,一般都不会用这个 html 内置的 submit 事件来提交了,因为限制了必须用 form 格式提交,服务端不一定用这个格式解析。结合用 axios 调后端接口更爽呀。

陈恒捷 回复

vue 中,向 input 输入的值存不存在于 value 中?

应该也是存在的。

但是为什么提交的时候提交的是请空前的值呢

看到正文更新的源码了,确实是基于双向绑定获取 input 的内容,然后再把 双向绑定的 js 中属性值(在你正文源码里对应的是 formMess.phone ) 放到请求里发给服务端。很常见的 vue 写法,没什么问题。

我也试验了下,vue 的双向绑定应该是基于输入框的一些内容变化的 event 触发的,具体是哪些 event 没深入研究过不大了解。而这些 event 可能没法监听你用 selenium 直接操作 input 输入框 value 这种场景(这种场景用户是做不出来的,只有程序能做出来,所以 vue 不考虑也正常),所以没有触发属性值的更新。

具体试验方式:在 https://vuejs.org/v2/guide/forms.html#Basic-Usage 中,找到 text 的示例,通过 js 直接修改 input 输入框的 value ,输入框的值更新了,但进行双向绑定的 message 没有更新:

一般用 vue 编程,实际发送请求用的是双向绑定后 v-model 里面的属性值,所以有可能这个原因你通过编程直接改变的 input 值,没有同步更新到 v-model 对应属性值里。而你 ctrl+a 再用退格键,基本就和用户操作一样了,所以 event 能捕获到。

陈恒捷 回复

看懂了,这个问题我疑惑了很久,真的非常感谢您🙇‍

客气啦。

建议下次遇到这类问题,可以先从开发源码角度看看,开发是怎么做的,再去倒推测试怎么做。现在前端已经发展到基本不怎么需要接触最原生的 html 和 js 的程度了,甚至 css 也基本用框架提供的预置 class,但 selenium 等测试工具为了通用,操作的还是最底层的原生控件。

陈恒捷 回复

好的,受教了,以后会加强和开发的沟通的。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册