一、缘 起

笔者之前一直在Windows环境下编写UI自动化测试脚本,近日在看《京东系统质量保障技术实战》一书中,萌生出在jenkins下构建UI自动化测试的想法

二、思 路

首先,在Linux环境搭建jenkins平台

然后,将脚本上传至Linux服务器

最后,在jenkins平台构建自动化任务

三、说 明

  • Linux环境,Centos7 64位 虚拟机
  • JDK1.8 + jenkins 2.121.2
  • Python3.6 + Selenium 2.5.3 + Phantomjs 2.1.1
  • 注意:

    1. Centos7下默认的Python版本为2.7.5,安装Python3的方法:Centos7:5分钟安装python3.5 并存python2.7,兼容yum及Gnome

    2. Centos7下默认不带pip命令,安装Selenium需要用到pip命令,安装方法:Centos7:3分钟安装pip3

    3. Linux服务器通常为无界面状态,安装浏览器跑UI自动化脚本是不太可能的,解决方法就是用无头浏览器(phantomjs)来代替,何为无头浏览器请读者自行百度,值得注意的是Selenium3.0之后不再支持Phantomjs,故为了在不安装浏览器情况下运行UI自动化脚本,就得安装Selenium3.0之前的版本

四、搭 建

  1. 搭建jenkins平台,详细教程请自行百度,主要步骤如下
# 下载jenkins.war包
wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war
# 直接用java起war包即可
(nohup)java -jar jenkins.war (port=8090)
# nohup 后台运行,port为指定jenkins端口,默认为8080 # 运行起来后,在浏览器输入:http://localhost:808/即可访问jenkins平台



2. Selenium + Phantomjs

# 安装selenium
pip install selenium==2.53.6
# 检查
pip show selenium
>> Name: selenium
>> Version: 2.53.6
>> Summary: Python bindings for Selenium
>> Home-page: https://github.com/SeleniumHQ/selenium/ # 下载phantomjs
mkdir /usr/local/phantomjs/
wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2
# 解压
tar -jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2
# 链接
ln -s /usr/local/phantomjs/phantomjs-2.1.1-linux-x86_64/bin/phantomjs /user/bin/phantosjs
# 检查
phantomjs -v
>> 2.1.1
  1. 脚本说明
  • testBaiduProj

  • baidu.py: 打开百度,输入Python搜索,并截图
#!/usr/bin/python
# coding=utf-8
from selenium import webdriver
from time import sleep
import time, os cur_path = os.path.dirname(__file__)
url = 'http://www.baidu.com'
driver = webdriver.PhantomJS(service_args=['--ignore-ssl-errors=true', '--ssl-protocol=TLSv1'])
# driver = webdriver.Firefox()
driver.get(url)
driver.find_element_by_name("wd").send_keys("Python")
driver.find_element_by_xpath("//*[@id='su']").submit()
sleep(2) assert driver.title == 'Python_百度搜索', 'title错误'
cur_time = time.strftime('%Y-%m-%-d %H_%M_%S')
fp = cur_path + '/pic/'
driver.get_screenshot_as_file(r'./pic/' + cur_time + ' image.png')
sleep(1)
driver.quit()
print('完成!')
  • sendAttEmail.py: 查找最新的一个png截图,自动发邮件
#!/usr/bin/python
#coding=utf-8
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
import datetime
import os
import time def send_att_mail(username, passwd, recv, title, content, fp, mail_host='mail.xxx.com'):
"""
自动发邮件
:param username:
:param passwd:
:param recv:
:param title:
:param content:
:parm fp:
:param mail_host:
:return:
"""
msg = MIMEMultipart()
msg['Subject'] = Header(title, 'utf-8')
msg['From'] = username + "@xxx.com"
msg['To'] = ';'.join(recv)
# msg['Cc'] = ','.join(cc_recv) # 抄送
# 邮件正文
msg.attach(MIMEText(content, 'html', 'utf-8')) # 文本'plain', HTML为'html'
# 构造附件
att = MIMEText(open(fp, 'rb').read(), 'base64', 'utf-8')
att['Content-Type'] = 'application/octet-stream'
att.add_header('Content-Disposition', 'attachment', filename=('%s' % fp.split('/')[-1]))
# encoders.encode_base64(att)
msg.attach(att)
smtp = smtplib.SMTP()
smtp.connect(mail_host)
smtp.starttls()
smtp.login(username, passwd)
smtp.sendmail(username + "@xxx.com", recv , msg.as_string())
smtp.quit() # 邮件内容(文本/HTML)
content = """
<p>
<font size="4" face="SimSun">
<p>你好,请查收邮件~</p>
</font>
</p>
""".format(start, end, tomorrow)
# 邮件标题
title = '百度测试报告' email_user = '账号' # 发送者账号
email_pwd = '密码' # 发送者密码
# 接收者邮件列表
recv_lst = ['xx@xxx.com']
len(cc_recv_lst)))
time.sleep(1)
# 将pic文件夹里面的png文件名称生成list,对列表排序,选择最后一个即为最新一个png截图
png_lst = os.listdir('./pic')
png_lst.sort()
filename = './pic/' + png_lst[-1]
send_att_mail(email_user, email_pwd, recv_lst, title, content, filename)
print('邮件发送成功!')
time.sleep(1)

