热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Maven项目的配置开发脚本详解

Maven项目前两篇文章我们完成了eclipsemaven插件的配置,今天我们来讲解Maven项目的配置开发一个简单的脚本。maven项目的配置开发一个简单的脚本大家可以在文末找到

Maven项目

前两篇文章我们完成了 eclipse maven 插件的配置,今天我们来讲解Maven项目的配置开发一个简单的脚本。

maven项目的配置开发一个简单的脚本

大家可以在文末找到辅导员要安装包,只要装了github就可以导入享受新的服务。

技术分享图片
导入的maven项目如上图appiumtraining项目,我们打开pom.xml文件。
技术分享图片
上面这段以后在代码中有中文情况下可以在jenkins job运作下正常显示中文。
appium需要的jar如下是io.appium,这个是我们需要的,它同时也会去下载selenium对应版本的,如果要最新的可以在version中用LATEST;

技术分享图片
你在本地仓库中也会看到目前最新的版本是什么,如果下载不了的话可以联系辅导员。

然后解压替换到自己的本地maven路径,如图:
技术分享图片
自此以上环境都配置完毕,不过鉴于现在流行的模拟器,这里也可以试用真机,本文中是使用Genymotion。

接下来我们用一个计算器开始我们的自动化之旅

打开我们的appium server然后锁定package和activity名。

注意android自动化要了解被测对象的package和activity名,但不知道package和activity怎么办?

安装apk后打开,用%android_home%/tools下的hierachyviewer.bat来查看。

技术分享图片
技术分享图片
然后重要的一点是怎么样抓到元素呢?

我们可以使用%ANDROID_HOME%/tools/UIAutomator Viewer来抓取
技术分享图片
脚本中需要设置很多capabilities;
技术分享图片

在这里推荐一个软件测试交流群,QQ:624830685,群中会不定期的分享软件测试资源和测试面试题以及行业资讯,大家可以在群中积极交流技术。另外还有技术大佬为你解答疑问。

起因
Selenium本身是不支持HTTP请求抓取的,因为其团队认为这个不是selenium要解决的问题(确实也是)。所以推荐使用一个相关联的项目 – BrowserMobProxy。
具体项目首页见相关GitHub。

尝试
因为项目需要,所以就研究了下BrowserMobProxy。它其实是一个java实现的开源代理项目,它与普通的代理不同之处在于:

它支持REST API接口(可以通过http请求来动态创建代理服务)
默认启动的是一个代理Manager,它会管理N多个代理服务(我们真正使用的就是这个代理服务)
可以支持动态的代理配置
一张图看懂BrowserMobProxy的业务逻辑。
技术分享图片
即在使用代理之前,需要先启动代理Manager;而这个Manager提供了REST API接口,支持动态创建代理服务。(它会维护一批申请过的代理服务)之后我们使用的其实都是新申请的代理服务。(所以它并不是一个代理实例,而是一个代理管理服务)
在这里向大家推荐一个学习资料群:175317069

使用
要使用BrowserMobProxy首先你需要启动它的代理Manager。有3种方式:

直接通过bin目录下的脚本文件启动(如:browsermob-proxy.bat)
在程序中动态执行脚本文件
JAVA项目可以导入到项目中通过SDK启动
BrowserMobProxy的代理Manager启动后,就可以向它申请具体的代理服务了。主要有2种方式:

REST API方式
JAVA的SDK方式
由于这里是讲Python相关的,所以后面只讲REST API方式。启动代理Manager和申请代理服务的代码如下:

BROWSERMOBPROXY = r"D:\browsermob-proxy-2.1.1\bin\browsermob-proxy.bat"
server = browsermobproxy.Server(BROWSERMOBPROXY, {‘port‘: 8080}) # 初始化一个代理Manager服务,并监听8080端口
server.start() # 启动代理Manager服务
proxy = server.create_proxy() # 向代理Manager服务申请一个代理服务,会使用默认端口8081
print(proxy.port)


  • 1

  • 2

  • 3

  • 4

  • 5

上述代码是在程序中执行了BrowserMobProxy的启动脚本,然后申请了一个代理服务。当然,你还可以先手动启动BrowserMobProxy,接着在程序中就可以直接申请代理服务即可。(也可以是远程服务器上的地址)

