Katalon Studio上传文件

2019年4月17日 9.02k 次阅读 20 条评论 6 人点赞

写在前面

最近有童鞋询问如何使用Katalon Studio上传文件,空闲时间研究了一下。

常见的上传文件一般有两种格式的html,首先简单介绍一下。

第一种:

input type = "file"

这种操作很简单,Katalon Studio本身有封装的关键字uploadFile()可以直接调用。

另外,这种类型的上传文件之前写过关于Selenium的操作,详情见文章:Selenium文件上传

第二种:

非input类型的上传文件格式,这种操作就麻烦点,需要单独封装关键字调用。

本文将针对Katalon Studio来讲解如何上传文件。

input类型的上传文件

为了更直观的演示处理效果,制作了一个上传文件的html。上传文件传送门: Upfile.html[请点点我]

html界面如下图所示:

准备工作:

计算机本地D盘根目录下新建一个txt文件,命名为:upload_file.txt,然后修改后缀名为:upload_file.png 由于html文件限制了上传文件的类型仅为:.jpg .png .jpeg .gif,并且限制了上传文件的大小,所以请按照指示建立upload_file.png。Katalon Studio在Script模式编写以下脚本:

import static com.kms.katalon.core.checkpoint.CheckpointFactory.findCheckpoint
import static com.kms.katalon.core.testcase.TestCaseFactory.findTestCase
import static com.kms.katalon.core.testdata.TestDataFactory.findTestData
import static com.kms.katalon.core.testobject.ObjectRepository.findTestObject
import com.kms.katalon.core.checkpoint.Checkpoint as Checkpoint
import com.kms.katalon.core.cucumber.keyword.CucumberBuiltinKeywords as CucumberKW
import com.kms.katalon.core.mobile.keyword.MobileBuiltInKeywords as Mobile
import com.kms.katalon.core.model.FailureHandling as FailureHandling
import com.kms.katalon.core.testcase.TestCase as TestCase
import com.kms.katalon.core.testdata.TestData as TestData
import com.kms.katalon.core.testobject.TestObject as TestObject
import com.kms.katalon.core.webservice.keyword.WSBuiltInKeywords as WS
import com.kms.katalon.core.webui.keyword.WebUiBuiltInKeywords as WebUI
import internal.GlobalVariable as GlobalVariable
import org.openqa.selenium.Keys as Keys

WebUI.openBrowser('https://www.testclass.cn/test_html/UpFile.html')

WebUI.uploadFile(findTestObject('Object Repository/upload'), 'D:\\upload_file.png')

执行结果如下所示:

非input类型的上传文件

针对一些非input格式的文件上传,或input格式使用上述方法执行无效,可以试试这部分的操作方法。

非input格式的前端应用界面如下图所示:

解决思路:

1.新建关键字

2.调用关键字

3.执行测试案例

关键字的建立不再详细说明。之前写过一篇文章,详情请见:Katalon Studio如何定义关键字

新建关键字的内容如下:

package testclass

import static com.kms.katalon.core.checkpoint.CheckpointFactory.findCheckpoint
import static com.kms.katalon.core.testcase.TestCaseFactory.findTestCase
import static com.kms.katalon.core.testdata.TestDataFactory.findTestData
import static com.kms.katalon.core.testobject.ObjectRepository.findTestObject

import com.kms.katalon.core.annotation.Keyword
import com.kms.katalon.core.checkpoint.Checkpoint
import com.kms.katalon.core.cucumber.keyword.CucumberBuiltinKeywords as CucumberKW
import com.kms.katalon.core.mobile.keyword.MobileBuiltInKeywords as Mobile
import com.kms.katalon.core.model.FailureHandling
import com.kms.katalon.core.testcase.TestCase
import com.kms.katalon.core.testdata.TestData
import com.kms.katalon.core.testobject.TestObject
import com.kms.katalon.core.webservice.keyword.WSBuiltInKeywords as WS
import com.kms.katalon.core.webui.keyword.WebUiBuiltInKeywords as WebUI
import java.awt.Robot
import java.awt.Toolkit
import java.awt.datatransfer.StringSelection
import java.awt.event.KeyEvent
import internal.GlobalVariable

public class cn {

