UI 自动化中如何处理上传文件事件

 🔥 交流讨论:欢迎加入我们一起学习!

🔥 资源分享耗时200+小时精选的「软件测试」资料包

🔥 教程推荐:火遍全网的《软件测试》教程  

📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

在UI自动化中,我们经常会遇到上传文件操作。处理上传事件是一个比较麻烦的操作,因为点击上传控件会弹出Windows窗口供用户选择文件,但是Windows窗口是浏览器之外的组件,所以selenium本身无法处理这个windows窗口。这里给大家几个处理思路,我们先看一下下面这个HTML。

用notepad++ 打开,将它存成一个 autotest.html文件,打开之后,只有一个上传按钮,我们来看一下怎么处理上传事件。

1

直接调用selenium自带的sendkeys进行操作,将需要上传的文件路径直接传递进上传控件。

2.import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
/**

  • Description:
  • Author: ChrisMa
  • Date: 2019-05-15
    */
    public class testupload2 {
    public static void main(String ags[]) throws InterruptedException {
    //初始化webdriver
    WebDriver driver = new ChromeDriver();
    //打开本地html
    driver.get(“file:///D:/UI/autotest1.html”);
    // 将文件所在路径传递给上传文件控件
    driver.findElement(By.name(“file”)).sendKeys(“D:\text.txt”);
    // 等待看到结果
    Thread.sleep(10000);
    //关闭webdriver
    driver.quit();
    }
    }

这种方案可以解决大部分的上传操作,可是对于一些上传框禁止输入的就无法操作了,这时候我们就要考虑其他方案。

2

针对无法输入的,我们可以考虑采用AutoIT来进行上传。

AutoIt目前最新是v3版本,这是一个使用类似BASIC脚本语言的免费软件,它设计用于Windows GUI(图形用户界面)中进行自动化操作。它利用模拟键盘按键,鼠标移动和窗口/控件的组合来实现自动化任务。

官方网站:https://www.autoitscript.com/site/

从网站上下载AutoIt并安装,安装完成在菜单中会看到下图的目录:
在这里插入图片描述

AutoIt Windows Info 用于帮助我们识Windows控件信息。

Compile Script to.exe 用于将AutoIt生成 exe 执行文件。

Run Script 用于执行AutoIt脚本。

SciTE Script Editor 用于编写AutoIt脚本。

我们打开html 网页,然后点击一下上传按钮:

在这里插入图片描述

下面我们看一下怎么用autoIT来处理这个上传。

• 打开AutoIT Window Info,然后点击Finder Tool,不松开左键,等鼠标变成瞄准器类型时,将鼠标挪动到文件上传框需要识别的控件上松开左键。
在这里插入图片描述

识别出对象之后所有的信息会显示在AutoIT windows info里

经过识别窗口的title为“Open”,标题的Class为“#32770”。

文件名输入框的class 为“Edit”,Instance为“1” ,所以ClassnameNN为“Edit1”。

打开按钮的class 为“Button”,Instance为“1” ,所以ClassnameNN为“Button1”。

我们打开SciTE Script Editor,然后将下列代码填入:

;ControlFocus(“title”,“text”,controlID) Edit1=Edit instance 1

ControlFocus(“Open”, “”,“Edit1”)

; Wait 10 seconds for the Upload window to appear

WinWait("[CLASS:#32770]","",10)

; Set the File name textmargin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; clear: both; min-height: 1em; color: rgb(51, 51, 51); font-family: -apple-system-font, system-ui, “Helvetica Neue”, “PingFang SC”, “Hiragino Sans GB”, “Microsoft YaHei UI”, “Microsoft YaHei”, Arial, sans-serif; font-size: 17px; letter-spacing: 0.544px; text-align: left; text-indent: 39pt;">

ControlSetText(“Open”, “”, “Edit1”, “D: est.txt”)

Sleep(2000)

; Clickmargin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; clear: both; min-height: 1em; color: rgb(51, 51, 51); font-family: -apple-system-font, system-ui, “Helvetica Neue”, “PingFang SC”, “Hiragino Sans GB”, “Microsoft YaHei UI”, “Microsoft YaHei”, Arial, sans-serif; font-size: 17px; letter-spacing: 0.544px; text-align: left; text-indent: 39pt;">

ControlClick(“Open”, “”,“Button1”);

在这里插入图片描述

将script在SciTE Script Editor保存之后,打开上传窗口,在SciTE Script Editor中选择Tools->go, 来查看一下文件是否可以上传。

确认脚本运行正常, 我们将这个脚本保存成Script.au3, 然后打开Compile Script to.exe,将Script.au3文件转换为Script.exe:
在这里插入图片描述

这个时候,我们打开上传文件控件,双击Script.exe文件,可以看到文件上传事件已经处理成功。

接下来,就是使用java来调用该EXE文件:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.io.IOException;
/**

  • Description:
  • Author: ChrisMa
  • Date: 2019-05-15
    */
    public class testupload2 {
    public static void main(String ags[]) throws InterruptedException {
    //初始化webdriver
    WebDriver driver = new ChromeDriver();
    //打开本地html
    driver.get(“file:///D:/ UI/autotest.html”);
    // 点击选择文件按钮
    driver.findElement(By.name(“file”)).click();
    // 设置等待3秒
    Thread.sleep(3000);
    // Java 的Runtime 模块的getruntime.exec()方法可以调用exe 程序并执行。
    Runtime exe = Runtime.getRuntime();
    try {
    String str = “D://Script.exe”;
    // 运行指定位置的.exe文件
    exe.exec(str);
    } catch (IOException e) {
    System.out.println(“Error to run the exe”);
    e.printStackTrace();
    }
    // 等待看到结果
    Thread.sleep(10000);
    //关闭webdriver
    driver.quit();

}
}

借助AutoIT也有自己的限制,比如只能在Windows系统中进行,如果要移植到其他系统,就得参考其他方式。

3

如果想在非Windows系统中处理上传,我们可以用纯Java的形式处理,这时候,我们就要用到Robot这个类,在该过程中流程表现为:打开上传文件的控件->将文件在磁盘上的路径,通过robot copy pasty进去(需要文件输入框默认是光标聚焦)->按下回车,触发弹窗确定按钮,完成文件上传过程

4

代码如下:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.awt.*;
import java.awt.datatransfer.StringSelection;
import java.awt.event.KeyEvent;
/**

  • Description:
  • Author: ChrisMa
  • Date: 2019-05-15
    */
    public class testupload {
    public static void main(String ags[]) throws InterruptedException, AWTException {
    //初始化webdriver
    WebDriver driver = new ChromeDriver();
    //打开本地html
    driver.get(“file:///D:/ UI/autotest.html”);
    // 指定上传文件的路径
    StringSelection sel = new StringSelection(“D:\test\test1.txt”);
    // 把图片文件路径复制到剪贴板
    Toolkit.getDefaultToolkit().getSystemClipboard().setContents(sel,null);
    System.out.println(“selection” +sel);
    // 点击上传按钮
    driver.findElement(By.name(“file”)).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(10000);
    //关闭webdriver
    driver.quit();
    }
    }

上传文件咱们就先处理到这里,希望可以给大家开阔思路,大家下次见。

最后我邀请你进入我们的【软件测试学习交流群:785128166】, 大家可以一起探讨交流软件测试,共同学习软件测试技术、面试等软件测试方方面面,还会有免费直播课,收获更多测试技巧,我们一起进阶Python自动化测试/测试开发,走向高薪之路

作为一个软件测试的过来人,我想尽自己最大的努力,帮助每一个伙伴都能顺利找到工作。所以我整理了下面这份资源,现在免费分享给大家,有需要的小伙伴可以关注【公众号:程序员二黑】自提!

  • 9
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值