proxy = browsermobproxy.Client(‘http://localhost:8080‘) # 向已有代理Manager服务申请一个代理服务
DEMO


  • 1

  • 2

光有上面的代码还不够,我们需要和Selenium代理整合之后,才能知道是否可以满足我们的需求。在具体执行代码之前你需要安装2个前提库:

pip install selenium
pip install browsermob


  • 1

  • 2

然后就可以执行如下代码了。

def set_proxy_for_ff():
profile = webdriver.FirefoxProfile()
driver = webdriver.Firefox(firefox_profile=profile, proxy=proxy.selenium_proxy()) # 配置selenium使用指定的代理服务
proxy.new_har("test", optiOns={‘captureContent‘: True, ‘captureHeaders‘: True}) # 开启代理监控,如果不监控会拿不到请求内容
driver.get("http://www.baidu.cn") # 访问页面
# TODO:其它页面操作
proxy.wait_for_traffic_to_stop(1000, 6000) # 停止代理监控
print(proxy.har) # 打印请求日志信息


def set_proxy_for_chrome():
dc = webdriver.DesiredCapabilities
proxy.add_to_capabilities(dc)
driver = webdriver.Chrome(desired_capabilities=dc) # 配置selenium使用指定的代理服务
proxy.new_har("test", optiOns={‘captureContent‘: True, ‘captureHeaders‘: True}) # 开启代理监控,如果不监控会拿不到请求内容
driver.get("http://www.baidu.cn") # 访问页面
# TODO:其它页面操作
proxy.wait_for_traffic_to_stop(1000, 6000) # 停止代理监控
print(proxy.har) # 打印请求日志信息


def set_proxy_for_phantomjs():
dc = webdriver.DesiredCapabilities
proxy.add_to_capabilities(dc)
driver = webdriver.PhantomJS(desired_capabilities=dc) # 配置selenium使用指定的代理服务
proxy.new_har("test", optiOns={‘captureContent‘: True, ‘captureHeaders‘: True}) # 开启代理监控,如果不监控会拿不到请求内容
driver.get("http://www.baidu.cn") # 访问页面
# TODO:其它页面操作
proxy.wait_for_traffic_to_stop(1000, 6000) # 停止代理监控
print(proxy.har)


  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

  • 14

  • 15

  • 16

  • 17

  • 18

  • 19

  • 20

  • 21

  • 22

  • 23

  • 24

  • 25

  • 26

  • 27

  • 28

  • 29

  • 30

如果一切正常的话,这3个函数都是可以执行的。前提是对应的Webdriver和浏览器得先配置好了。如果你是在远程服务器上启动的代理Manager,记得关掉防火墙。

填坑
这个是针对Python用户的,如果你是java用户则没有这样的苦恼,因为这些功能jar包的SDK中都已经支持了。

启动代理Manager时指定参数
由于支持BrowserMobProxy的Python库只有一个在pypi上。而该库虽然可以支持基本的使用,但是如果你希望配置更多的参数,则需要自己动手来解决。因为在Python的browsermobproxy库中启动代理Manager时未提供指定启动参数的选项,所以如果你需要在程序里启动代理Manager时带上参数,则有3种方式可以实现:

在启动脚本中添加固定参数
修改Python库支持指定参数
提供一个带参数的命令
接着,就来逐一看下如何去实现。如果是第一种则需修改对应的启动脚本(linux或windows),并设置固定的参数。

@REM -- Regular WinNT shell
set CMD_LINE_ARGS=%* -proxyPortRange 9000-9999 -ttl 600
goto WinNTGetScriptDir
上面是windows启动脚本browsermob-proxy.bat的修改之处,在第二行内容后追加了 -proxyPortRange 9000-9999 -ttl 600参数。如果是linux系统,则修改browsermob-proxy文件,具体修改的内容如下:
exec "$JAVACMD" $JAVA_OPTS $EXTRA_JVM_ARGUMENTS -classpath "$CLASSPATH" -Dapp.name="browsermob-proxy" -Dapp.pid="$$" -Dapp.repo="$REPO" -Dbasedir="$BASEDIR" net.lightbody.bmp.proxy.Main "$@" -proxyPortRange 9000-9999 -ttl 600



  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

  • 14

  • 15

同样是在最后一行追加了指定的参数内容。如果选择第二种方式则需要修改Python的browsermobproxy库(这里不建议),因为第三种方式可以更好的解决这个问题。即把启动字符串修改为一个列表即可。

# 原来的启动脚本路径
BROWSERMOBPROXY = r"D:\browsermob-proxy-2.1.1\bin\browsermob-proxy.bat"
# 修改为如下
BROWSERMOBPROXY = [r"D:\browsermob-proxy-2.1.1\bin\browsermob-proxy.bat", ‘-proxyPortRange 9000-9999‘, ‘-ttl 600‘]



  • 1

  • 2

  • 3

  • 4

  • 5

申请代理服务时指定参数
可以指定代理Manager的启动参数后,还需要可以指定代理的启动参数。比如:忽略HTTPS的认证错误。而这里就真的需要修改Python库了。具体的代码修改如下:

# browsermobproxy\client.py 第32行
resp = requests.post(‘%s/proxy%s‘ % self.host, urlparams)
# 修改为
resp = requests.post(‘%s/proxy‘ % self.host, data=params)


  • 1

  • 2

  • 3

  • 4

这个可能是作者开发的失误,因为POST正常是不支持URL参数接收。作者可能是希望能打印出来,所以拼接成url串,只是在POST时忘记转回了。

完整代码
from selenium import webdriver
import browsermobproxy

Required:
pip install selenium
pip install browsermob

BROWSERMOBPROXY = r"D:\browsermob-proxy-2.1.1\bin\browsermob-proxy.bat"

server = browsermobproxy.Server(BROWSERMOBPROXY, {‘port’: 8080}) # 初始化一个代理Manager服务,并监听8080端口
server.start() # 启动代理Manager服务
proxy = server.create_proxy() # 向代理Manager服务申请一个代理服务,会使用默认端口8081
print(proxy.port)

#proxy = browsermobproxy.Client(‘http://localhost:8080’) # 向已有代理Manager服务申请一个代理服务

def set_proxy_for_ff():
profile = webdriver.FirefoxProfile()
driver = webdriver.Firefox(firefox_profile=profile, proxy=proxy.selenium_proxy()) # 配置selenium使用指定的代理服务
proxy.new_har(“test”, optiOns={‘captureContent’: True, ‘captureHeaders’: True}) # 开启代理监控,如果不监控会拿不到请求内容
driver.get(“http://www.baidu.cn”) # 访问页面
# TODO:其它页面操作
proxy.wait_for_traffic_to_stop(1000, 6000) # 停止代理监控
print(proxy.har) # 打印请求日志信息

def set_proxy_for_chrome():
dc = webdriver.DesiredCapabilities
proxy.add_to_capabilities(dc)
driver = webdriver.Chrome(desired_capabilities=dc) # 配置selenium使用指定的代理服务
proxy.new_har(“test”, optiOns={‘captureContent’: True, ‘captureHeaders’: True}) # 开启代理监控,如果不监控会拿不到请求内容
driver.get(“http://www.baidu.cn”) # 访问页面
# TODO:其它页面操作
proxy.wait_for_traffic_to_stop(1000, 6000) # 停止代理监控
print(proxy.har) # 打印请求日志信息

def set_proxy_for_phantomjs():
dc = webdriver.DesiredCapabilities
proxy.add_to_capabilities(dc)
driver = webdriver.PhantomJS(desired_capabilities=dc) # 配置selenium使用指定的代理服务
proxy.new_har(“test”, optiOns={‘captureContent’: True, ‘captureHeaders’: True}) # 开启代理监控,如果不监控会拿不到请求内容
driver.get(“http://www.baidu.cn”) # 访问页面
# TODO:其它页面操作
proxy.wait_for_traffic_to_stop(1000, 6000) # 停止代理监控
print(proxy.har) # 打印请求日志信息

if ‘main’ == name:
set_proxy_for_ff()
set_proxy_for_chrome()
set_proxy_for_phantomjs()

在这里推荐一个我自己创建的软件测试交流群 ,QQ:642830685,群中会不定期的分享软件测试资源,测试面试题以及行业资讯,大家可以在群中积极交流技术。风里雨里我在群中等你。


推荐阅读
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文内容为asp.net微信公众平台开发的目录汇总,包括数据库设计、多层架构框架搭建和入口实现、微信消息封装及反射赋值、关注事件、用户记录、回复文本消息、图文消息、服务搭建(接入)、自定义菜单等。同时提供了示例代码和相关的后台管理功能。内容涵盖了多个方面,适合综合运用。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文讲述了作者通过点火测试男友的性格和承受能力,以考验婚姻问题。作者故意不安慰男友并再次点火,观察他的反应。这个行为是善意的玩人,旨在了解男友的性格和避免婚姻问题。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
author-avatar
必须滴958_534
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有