	@Keyword
	def uploadFile (TestObject to, String filePath) {
		WebUI.click(to)
		StringSelection ss = new StringSelection(filePath);
		Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null);
		Robot robot = new Robot();
		robot.keyPress(KeyEvent.VK_ENTER);
		robot.keyRelease(KeyEvent.VK_ENTER);
		robot.keyPress(KeyEvent.VK_CONTROL);
		robot.keyPress(KeyEvent.VK_V);
		robot.keyRelease(KeyEvent.VK_V);
		robot.keyRelease(KeyEvent.VK_CONTROL);
		robot.keyPress(KeyEvent.VK_ENTER);
		robot.keyRelease(KeyEvent.VK_ENTER);
	}
}

备注:以上关键字也适用于input类型的文件上传。

建立完以上关键字以后,在Script模式调用:

CustomKeywords.'testclass.cn.uploadFile'(findTestObject('Object Repository/upload'), 'D:\\upload_file.png')

如果想试试效果,可以对我制作的input类型的HTML操作。上传文件传送门: Upfile.html[请点点我]

在Katalon Studio中新建测试案例,执行以下代码:

import static com.kms.katalon.core.checkpoint.CheckpointFactory.findCheckpoint
import static com.kms.katalon.core.testcase.TestCaseFactory.findTestCase
import static com.kms.katalon.core.testdata.TestDataFactory.findTestData
import static com.kms.katalon.core.testobject.ObjectRepository.findTestObject
import com.kms.katalon.core.checkpoint.Checkpoint as Checkpoint
import com.kms.katalon.core.cucumber.keyword.CucumberBuiltinKeywords as CucumberKW
import com.kms.katalon.core.mobile.keyword.MobileBuiltInKeywords as Mobile
import com.kms.katalon.core.model.FailureHandling as FailureHandling
import com.kms.katalon.core.testcase.TestCase as TestCase
import com.kms.katalon.core.testdata.TestData as TestData
import com.kms.katalon.core.testobject.TestObject as TestObject
import com.kms.katalon.core.webservice.keyword.WSBuiltInKeywords as WS
import com.kms.katalon.core.webui.keyword.WebUiBuiltInKeywords as WebUI
import internal.GlobalVariable as GlobalVariable
import org.openqa.selenium.Keys as Keys

WebUI.openBrowser('https://www.testclass.cn/test_html/UpFile.html')

CustomKeywords.'testclass.cn.uploadFile'(findTestObject('Object Repository/upload'), 'D:\\upload_file.png')

注意事项:

1.上传文件的路径需要填写绝对路径;

2.上传文件的路径需要双反斜杠“\\”,例如:'D:\\upload_file.png';

3.上传文件的名称需要英文格式,并且带文件后缀名;

4.上传文件的路径中的文件夹都需要英文命名;

5.个人建议把需要上传的文件放到你所建立的项目文件中;

