2015-07-04 18:05 编写本文

  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等操作”这个假设
 
  2015-07-17 18:05 有了新发现
 
  在上次发现后,为了继续证明是teamCity没有在前台打开一个浏览器,导致运行失败而不是脚本本身有问题,我直接通过远程连接到服务器,通过cmd的方式启动我的脚本:mvn test,如下图,发现执行过程中可以弹出浏览器并且结果是正确的
 
  我很奇怪为什么会这样,于是我观察了当人为启动项目脚本,自动打开一个浏览器的时候,任务管理器中浏览器的进程用户名当前系统用户,如图1;当teamCity编译脚本打开浏览器的时候,任务管理器中浏览器的进程用户名为空或者为system,如图2
图1
图2
  于是我猜测是不是在teamCity编译脚本的时候,打开浏览器的权限不足导致的,因为人为启动脚本和teamCity编译自动启动脚本,在任务管理器中同样的进程用户名不同,不过,思考下就否定了这个,因为人为启动脚本,是我通过帐号远程到服务器,于是打开浏览器进程的用户名自然就是我正在使用的帐号名xxy,但是teamCity编译的时候,teamCity已经安装在服务器上了,所以启动浏览器进程自然就是system了。
  对于这个问题,我还是在探索中,如果你有答案,可以给我评论留言
 

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

  1. Selenium 处理windows 上传 窗口

    selenium无法控制windows窗口,故需要引用第三方工具autoit. 在如下网址,下载并安装 http://www.autoitscript.com/site/autoit/ 安装autoi ...

  2. Selenium上传文件方法总结

    Web上本地上传图片,弹出的框Selenium是无法识别的,也就是说,selenium本身没有直接的方法去实现上传本地文件,这里总结了两种上传文件的方式. 一.利用Robot类处理文件上传. 其大致流 ...

  3. Linux FTP 上传一键脚本

    下面来介绍一下这个 FTP 上传一键脚本 ftp_upload.sh. 用途:用于在Linux系统下搭建FTP客户端向FTP服务器端上传文件: 总结一下 ftp_upload.sh 特点:1.支持文件 ...

  4. 让Jenkins执行GitHub上的pipeline脚本

    本文是<Jenkins流水线(pipeline)实战>系列的第二篇,上一篇搭建好了Jenkins环境并执行了一个简单的pipeline任务,当时我们直接在Jenkins网页上编写pipel ...

  5. mysql数据库,如何在登录mysql之后执行操作系统上的SQL脚本?

    需求描述: 通过mysql客户端登录到mysql数据库,如何执行操作系统上的SQL脚本文件呢? 操作过程: 1.编写测试脚本文件 [mysql@redhat6 scripts]$ cat SeCoun ...

  6. windows下上传shell脚本不能运行—将dos模式修改为unix 文件格式

    windows下上传shell脚本至linux,其格式将为dos.dos模式的shell脚本将不能再linux下正确运行,需要修改文件模式为unix. 1 查看文件模式方法 linux服务器上,用vi ...

  7. Java+Selenium 上传文件,点击选择“浏览文件”按钮,报错invalid argument

    Java+Selenium 上传文件,点击选择"浏览文件"按钮,报错invalid argument 解决代码: Actions action=new Actions(driver ...

  8. Selenium的文件上传JAVA脚本

    在写文件上传脚本的时候,遇到了很多问题,包括元素定位,以及上传操作,现在总结下来以下几点: 1. 上传的控件定位要准确,必要时要进行等待 WebElement adFileUpload = drive ...

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

    昨个改程序遇到一个问题,UI上面有需要上传文件的地方.但是我不知道怎么让Selenium完成 点击上传文件按钮->在弹出的文件选择窗口中选择路径和文件,点确定. 要知道弹出窗口属于window的 ...

随机推荐

  1. python3+pyzbar+Image 进行图片二维码识别

    1.前言 最近公司有个项目要写个程序自动识别客户提交照片里的二维码,一接到这个任务马上就想到了用Python这个万能的工具! 2.搜寻 首先在网上到处找了很多“灵感”,看看其他人都会用什么包来完成这个 ...

  2. java->php之在线子域名查询-接口光速版

    因为不懂java,所以 用php重写了大佬的 在线子域名查询-接口光速版 http://sbd.ximcx.cn/  这是大佬的 然后 改一下 ,用php 其实就是改了几行代码而已,jquery和aj ...

  3. python学习之路-基本数据类型1 变量的概念、数字、字符串

    1 什么是数据类型? 每种编程语言都有自己的数据类型,用于标识计算机可以认识的数据,Python中主要的数据类型为字符串,整数,浮点数,列表,元祖,字典,集合七种主要的数据类型,其中以列表,字典为最主 ...

  4. 20155217 实验四 Android程序设计

    20155217 实验四 Android程序设计 任务一: 完成Hello World, 要求修改res目录中的内容,Hello World后要显示自己的学号. R.java文件是定义该项目所有资源的 ...

  5. rman中 Backup Set 与 Image Copy 优缺点比较

    Backup Set: 一个备份集中可以包含多个数据文件,存储High Water Mark 下的数据块,并且可以采用压缩方式进行,故大小要小于原始数据文件的大小.restore与 recover的开 ...

  6. 【LG4294】[WC2008]游览计划

    [LG4294][WC2008]游览计划 题面 洛谷 bzoj 题解 斯坦纳树板子题. 斯坦纳树的总结先留个坑. 代码 #include <iostream> #include <c ...

  7. HDU 6086 Rikka with String

    Rikka with String http://acm.hdu.edu.cn/showproblem.php?pid=6086 题意: 求一个长度为2L的,包含所给定的n的串,并且满足非对称. 分析 ...

  8. 没有执行过rm -rf /*的开发不是好运维

    没有执行过rm -rf /*的开发不是好运维 起因 突然收到用户反馈说网站在手机端打开是白屏, 很奇怪的问题. 在电脑端试了下,确实也是白屏,HTML加载进来了,好像有个核心JS加载失败. 看到一个错 ...

  9. Shell if 判断语句参数

    [ -a FILE ] 如果 FILE 存在则为真. [ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真. [ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真. [ ...

  10. C#之#if #endif的简单用法

    有时候我们看到别人的代码中有#if #endif,其实这是通过不同版本来选择运行哪段代码,和咱们的if,else是一样的.下面看下简单的用法 #if DEBUG txt_display.Text = ...