《手把手教你》系列技巧篇(五十四)-java+ selenium自动化测试-上传文件-中篇(详细教程)

1.简介

  在实际工作中,我们进行web自动化的时候,文件上传是很常见的操作,例如上传用户头像,上传身份证信息等。所以宏哥打算按上传文件的分类对其进行一下讲解和分享。

2.为什么selenium没有提供API?

想必小伙伴们或者童鞋们一定很好奇,既然上传文件在自动化这么常见而且经常用到,那么为什么Selenium的webdriver为什么不提供方法(API),宏哥这里解释一下原因:因为上传文件需要打开window窗口,webdriver是无法对window的控件操作的,换句话说就是:selenium无法识别非web的控件,上传文件窗口为系统自带,无法识别窗口元素。所以没有提供方法,需要我们换个思路去上传文件。

3.上传文件分类

首先,我们要区分出上传按钮的种类,大体上可以分为两种,一种是input框,另外一种就比较复杂,通过js、flash等实现,标签非input。

上传文件有两种场景:input控制上传和非input控件上传。大多数情况都是input控件上传文件,只有非常少数的使用自定义的非input上传文件。今天宏哥这一篇文章就用来介绍非input控件上传文件。

4.非input控件上传文件

非input控件上传文件,我们要引入外部插件上传。这种上传千奇百怪,有用a标签的,有用div的,有用button的,有用object的,我们没有办法通过直接在网页上处理掉这些上传,唯一的办法就是打开OS弹框,去处理弹框。有两种方法一种通过pywin32上传(这种只支持python语言),另一种是通过autoit上传(python和java都支持,其他的没有实践过)。这里我们只会讲到autoit上传文件。

4.1非input控件上传文件

宏哥总结了一下,大体上有以下几种解决方案:

(1)autoIT,借助外力,我们去调用其生成的au3或exe文件。

(2)Python pywin32库,识别对话框句柄,进而操作

(3)SendKeys库

(4)keybd_event,跟3类似,不过是模拟按键,ctrl+a,ctrl+c, ctrl+v…

5.项目实战

介绍纯Java的方式去处理,web上本地上传图片的功能。这个过程,我们还是需要用到Robot这个类,由于在web上点击了本地上传图片后,弹出的框很特殊,selenium无法识别这个弹窗,所以在selnium中没有直接的方法去实现上传本地文件。

5.1大致流程

其实也是上边提到的第四种解决方案,模拟键盘操作。宏哥利用Robot的大致流程是这样的:

1.用selnium点击web上本地上传文件的按钮

2.在弹窗,文件路径输入框默认是光标聚焦,我们把文件在磁盘上的路径,通过拷贝和黏贴方法写上去。

3.通过按下回车站,默认触发弹窗的确定按钮,完成了文件上传过程。

5.2测试场景

  打开百度首页,搜索按钮左侧有一个照相机的图标,点击可以选择图片搜索,我们通过本地上传图片的过程来模拟文件自动化上传操作,上传成功后,百度识图会识别是不是百度搜索的图片,如果是,就会显示图片的信息,如果不是,就会识别失败,提示重新上传。准备条件,你在百度图片搜索一个图片,保存到你桌面,例如宏哥找到一个关于selenium的图片,然后保存在桌面的test文件夹,名称为北京宏哥的拼音首字母:bjhg.jpeg。

5.3代码设计

5.4参考代码
package lessons;

import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.datatransfer.StringSelection;
import java.awt.event.KeyEvent;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

/**
 * @author 北京-宏哥
 * 
 * @公众号:北京宏哥(微信搜索:北京宏哥,关注宏哥,提前解锁更多测试干货)
 * 
 * @《手把手教你》系列技巧篇(五十三)-java+ selenium自动化测试-上传文件-中篇(详细教程)
 *
 * @2021年12月12日
 */
public class FileUpload {

    public static void main(String[] args) throws Exception {

        System.setProperty("webdriver.gecko.driver",".\\Tools\\geckodriver.exe");

        WebDriver driver = new FirefoxDriver();
        driver.manage().window().maximize();

        driver.get("https://www.baidu.com");

        // 指定图片的路径,这里我放桌面上
        StringSelection sel = new StringSelection(
                "C:\\Users\\DELL\\Desktop\\test\\bjhg.jpeg");

        // 把图片文件路径复制到剪贴板
        Toolkit.getDefaultToolkit().getSystemClipboard().setContents(sel, null);
        System.out.println("selection" + sel);

        // 点击照相机这个按钮
        driver.findElement(By.xpath("//*/span[@class='soutu-btn']")).click();

        // 点击本地上传图片
        driver.findElement(By.xpath("//*/input[@class='upload-pic']")).click();

        // 新建一个Robot类的对象
        Robot robot = new Robot();
        Thread.sleep(1000);

        // 按下回车
        robot.keyPress(KeyEvent.VK_ENTER);

        // 释放回车
        robot.keyRelease(KeyEvent.VK_ENTER);

        // 按下 CTRL+V
        robot.keyPress(KeyEvent.VK_CONTROL);
        robot.keyPress(KeyEvent.VK_V);

        // 释放 CTRL+V
        robot.keyRelease(KeyEvent.VK_CONTROL);
        robot.keyRelease(KeyEvent.VK_V);
        Thread.sleep(1000);

        // 点击回车 Enter
        robot.keyPress(KeyEvent.VK_ENTER);
        robot.keyRelease(KeyEvent.VK_ENTER);
        
        Thread.sleep(5000);
        System.out.println("browser will be close");
        driver.quit();    

    }

}
5.5运行代码