findTestObject('Object Repository/upload)

该部分findTestObject定位的元素为上图中的"选择文件",需要正确的定位到该元素。

执行效果,如下图所示:

温馨提示:欢迎加入软件测试学习交流QQ群:670250199

风里云里,我在这里等你!

文章评论(20)

  • DOVIS

    请问这是什么原因呢?

    2019年12月19日
  • DOVIS

    Unable to upload file 'G:\upload_file.png' to object (Root cause: com.kms.katalon.core.exception.StepFailedException: Unable to upload file 'G:\upload_file.png' to object
    at com.kms.katalon.core.webui.keyword.internal.WebUIKeywordMain.stepFailed(WebUIKeywordMain.groovy:64)
    at com.kms.katalon.core.webui.keyword.internal.WebUIKeywordMain.runKeyword(WebUIKeywordMain.groovy:26)
    at com.kms.katalon.core.webui.keyword.builtin.UploadFileKeyword.uploadFile(UploadFileKeyword.groovy:87)
    at com.kms.katalon.core.webui.keyword.builtin.UploadFileKeyword.execute(UploadFileKeyword.groovy:68)
    at com.kms.katalon.core.keyword.internal.KeywordExecutor.executeKeywordForPlatform(KeywordExecutor.groovy:72)
    at com.kms.katalon.core.webui.keyword.WebUiBuiltInKeywords.uploadFile(WebUiBuiltInKeywords.groovy:2945)
    at com.kms.katalon.core.webui.keyword.WebUiBuiltInKeywords$uploadFile$0.call(Unknown Source)
    at uploadtest.run(uploadtest:36)
    at com.kms.katalon.core.main.ScriptEngine.run(ScriptEngine.java:194)
    at com.kms.katalon.core.main.ScriptEngine.runScriptAsRawText(ScriptEngine.java:119)
    at com.kms.katalon.core.main.TestCaseExecutor.runScript(TestCaseExecutor.java:337)
    at com.kms.katalon.core.main.TestCaseExecutor.doExecute(TestCaseExecutor.java:328)
    at com.kms.katalon.core.main.TestCaseExecutor.processExecutionPhase(TestCaseExecutor.java:307)
    at com.kms.katalon.core.main.TestCaseExecutor.accessMainPhase(TestCaseExecutor.java:299)
    at com.kms.katalon.core.main.TestCaseExecutor.execute(TestCaseExecutor.java:233)
    at com.kms.katalon.core.main.TestCaseMain.runTestCase(TestCaseMain.java:114)
    at com.kms.katalon.core.main.TestCaseMain.runTestCase(TestCaseMain.java:105)
    at com.kms.katalon.core.main.TestCaseMain$runTestCase$0.call(Unknown Source)
    at TempTestCase1576727757149.run(TempTestCase1576727757149.groovy:23)
    Caused by: java.lang.IllegalArgumentException: Object is null
    at com.kms.katalon.core.helper.KeywordHelper.checkTestObjectParameter(KeywordHelper.java:33)
    at com.kms.katalon.core.webui.keyword.builtin.UploadFileKeyword$_uploadFile_closure1.doCall(UploadFileKeyword.groovy:76)
    at com.kms.katalon.core.webui.keyword.builtin.UploadFileKeyword$_uploadFile_closure1.call(UploadFileKeyword.groovy)
    at com.kms.katalon.core.webui.keyword.internal.WebUIKeywordMain.runKeyword(WebUIKeywordMain.groovy:20)
    at com.kms.katalon.core.webui.keyword.builtin.UploadFileKeyword.uploadFile(UploadFileKeyword.groovy:87)
    at com.kms.katalon.core.webui.keyword.builtin.UploadFileKeyword.execute(UploadFileKeyword.groovy:68)
    at com.kms.katalon.core.keyword.internal.KeywordExecutor.executeKeywordForPlatform(KeywordExecutor.groovy:72)
    at com.kms.katalon.core.webui.keyword.WebUiBuiltInKeywords.uploadFile(WebUiBuiltInKeywords.groovy:2945)
    at com.kms.katalon.core.webui.keyword.WebUiBuiltInKeywords$uploadFile$0.call(Unknown Source)
    at Script1576727338831.run(Script1576727338831.groovy:36)
    ... 11 more
    )

    2019年12月19日
  • YY

    跑第二次脚本,上传不了,怎么解决?

    2019年10月17日
    • 期待

      上传成功后,可以先退出该上传界面,再进入上传界面,执行上传操作。

      2019年10月21日
  • 上传文件偶尔会成功一次,其他就是失败。结果就是点击上传按钮,选择框弹出来,就报错了

    2019年9月24日
  • 首次上传是成功的,但是好像有缓存,点击下一步再次上传就不行了

    2019年9月11日
  • 共惜芳华

    只能上传一次,上传第二次就没办法,请问怎么解决啊。

    2019年8月19日
    • Altumn

      上传成功后,可以先退出该上传界面,再进入上传界面,执行上传操作。

      2019年8月22日
  • dieche

    连续上传会失败怎么办

    2019年4月28日
    • 共惜芳华

      请问你解决了吗?

      2019年8月19日
    • Altumn

      上传成功后,可以先退出该上传界面,再进入上传界面,执行上传操作。

      2019年8月22日
  • potato

    学习了!!!

    2019年4月25日
  • Wenbin

    直接用sendKeys不行吗??

    2019年4月19日
    • Altumn

      也是可以的。前提是:如果你能把焦点定位到 windows系统 本身弹出的选择框,就可以通过sendKeys方法实现模拟键盘输入tab,enter等按键结合,完成文件上传。

      2019年4月25日
  • 少年阿七

    mac用这种方法是不是不行呢?只能进行到弹出文件选择框;关键字里是进行了什么操作呢,看起来就是模拟了ctrl+V的操作,是把文件路径粘贴到文件框的意思吗?

    2019年4月18日
    • Altumn

      注意事项:

      1.上传文件的路径需要填写绝对路径;

      2.上传文件的路径需要双反斜杠“\\”,例如:'D:\\upload_file.png';

      3.上传文件的名称需要英文格式,并且带文件后缀名;

      4.上传文件的路径中的文件夹都需要英文命名;

      看一下上面的条件符合要求嘛?<strong>文件绝对路径要求全部是英文。</strong>

      2019年4月18日
  • 王土豆

    非input类型的上传文件方法,特别特别受用haha

    2019年4月17日
  • 学习了

    2019年4月17日