TeamCity编译执行selenium上传窗口脚本缺陷

TeamCity编译selenium脚本,对于上传窗口处理只支持sendKeys的使用,不支持模拟人为按下Enter键和使用autoIt等操作,即使本地调试通过的脚本,提交编译执行后,也是报错,原因是teamCity编译执行脚本的过程中,只是后台启动相应浏览器的driver,没有真实打开一个浏览器导致的。发现这个缺陷还得从编写上传课件测试用例脚本说起。

一个上传课程测试用例,功能测试是,填写课程的基本信息后,上传课程的图片,如图1,图片上传成功后,系统会提示“图片上传成功”,然后点击【选择】按钮,如图2,在弹出的窗口中选择需要作为课程课件的文件后,点击【打开】按钮或者直接按Enter键,即可选择文件,如下图3,课件资源上传成功后,系统会弹出一个蒙板层,告诉课程资源上传成功

图1

图2

图3

为了实现课件图片和资源的上传,我一开始打算都用sendKeys,然后发现上传图片是成功,上传课件失败,因为公司的上传课件是使用网络开源控件,所以上传文件不支持selenium的api之sendKeys的使用,于是我就换了思路,准备模拟功能测试操作:

  1. 点击界面【选择】按钮
  2. 在弹出的窗口使用javaAPI之Robot,模拟键盘按下Ctrl+V,粘贴课件资源路径
  3. 再按下Enter键,实现了课件的上传
  4. 判断此时系统是否有弹出蒙板(ps:此处只要判断窗口中是否有蒙板中特有的文字出现即可)

操作的步骤的脚本如下

driver.findElement(By.id("updatePicId")). sendKeys("D:\1.jpg");//上传图片
Assert.assertTrue(driver.getPageSource().contains("上传图片成功"));//判断是否有上传图片成功提示字符串
driver.findElement(By.xpath("//ul/li[5]/div[1]/label/div/object")).click();//点击【选择】按钮
this.useSysClipboard("D:\1.mp4");//将要上传的文件路径复制到剪切板然后粘贴出来并按下Enter键
Assert.assertTrue(driver.getPageSource().contains("上传课件成功"));//判断是否有上传课件成功提示字符串
/**
 * 复制数据到剪切板并粘贴出来
 * @param writeMe
 * @throws java.awt.AWTException
 */
   public void useSysClipboard(String writeMe) throws AWTException {
    Sleeper.sleepTight(800);
    Robot robot=new Robot();
    Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
    clip.setContents(new StringSelection(""), null);//清空系统剪切板
    Transferable tText = new StringSelection(writeMe);  //将文件路径复制到系统剪切板
    clip.setContents(tText, null);
    robot.keyPress(KeyEvent.VK_CONTROL);//模拟按ctrl键
    robot.keyPress(KeyEvent.VK_V);//模拟按v键
    Sleeper.sleepTight(500);
    robot.keyRelease(KeyEvent.VK_V);//模拟释放v键
    robot.keyRelease(KeyEvent.VK_CONTROL);//模拟释放ctrl键
    Sleeper.sleepTight(500);
    robot.keyPress(KeyEvent.VK_ENTER);//模拟按Enter键
    Sleeper.sleepTight(500);
}

脚本写完后,就是运行调试,很好,本地执行这个步骤的脚本运行ok,很开心,于是提交脚本到公司的svn,然后就是teamCity去编译我提交的脚本,这里说明下,teamCity在编译的过程中是会根据我脚本中指定的浏览器类型,打开相应的driver去执行脚本的,此时编译过程中是不会打开真实的浏览器,不过发现在teamCity编译的过程上传图片步骤通过,但是上传课件资源步骤报错了,错误日志显示脚本在Assert.assertTrue(driver.getPageSource().contains("上传课件成功!"))报错了,这种情况出现的原因是上传课件步骤没有成功,所以找不到蒙板层中的字符串,于是我就觉得奇怪,理论上本机调试ok的脚本,在teamCity编译执行的过程中是不会有错误的,于是为了排除是网络延迟导致的,我加长了sleep的时间,发现还是报一样的错误,此时我怀疑是不是teamCity在编译执行的的过程中不支持Robot的模拟操作,于是我就换了思路,借助autoIt3这个工具。

使用autoIt3直接写了一个小脚本并转换成可执行的.exe文件,这个脚本的作用就是在弹出上传窗口的时候,在窗口中输入文件路径并点击窗口【打开】键,于是脚本就变成了下面这个

driver.findElement(By.xpath("//ul/li[5]/div[1]/label/div/object")).click();//点击【选择】按钮
Runtime.getRuntime().exec("d:1.exe");//执行.exe文件上传课件
Assert.assertTrue(driver.getPageSource().contains("上传课件成功!"));判断是否有上传课件成功提示字符串

然后接着本地调试可以运行通过,但是提交teamCity编译还是报错,这个时候我就排除了之前的想法“teamCity在编译执行的的过程中不支持Robot的模拟操作”这个假设。

这个时候我又怀疑是不是teamCity编译执行的时候没有打开真实的浏览器,导致我上传课件资源失败,为了证明我的假设,我把上传课程图片脚本也是改成了使用模拟键盘复制粘贴操作并结合Enter键盘来实现,不用sendKeys,脚本修改如下

