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

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

  TeamCity编译selenium脚本,对于上传窗口处理只支持sendKeys的使用,不支持模拟人为按下Enter键和使用autoIt等操做,即便本地调试经过的脚本,提交编译执行后,也是报错,缘由是teamCity编译执行脚本的过程当中,只是后台启动相应浏览器的driver,和浏览器对应的进程,没有和人为操做同样的真实在前台打开一个浏览器界面致使的。发现这个缺陷还得从编写上传课件测试用例脚本提及。api

    一个上传课程测试用例,功能测试是,填写课程的基本信息后,上传课程的图片,如图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了。
  对于这个问题,我仍是在探索中,若是你有答案,能够给我评论留言
 
若是本文对你有帮助,可考虑自愿为做者打赏或捐助
 
相关文章
相关标签/搜索