1.运行代码,右键Run AS->Java Appliance,控制台输出,如下图所示:

2.运行代码后电脑端的浏览器的动作,如下小视频所示:

6.小结

  奇怪了,细心地小伙伴或者童鞋们。一定会发现宏哥之前的代码都是用火狐浏览器,结果录制的视频却是Chrome浏览器,原因是:开始Chrome浏览器不可以模拟成功,宏哥就换了Firefox浏览器成功了,第二天宏哥抱着试一下的心理,结果也成功了。但是原因没有找到,开始宏哥以为是Chrome浏览器版本高,而宏哥的Firefox是一个低版本的,所以换了Firefox,但是Chrome今天可以成功,那就不是版本问题,而且宏哥怀疑是图片的名字中英文,但是试过了也是没有关系的。但是宏哥还是提醒各位最好用英文的。实在找不到原因了,有知道可以留言宏哥哦!!!
  好了,今天时间也不是很早了,宏哥今天就讲解和分享到这里,感谢您耐心的阅读,下一篇讲解借助工具来处理非input控件上传文件。

 每天学习一点,今后必成大神-

往期推荐(由于跳转参数丢失了,所有建议选中要访问的右键,在新标签页中打开链接即可访问)或者微信搜索: 北京宏哥  公众号提前解锁更多干货。

Appium自动化系列,耗时80天打造的从搭建环境到实际应用精品教程测试

Python接口自动化测试教程,熬夜87天整理出这一份上万字的超全学习指南

Python+Selenium自动化系列,通宵700天从无到有搭建一个自动化测试框架

Java+Selenium自动化系列,仿照Python趁热打铁呕心沥血317天搭建价值好几K的自动化测试框架

Jmeter工具从基础->进阶->高级,费时2年多整理出这一份全网超详细的入门到精通教程

Fiddler工具从基础->进阶->高级,费时100多天吐血整理出这一份全网超详细的入门到精通教程

Pycharm工具基础使用教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/488685.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【学习】软件测试人员如何设计出优秀的测试用例

在软件开发的过程中,测试用例如同工程质量的守护者,它们的存在确保了软件产品的稳定性和可靠性。然而,如何设计出优秀的测试用例,让其在千变万化的软件世界中独领风骚,成为众多测试工程师追寻的目标。本文将为你揭示其…

9、垃圾回收器

为什么分代GC算法要把堆分成年轻代和老年代?首先我们要知道堆内存中对象的特性: 系统中的大部分对象,都是创建出来之后很快就不再使用可以被回收,比如用户获取订单数据,订单数据返回给用户之后就可以释放了。老年代中…

小红书矩阵批量发布工具,一键发布笔记软件

昨日,我收到了一条充满渴望与期待的私信,来自一位小红书的矩阵账号博主。他手握多个账号,渴望寻找一款能够助力他批量发布笔记的神器,每日能够轻松达到百篇的发布量。这份迫切的需求,我深感体会,因为这正是…

看漫画学Python:有趣好玩

书籍介绍 Python是一门既简单又强大的编程语言,被广泛应用于数据分析、大数据、网络爬虫、自动化运维、科学计算和人工智能等领域。Python也越来越重要,成为国家计算机等级考试科目,某些中小学也开设了Python编程课程。本书秉承有趣、有料、…

个人周总结

个人周总结: 对于总体方向目标的完成,完成的不是很好,这周内的很多天都在游离,就是事情可能有需要做的,但是动力不很足,期间就是有点摆烂了。后面及时调整调整吧,有这种情况,一个原…

Qt实现简易的多线程TCP服务器(附源码)

目录 一.UI界面的设计 二.服务器的启动 三.实现自定义的TcpServer类 1.在widget中声明自定义TcpServer类的成员变量 2.在TcpServer的构造函数中对于我们声明的m_widget进行初始化,m_widget我们用于后续的显示消息等,说白了就是主界面的更新显示等 …