五、构 建 任 务

  • 构建自由风格项目
  • 填写项目名和说明,其他均为默认选项
  • 构建部分选择 Execute shell,具体脚本如下
#!/usr/bin/bash
cd /home/lid/pyproj/testBaiduProj/
python baidu.py
sleep 1
python sendAttEmail.py
  • 保存项目,并构建

  • 初步OK,然而 ~ ~ ~

六、问 题

  1. phantomjs情况下,用.click()方法报错,但是用.submit()方法却正常
  2. phantomjs情况下,find_element_by_id('xx').send_keys('xx'),报同样错误,但是find_element_by_name('xx').send_keys('xx'),却不报错
Traceback (most recent call last):
File "baidu.py", line 17, in <module>
driver.find_element_by_id("su").click()
File "/usr/local/python3/lib/python3.6/site-packages/selenium/webdriver/remote/webelement.py", line 72, in click
self._execute(Command.CLICK_ELEMENT)
File "/usr/local/python3/lib/python3.6/site-packages/selenium/webdriver/remote/webelement.py", line 461, in _execute
return self._parent.execute(command, params)
File "/usr/local/python3/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 236, in execute
self.error_handler.check_response(response)
File "/usr/local/python3/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py", line 192, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.ElementNotVisibleException: Message: {"errorMessage":"Element is not currently visible and may not be manipulated","request":{"headers":{"Accept":"application/json","Accept-Encoding":"identity","Connection":"close","Content-Length":"81","Content-Type":"application/json;charset=UTF-8","Host":"127.0.0.1:36212","User-Agent":"Python-urllib/3.6"},"httpVersion":"1.1","method":"POST","post":"{\"id\": \":wdc:1532881699579\", \"sessionId\": \"670f3e90-934c-11e8-accd-f1bcf1bf551c\"}","url":"/click","urlParsed":{"anchor":"","query":"","file":"click","directory":"/","path":"/click","relative":"/click","port":"","host":"","password":"","user":"","userInfo":"","authority":"","protocol":"","source":"/click","queryKey":{},"chunks":["click"]},"urlOriginal":"/session/670f3e90-934c-11e8-accd-f1bcf1bf551c/element/:wdc:1532881699579/click"}}
Screenshot: available via screen

七、总 结

Jenkins下构建UI自动化测试,看似简单,实则里面无数坑,笔者遇到的如:selenium3.0以上不支持phantomjs问题、Linux环境下安装Python3但是输出中文报错问题、在Linux环境下安装pip3命令无效问题、自动发邮件/添加附件问题,等等,只有你亲自尝试一遍,才能体会所有的不起眼都不容被忽视~

~

~

~

不积跬步,无以至千里