driver.findElement(By.id("updatePicId")).click();//点击【上传图片】按钮
this.useSysClipboard("D:\1.jpg");//通过复制粘贴方式上传图片
Assert.assertTrue(driver.getPageSource().contains("上传图片成功"));//判断是否有上传图片成功提示字符串
driver.findElement(By.xpath("//ul/li[5]/div[1]/label/div/object")).click();//点击【选择】按钮
Runtime.getRuntime().exec("d:1.exe");//执行.exe文件上传课件
Assert.assertTrue(driver.getPageSource().contains("上传课件成功!"));//判断是否有上传课件成功提示字符串

果然teamCity在编译的时候就报错了,找不到“图片上传成功”这个字符串的,这个时候我就确定了我的假设“ TeamCity编译selenium脚本,对于上传窗口处理只支持sendKeys的使用,不支持模拟人为按下Enter键和使用autoIt等操作”这个假设

时间: 2024-10-01 00:22:57

TeamCity编译执行selenium上传窗口脚本缺陷的相关文章

Selenium上传文件方法总结

Web上本地上传图片,弹出的框Selenium是无法识别的,也就是说,selenium本身没有直接的方法去实现上传本地文件,这里总结了两种上传文件的方式. 一.利用Robot类处理文件上传. 其大致流程可以为: 1. 利用selenium点击web上本地文件的上传按钮: 2. 在弹出的弹框中,文件路径输入框默认的是光标的聚焦,将文件在磁盘上的路径通过拷贝和黏贴的方法写上去. 3. 通过按下回车,默认触发弹框的确定按钮,完成文件上传的功能. 这里以百度首页的利用图片搜索为例: 打开百度首页,搜索按

LoadRunner性能测试-上传文件脚本

LR上传文件脚本详解 脚本 char *fr(char *filename){ longupfile ;    //定义文件句柄 intcount ;      //定于文件长度 intnFileLen;    //定义文件长度 char*buffer; upfile= fopen(filename,"rb"); //以只读方式打开二进制文件,将upfile指向该文件 fseek(upfile,0,2);          //将文件指针移动到文件尾 nFileLen= ftell(u

Linux FTP自动登陆下载备份,上传文件脚本

使用远程的服务器,对另外一台远程的服务器进行FTP操作,速度要比本地机器操作快很多. 之前写过一篇关于FTP如何手工的在Linux进行远程操作, 今天找到一个自动批量的脚本,感觉很好.满足了我的需要. 我的A网站在香港 我的B服务器Linux的在国内.这样就可以把A网站自动备份到B服务器了. 希望本篇博客能给需要的同学一些帮助. #####从ftp服务器上的/home/data 到 本地的/home/databackup#### #!/bin/bash ftp -n<<! open 192.1

Loadrunner上传文件脚本回放错误解决方法

目前大部分行业系统都开始实现无纸化系统进行电子办公,而做为系统性能测试人员,在做完业务场景调研和各项性能指标制定后,需要开始着手准备各类测试数据和录制测试脚本,有时有些交易会涉及到文件上传下载,这时我们需要验证文件是否上传成功,是否会对服务器网络带宽产生压力,上传后的文件能不能正常被解析,正常展现等各项性能指标验证.因此我们在录制脚本时就需要模拟上传文件事物来进行模拟多用户并发时是否能正常上传处理文件等. 在录制脚本时,因为LR工具的原因会出现回放脚本错误,无法正常上传,其原因种类繁多,下面就根

python +selenium上传文件

python +selenium上传文件 分为2部分 1.是input标签 driver.find_element_by_name("upload").send_keys('C:\\test.txt') 2.非input标签 https://blog.csdn.net/weixin_42024694/article/details/80080629 原文地址:https://www.cnblogs.com/ljf520hj/p/12181098.html

Selenium的文件上传JAVA脚本

在写文件上传脚本的时候,遇到了很多问题,包括元素定位,以及上传操作,现在总结下来以下几点: 1. 上传的控件定位要准确,必要时要进行等待 WebElement adFileUpload = driver.findElement(By.xpath("//input[@type='file']")); 2. 上传操作 String filePath ="D:\\taxonomy\\DB\\HaierTaxonomy.xlsx"; adFileUpload.sendKey

Selenium 上传文件失败,解决办法一

昨个改程序遇到一个问题,UI上面有需要上传文件的地方.但是我不知道怎么让Selenium完成 点击上传文件按钮->在弹出的文件选择窗口中选择路径和文件,点确定. 要知道弹出窗口属于window的范畴,Selenium只能处理Web page. Jeremy原先的代码用的是Selenium RC中的 type “filepath+filename”方法.可不知咋搞的反正运行到这里是进行不下去了. 正好借这个机会来研究一下在Webdriver里怎么做. 我自己写了个网页,里面就一句 我先是用Sele

robot_framework + selenium + 上传本地文件+win7 32位

1.下载与安装AutoIt v3  地址链接:http://pan.baidu.com/s/1hqsDFBA,我自己是32位的系统,用这个运行可以 2.安装完成后,如下图所示 3. AutoIt Windows Info 用于帮助我们识 Windows 控件信息. Compile Script to.exe 用于将 AutoIt 生成 exe 执行文件. Run Script 用于执行 AutoIt 脚本. SciTE Script Editor 用于编写 AutoIt 脚本 4.上传一个htm

? Windows系统的FTP上传下载脚本 ?

运行环境:windows 脚本功能:从目标系统下载数据库备份文件*.dmp 执行方法:windows任务计划定时调用文件ftp.bat 文件1:ftp.bat echo 开始备份日期: >> log.txt date /t >> log.txt echo 开始时间: >> log.txt time /t >> log.txt echo 删除旧备份 >> log.txt del /Q  E:\ftp\data\* ftp -n -s:"e