从人工智能入门到理解ChatGPT的原理与架构的第一天(First)(含机器学习特征工程详解)

目录 一.ChatGPT的发展历程 二.Attention is all you need 三.对于GPT-4的智能水平评估 四.大语言模型的技术演化 1.从符号主义到连接主义 2.特征工程 2.1数据探索 2.2数据清洗 2.3数据预处理 2.3.1无量纲化 2.3.1.1标准化 2.3.1.2区间缩放法 2.3.1.3标准化与归一…

Android开发简易登录界面

title: Android开发第四天 search: 2024-03-22 tags: Android开发 Android开发简易登录界面 文章目录 Android开发简易登录界面一、定义style样式二、完成 activity_main.xml 界面具体设计三、代码简述 背景 :在初学 android 开发的时候,为了尽量熟悉学…

RSTP环路避免实验(思科)

华为设备参考:RSTP环路避免实验(华为) 一,技术简介 RSTP (Rapid Spanning Tree Protocol) 是从STP发展而来 • RSTP标准版本为IEEE802.1w • RSTP具备STP的所有功能,可以兼容STP运行 • RSTP和STP有所不同 减少了…

新书速览|Django 5企业级Web应用开发实战:视频教学版

掌握Django框架开发技能,实战投票应用系统和内容管理系统 本书内容 《Django 5企业级Web应用开发实战:视频教学版》精选当前简单、实用和流行的Django实例代码,帮助读者学习和掌握Django 5框架及其相关技术栈的开发知识。本书系统全面、内容…

深入解析MySQL的四种打开方式

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

伦敦金与纸黄金有什么区别?怎么选?

伦敦金与纸黄金都是与黄金相关的投资品种,近期黄金市场的上涨吸引了投资者的关注,那投资者想开户入场成为黄金投资者应该选择纸黄金还是伦敦金呢?两者有何区别呢?下面我们就来讨论一下。 伦敦金是一种起源于伦敦的标准化黄金交易合…

2015年认证杯SPSSPRO杯数学建模A题(第一阶段)绳结全过程文档及程序

2015年认证杯SPSSPRO杯数学建模 A题 绳结 原题再现: 给绳索打结是人们在日常生活中常用的技能。对登山、航海、垂钓、野外生存等专门用途,结绳更是必不可少的技能之一。针对不同用途,有多种绳结的编制方法。最简单的绳结,有时称…

Go第三方框架--gin框架(一)

序言 Gin框架作为go语言使用最多的web框架,以其快速的响应速度和对复杂http路由配置的支持受到程序员和媛们的喜爱,几乎统治了web市场。但作为一名合格的程序员,要知其然更要知其所以然,不然八股文背的也没有啥意思。本着这个原则…

【Java程序设计】【C00372】基于(JavaWeb)Springboot的社区网格化管理系统(有论文)

TOC 博主介绍:java高级开发,从事互联网行业六年,已经做了六年的毕业设计程序开发,开发过上千套毕业设计程序,博客中有上百套程序可供参考,欢迎共同交流学习。 项目简介 项目获取 🍅文末点击卡片…

工业互联网下的增强现实

工业互联网下的增强现实 1、 概述 增强现实(Augmented Reality,简称AR),增强现实技术也被称为扩增现实,AR增强现实技术是促使真实世界信息和虚拟世界信息内容之间综合在一起的较新的技术内容,其将原本在现…

Apache SeaTunnel和SeaTunnel Web 安装部署

Apache SeaTunnel和SeaTunnel Web 安装部署 前面我们介绍已经介绍过了Apache SeaTunnel,这里我们看一下SeaTunnel 的安装部署,早期的SeaTunnel 是没有web 页面的,只能在命令行里使用,现在SeaTunnel 已经有了web 端了,这就降低了我们的使用门槛 下载配置 我们可以去下面的…

如何理解TCP/IP协议?

一、是什么 TCP/IP,传输控制协议/网际协议,是指能够在多个不同网络间实现信息传输的协议簇 TCP(传输控制协议) 一种面向连接的、可靠的、基于字节流的传输层通信协议 IP(网际协议) 用于封包交换数据网络…

2024年最新阿里云服务器价格表_CPU内存+磁盘+带宽价格

2024年阿里云服务器租用费用,云服务器ECS经济型e实例2核2G、3M固定带宽99元一年,轻量应用服务器2核2G3M带宽轻量服务器一年61元,ECS u1服务器2核4G5M固定带宽199元一年,2核4G4M带宽轻量服务器一年165元12个月,2核4G服务…

YT8531调试记录

总结 还是从设备树,mac驱动,mac驱动对mdio总线的注册,phy驱动 ,phy的datasheet,cpu的datasheet 几个方面来看来看 0.确认供电,以及phy的地址(一般会有多个地址,根据相关引脚电平可配置) 1.确…