Jenkins下构建UI自动化之初体验的更多相关文章

  1. grunt 构建工具(build tool)初体验

    操作环境:win8 系统,建议使用 git bash (window下的命令行工具) 1,安装node.js 官网下载:https://nodejs.org/  直接点击install ,会根据你的操 ...

  2. day12—jQuery ui引入及初体验

    转行学开发,代码100天——2018-03-28 按照所下载教学视频,今天已进行到jQuery UI的学习中.注:本人所用教学视频不是太完整,介绍的内容相对简单,有些只是带过.其他时间中,仍需继续针对 ...

  3. gradle的安装,配置,构建,研究,初体验......(入职一周研究的第一个大知识点)

    (1)Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具.它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置.更 ...

  4. 三 APPIUM Android自动化 测试初体验

    1.创建一个maven项目 成功新建工程: 编辑pom.xml,在<dependencies></dependencies>下添加appium相关依赖: <depende ...

  5. 二 APPIUM Android自动化 测试初体验

    本文转自:http://www.cnblogs.com/sundalian/p/5629358.html 1.创建一个maven项目 成功新建工程: 编辑pom.xml,在<dependenci ...

  6. testng+ant+jenkins持续集成UI自动化

    一.环境搭建 1. 安装testNG插件到eclipse. -) 选择菜单 Help /Software updates / Find and Install. -) 点击add button然后在l ...

  7. IDEA+java通过SSH来进行分析日志,实现UI自动化动态验证码登录

    在我写自动化脚本的时候是要真实发送验证码才能往下进行UI自动化 思路:验证码会显示在哪些地方,手机短信?数据库存储?日志? 完整代码如下: package guanyu.tools; import c ...

  8. java -ui自动化初体验

    本文来讲一下ui自动化的环境搭建,以及最初级的打开网页操作 说起ui自动化,想想大概是前年的时候我开始接触和学习的吧,怎么说呢无论是pc还是app,ios还是android,确实很神奇而且很华丽,但是 ...

  9. Jenkins+PMD构建自动化静态代码检测

    前言:软件缺陷是不可避免的,要尽量减少错误并提高软件质量,主要有两在类技术,即缺陷预防和缺陷检测 缺陷预防包括编写更好的设计规范.实施代码审核制度.运行代码静态分析工具.运行单元测试等 PMD是一种开 ...

随机推荐

  1. 求最长公共子序列-DP问题

    Longest common subsequence problem The longest common subsequence (LCS) problem is the problem of fi ...

  2. Junit 单元测试在 intelliJ IDEA 中的安装

    1.为什么使用Junit我们都知道,main 方法是一个程序的入口,通常来说,没有main方法,程序就无法运行.我们经常会写一些class文件(如下图所示),他们并没有自己的main方法.那么我们如何 ...

  3. shortcuts 快捷键

    Home » Linux » shortcuts 快捷键 Page Updated  2018-12-12 19:23 shortcuts 快捷键 移动光标 Ctrl – a :移到行首 Ctrl – ...

  4. js 四舍五入实现

    js Number.prototype.toFixed 进行的舍入的算法没研究明白,应该不是四舍六入五成双,当然也不是四舍五入 下面是chrome与excel的对比 修改完之后的结果 对于“问题数据” ...

  5. 从假图片到假新闻,AI就这样“控制”了我们

    在评论某位新蹿红的明星时,围观群众总是习惯性地先从长相上来判定,如"像周润发和梁朝伟的合体"."刘德华和郭富城的合体"等--反正比"黄渤和王宝强的合体 ...

  6. Gradle的依赖方式——Lombok在Gradle中的正确配置姿势

    写过java的都知道,lombok几乎在项目中处于不可或缺的一部分,但是lombok在Gradle的项目中配置并非人人都知道. 很多人在项目依赖中直接这样写 1 compile "org.p ...

  7. Pro SQL Server Internal (Dmitri Korotkev)电子书翻译P8-14(12w)

    数据行与数据列 数据库的控件逻辑上分成8KB的页,这些页从0开始,连续排序,对特定的文件ID和页码有借鉴意义.页码编号一定是连续的,当SQL服务器中的数据库文件增加时,新的数据页从最高的页码开始编码. ...

  8. 压力测试(二)-Jmeter基本介绍

    1.Jmeter基本介绍和使用场景 简介 1.压测不同的协议和应用 1) Web - HTTP, HTTPS (Java, NodeJS, PHP, ASP.NET, …) 2) SOAP / RES ...

  9. APScheduler使用总结

    安装 pip install apscheduler APScheduler组件 1.triggers(触发器) 触发器中包含调度逻辑,每个作业都由自己的触发器来决定下次运行时间.除了他们自己初始配置 ...

  10. Java技术-3-Java程序基本结构

    下面是一个完整的Java程序, /** * 可以用来自动创建文档的注释 */ public class Hello { public static void main(String[] args) { ...