FAQ Overview

软件工具 » Allure 2

未使用CI工具集成Aluure运行测试用例并生成Allure报告,多次执行后,trends是空白的,未展示出期望的趋势图

问题描述

未使用CI工具集成Aluure运行测试用例并生成Allure报告,多次执行后,trends是空白的,未展示出期望的趋势图

问题原因

非CI工具,是通过命令 allure serve 展示报告 或者 命令allure genereate 和 alllure open 去生成报告,并打开报告,不会把上一次的报告(allure-report)中的history信息copy到当前测试结果文件夹中(./allure-results/ )

解决方案

mvn test 之后,allure.bat  generate ./allure-results/ 此命令会 默认在当前文件夹下生成report 文件(allure-report),
将allure-report中的文件夹history以及其下文件,copy到结果文件夹里(./allure-results/ )
在次mvn test,allure.bat generate ./allure-results/
打开报告 allure.bat open ./allure-report (即可见趋势图)

作者: 胡男
更新时间:2018-10-12 15:55


软件工具 » phpMyFAQ

用户注册或添加成功后,无法登录。

问题描述

注册用户成功,或者在管理后台添加用户成功。但登录时失败。

解决方案

方案一:激活用户
注册用户后,没有激活。点击【编辑】。

激活用户

方案二:添加权限
用户注册成功后,没有分配相应权限。

作者: 李云
更新时间:2018-05-18 11:20


问答页,显示时间和当前时间相差 6 个小时

问题描述

phpMyFAQ 版本:phpMyFAQ 2.9.10
现象:在前台提交问答或在管理后台新增问答后,问答的创建时间、更新时间和服务器本地时间相差 6 个小时。
示例:在 2018-04-21 09:59 新增一条问答,数据库记录如下。

解决方案

方案一:修改程序的时区设置
修改根目录(安装路径)下的 config/constants.php 文件,将时区设置为中国时区,修改后如下:

/**
 * Set the string below according to your users (main) timezone.
 * For your convenience find below the list of the available timezones:.
 *
 * http://www.php.net/manual/en/timezones.php   
 *
 * Note: a wrong timezone setting could affect on-line users tracking as well as
 *       any filter criterion built using a date.
 * Note: timezone is a global setting i.e. no per-user setting. 
 *
 * @var string
 */
// define('PMF_DATETIME_TIMEZONE_DEFAULT', 'Europe/Berlin');
define('PMF_DATETIME_TIMEZONE_DEFAULT', 'Asia/Shanghai');

作者: 李云
更新时间:2018-05-18 11:20


上传图片时,提示 Image too big

问题描述

新增问答,上传图片时,提示“Image too big”

解决方案

修改附件最大限制,比如修改为 1 兆字节(mb),即 1048576 字节(b)

作者: 李云
更新时间:2018-05-18 11:21


【设置】 新用户注册后收不到邮件

问题描述

phpMyFAQ 版本:2.9.10
新用户注册后,管理员未收到提醒邮件。
管理员激活新用户,新用户未收到提醒邮件(邮件内容包括登录名和密码)。

解决方案

 方案一:在【设置 - 系统设置 - Mail setup】里使用远程 SMTP 服务器(以 QQ 邮箱为例)
1、查询 SMTP 的设置信息,可以从自己的邮箱设置里查找【QQ 邮箱为设置 - 账户】:
SMTP 设置信息:

2、填写远程 SMTP 信息:密码为生成的授权码。

3、可以看到这里没有设置端口号的地方。查看 phpMyFAQ 源码得知,代码里使用了 PHP 第三方类库 swiftmailer 的默认端口号 25 ,但我们这里需要设置端口号为 465,协议为 SSL。
编辑 %phpMyFAQ_HOME%/inc/PMF/Mail/SwiftSMTP.php , 将 Swift_SmtpTransport::newInstance($server)  修改为 Swift_SmtpTransport::newInstance($server,465,"ssl") ,修改后如下:

    /**
     * @param $server
     * @param $user
     * @param $pass
     */
    public function setAuthConfig($server, $user, $pass)
    {
        unset($this->mailer);

        $this->mailer = Swift_Mailer::newInstance(
            Swift_SmtpTransport::newInstance($server,465,"ssl")
                ->setUsername($this->user = $user)
                ->setPassword($pass)
        );
    }

类库相关代码:%phpMyFAQ_HOME%/inc/libs/swiftmailer/classes/Swift/SmtpTransport.php

    /**
     * Create a new SmtpTransport instance.
     *
     * @param string $host
     * @param int    $port
     * @param string $security
     *
     * @return self
     */
    public static function newInstance($host = 'localhost', $port = 25, $security = null)
    {
        return new self($host, $port, $security);
    }

方案二:使用 CentOS 默认的 SendMail 邮件服务器

# 启动 sendmail
service sendmail start

经测试,如果收件方为 QQ 邮箱,可以收到服务器代发的邮件,位于垃圾箱中。但 163 邮箱和新浪邮箱,直接收不到邮件。另外,代发的邮件本身不安全,所以建议使用方案一。


作者: 李云
更新时间:2018-05-18 11:21


修改会话失效期

问题描述

phpmyfaq 默认的会话失效时间为 30 分钟,有时编辑 FAQ 时,超过 30 分钟会话过期会导致编辑内容无法保存。
问题环境:phpMyFAQ 2.9.10
关键字:您会话的失效期

解决方案

1、修改文件 %phpMyFAQ_HOME%/config/constants.php 中的配置(大约 48 行)

# 修改前:30 分钟
define('PMF_AUTH_TIMEOUT', 30);
# 修改后:24 小时
define('PMF_AUTH_TIMEOUT', 1440);

参考资料:
1、User login - dont time out their login session

作者: 李云
更新时间:2018-05-18 11:21


phpmyfaq 开启HTTPS访问

作者: 李云
更新时间:2018-05-18 11:19


软件工具 » ReadyAPI(SoapUI)

SoapUI 接口请求报错,但 PostMan 访问正常。

问题描述

问题背景
测试环境,有多套分支测试环境,每套环境都使用了 Nginx 做域名和请求代理。
现象描述

接口返回500,但接口请求行、请求正文、请求类型都正确,登录相关服务,查看日志,没有日志输出。
接口返回值

{
   "code": "50000",
   "message": "系统异常",
   "data": null
}

解决方案

方案一:host 配置错误
(1)配置到了其他分支测试环境,将 Host 配置修改正确。
(2)开启 Fiddler 的情况下,切换了 Host 。因为 Fiddler 有 host 缓存,所以实际请求的还是以前映射的 IP 。

作者: 李云
更新时间:2018-05-18 11:22


为什么新建的子资源(child resource)会有默认参数?为什么删除一个 request 的参数,另一个不相关的 request 的参数也被删除了?

问题描述

现象1:新建一个子资源,默认带上了其他请求的参数。新建资源 1 ,默认带上了资源 2 的参数。
现象2:删除一个 Resource 的参数,其他 Resource 的参数被同步删除了。删除资源 1 的参数,资源 2 的参数也被删除了。

解决方案

问题原因
SoapUI 的参数从上到下分为 Resource Params(p1)、Method Params(p2)、Request Params(p3)。具体原因见实验1和实验2。

结合推论1和推论2得出以下建议方案(一般情况下):
在 Method 上新增、修改、删除参数名称,不要在 Resource 和 Request 上新增、修改、删除参数名称,否则会出现不同 method 下的 request 参数无法隔离。
注:Method 上的参数作用域为 Method 本身及其直接子集(直接子集指属于该Method 的所有Request,比如下图中 r1-m1 的直接子集为 r1-m1-q1)。

实验1:
在 r1 或 r1-m1-q1 或 r1c1-m1-q1 任何一个上新增参数 param-r1 ,则有且仅有 r1 、 r1-m1-q1 、 r1c1-m1-q1 上都有参数 param-r1 。
在 r1 或 r1-m1-q1 或 r1c1-m1-q1 任何一个上删除参数 param-r1 ,则有且仅有 r1 、 r1-m1-q1 、 r1c1-m1-q1 上的参数 param-r1 被删除。
推论1:
resource 上的参数和 request 上的参数保持跨层级双向同步。
实验2:
在 r1-m1 上新增一个参数 param-r1-m1 ,则有且仅有 r1-m1 、 r1-m1-q1 上有参数 param-r1-m1 。
在 r1-m1-q1 上删除参数 param-r1-m1 ,则有且仅有  r1-m1 、 r1-m1-q1 上的参数 param-r1-m1 被删除。
在 r1-m1 上删除参数 param-r1-m1 ,则有且仅有  r1-m1 、 r1-m1-q1 上的参数 param-r1-m1 被删除。
推论2:
新增、删除 method 参数会同步至 request 上,request 上删除 method 参数会同步至 method 上。

作者: 李云
更新时间:2018-06-14 11:19


接口请求正文中包含中文,请求报错或者中文乱码。导入项目提示无效项目。

问题描述

1、现象一
接口请求正文中包含了中文,比如请求正文是Json,Json的某个节点值为中文字符串。当发送请求时,请求报错或者实际请求的正文中中文乱码。

2、现象二
导入一个项目,提示项目是无效项目:
Invalid project file: E:\04WorkSpace\soapui\Study\Study-soapui-projec11t.xml
Please try again.

解决方案

特别说明:
针对现象二的无效项目,如果已经提示导入无效,那么说明该项目文件已经损坏(文件内容中中文乱码),所以导入时解析失败。
为了防止这种情况的发生,需要在开始项目前(创建项目前),就按照下面的方法进行设置,并且以后都以 soapui-pro.bat (ready-api.bat)启动 SoapUI (ReadyAPI)工具。

无效项目产生的原因:新建项目时,文件是以 utf-8 编码进行保存的。当再次打开项目,修改项目后保存(退出时会自动保存),较大可能会出现以 ANSI 编码保存文件,导致文件内容中文乱码。

1、如果是SoapUI Pro(如SoapUI Pro 5.1.2)
打开 %SOAPUI_HOME%/bin 目录下的 soapui-pro.bat 文件,修改 set JAVA_OPTS 所在行,增加编码设置 -Dsun.jnu.encoding=UTF-8 -Dfile.encoding=UTF-8 ,修改后如下:

rem JVM parameters, modify as appropriate
set JAVA_OPTS=-Xms128m -Xmx1024m -Dsoapui.properties=soapui.properties -Dgroovy.source.encoding=iso-8859-1 "-Dsoapui.home=%SOAPUI_HOME%\" -splash:soapui-pro-splash.png -Dsun.jnu.encoding=UTF-8 -Dfile.encoding=UTF-8

2、如果是ReadyAPI(如ReadyAPI 2.4.0)
打开 %ReadyAPI_HOME%/bin 目录下的 ready-api.bat 文件,修改 set JAVA_OPTS 所在行,增加编码设置 -Dsun.jnu.encoding=UTF-8 -Dfile.encoding=UTF-8 ,修改后如下:

rem JVM parameters, modify as appropriate
set JAVA_OPTS=-Xms128m -Xmx%READY_XMX% -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=40 -Dsoapui.properties=soapui.properties -Dgroovy.source.encoding=utf-8 "-Dsoapui.home=%READY_API_HOME%\" -splash:ready-api-splash.png -Dsun.net.http.allowRestrictedHeaders=true -Dsun.jnu.encoding=UTF-8 -Dfile.encoding=UTF-8



作者: 李云
更新时间:2018-06-14 11:00


接口请求正文中,存在和属性扩展相同写法的字符串(${value}),如何处理?

问题描述

接口请求正文中,存在和属性扩展相同写法的字符串(${value}),但不想该字符串被计算,而是直接发送该字符串。
示例:

{
"mykey":"${value}"
}

解决方案

为了确保在发送的请求中不计算表达式的值,你需要添加一个额外的 "$"。即使用 ´$${value}´ 代替 ´${value}´ 。
示例:
SoapUI 中接口请求正文:

{
"id":"ad001",
"content":"$${soapui}"
}


实际发送内容:

{
"id":"ad001",
"content":"${soapui}"
}


参考资料:https://smartbear-cc.force.com/portal/KbArticleViewer?name=How-to-escape-character-in-the-request-XML-Form-view&sp=all

作者: 李云
更新时间:2018-06-14 16:56


在高分屏上通过 .bat 文件启动 ReadyAPI ,字体太小

问题描述

操作系统:Windows 10
分辨率:2560x1440
软件:ReadyAPI 2.4.0
问题:通过 ready-api.bat 启动 ReadyAPI ,软件没有启用自动缩放(即适配高分屏),导致字体太小

解决方案

方案一:打开 Windows 高级缩放设置 ,允许 Windows 尝试修复应用,使其不模糊
1、右击桌面,打开 显示设置
2、选择 高级缩放设置 
3、打开 允许 Windows 尝试修复应用,使其不模糊
4、通过 ready-api.bat 启动 ReadyAPI,已经自动缩放

参考资料:
1、在 Windows 10 中修复显示模糊的应用

方案二:设置 java.exe 的高 DPI 缩放替代为系统
1、修改 ready-api.bat 
#1 : 在启动语句前增加控制台日志输出语句:echo "java.exe目录====%JAVA%" 

rem ********* run READY_API ***********
if "%1" == "debug" echo Starting ReadyAPI in debug mode
rem *** #1 添加日志:查看 java.exe 文件路径***
echo "java.exe目录====%JAVA%"
"%JAVA%" %JAVA_OPTS% -cp "%CLASSPATH%" com.smartbear.ready.ui.ReadyApiMain %*

:END
cd /d %OLDDIR%

2、运行 ready-api.bat ,得到 java.exe 所在路径

3、在 java.exe 上右击,选择 属性 ,然后选择 兼容性 选项卡。
4、选择 更改高 DPI 设置

5、勾选 替代高 DPI 缩放行为 ,然后下拉框选择 系统(增强)


参考资料:
1、SoapUI on windows 10 - high DPI/4K scaling issue
2、How do I run Java apps upscaled on a high-DPI display?

作者: 李云
更新时间:2018-06-18 22:29


ReadyAPI Preference 界面无法打开

问题描述

点击菜单栏的菜单:File - Preference ,设置界面(Preference)无法打开(点击菜单没有弹出设置窗口)。

解决方案

可能原因:工作空间(workspace)文件异常。
解决方法:
1、更换工作空间:File - Workspace - Switch Workspace 。
2、新建工作空间:File - Workspace - New  Workspace 。

作者: 李云
更新时间:2018-06-20 13:47


操作系统 » Windows

Windows 怎么关闭时间自动同步

问题描述

因为某些场景需要,需要关闭 Windows 系统的时间自动同步。

解决方案

方案一:【Windows 7】关闭时间自动同步设置
请参考:【百度经验】如何让Windows系统自动同步系统时间

方案二:【Windows 7】关闭时间自动同步服务
打开服务
停止时间自动同步服务

方案三:【Windows 10】关闭时间自动同步设置
1、右击任务栏中的时间所在位置
2、点击 【调整日期/时间】
3、将 【自动设置时间】关闭,或者点击【其他日期、时间和区域设置】进行详细设置(比如,需要更改时间同步服务器)。

作者: 李云
更新时间:2018-05-18 11:23


服务和控制器应用(services.exe),有时 CPU 占用会达到 20% - 50% 。

问题描述

操作系统:【版次】Windows 10 家庭版,【版本】1709,【OS 内部版本】16299.309
问题描述:开机后,未启动任何应用程序,CPU 占用达到 50%。打开任务管理器,服务和控制器应用(services.exe)进程,有时 CPU 占用会达到 20% - 50% 。

解决方案

方案一:关闭应用 MySQL Notifier
MySQL Notifier 的原因,在右下角托盘中关闭即可。

排查方法
(1)依次关闭在运行的所有软件,同时在任务管理器中查看 CPU 占用率。如果关闭某个软件后,问题解决,则问题是该软件导致的。

参考资料:
1. WIN7中services.exe占用CPU很高
2. 未作操作,services.exe 不断地消耗CPU,从0变到60-70,不等

作者: 李云
更新时间:2018-05-18 11:23


安装  Microsoft .NET Framework 4.7 时报错:Setup cannot continue because a dependent update needs to be installed

安装  Microsoft .NET Framework 4.7(脱机安装程序)时,报错:
Setup cannot continue because a dependent update needs to be installed before you can install this product on Windows 7, Windows Server 2008 R2, Windows 8 or Windows Server 2012.

微软官方解释:
https://support.microsoft.com/en-gb/help/4020302/the-net-framework-4-7-installation-is-blocked-on-windows-7-windows-ser
更新包下载地址(2018-04-22测试,链接失效):
http://www.catalog.update.microsoft.com/search.aspx?q=kb4019990

在开发者社区找到另一个下载链接(原文链接如下):
https://developercommunity.visualstudio.com/content/problem/217475/packageidmicrosoftwindowsuniversalcrtmsu7packageac.html
更新包下载地址(2018-04-22测试,链接可用):
https://download.visualstudio.microsoft.com/download/pr/10771972/11df6faa223f3c9a17d8db2b8f6396a2/Windows6.1-KB4019990-x64.msu

作者: 李云
更新时间:2018-05-18 11:23


Windows 10 修改或关闭快捷键 CTRL+SPACE

作者: 李云
更新时间:2018-06-23 17:28


机动车 » 驾照

驶入高速公路为什么开启左转向灯?

在普通Y型路口,支路右转进入主路,要使用右转向,这跟T型路口是一样的。
而在高速公路匝道合流进入主路时,就要使用左转向灯了,这是因为匝道不是直接汇入主道的,还有一段与主道平行的辅助车道,车辆在这段辅助车道加速后,再向左变道汇入主道,就需要使用左转向。

作者: 李云
更新时间:2018-05-18 11:24


软件工具 » WordPress

WordPress 只显示了默认主题,没有显示其他已安装主题。

出现Wordpress只显示一个主题的情况, 是因为php禁用了scandir函数, 开启即可.

PHP配置文件 
vim /usr/local/php/etc/php.ini 
搜索disable_functions, 删除scandir

重启php或重启LNMP 
# 重启PHP
lnmp php-fpm restart
# 重启LNMP
lnmp restart

另外如果你是安装的LNMP, 已经内置了删除禁用函数的脚本, 直接运行也可以. 
/root/lnmp1.4/tools/remove_disable_function.sh

解决方案来源:https://blog.csdn.net/wmsoho/article/details/78939997

作者: 李云
更新时间:2018-05-18 11:24


【插件】【Easy WP SMTP】 发送邮件报错:SMTP ERROR: Password command failed: 535 Error

问题描述

安装了 Easy WP SMTP 插件。在【SMTP Settings】面板中设置完毕后,在【Test Email】面板中测试发送邮件。
设置截图(使用了 QQ 邮箱)
Debug Info (插件输出的日志)

CLIENT -> SERVER: EHLO blog.example.com
CLIENT -> SERVER: AUTH LOGIN
CLIENT -> SERVER: ODQ0NjE0MTUzQHFxLmNvbQ==
CLIENT -> SERVER: MQ==
SMTP ERROR: Password command failed: 535 Error: ��ʹ����Ȩ���¼�������뿴: http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256
SMTP Error: Could not authenticate.CLIENT -> SERVER: QUIT
SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting

解决方案

设置 SMTP Password 时,应该使用授权码,而不是邮箱登录密码。

作者: 李云
更新时间:2018-05-18 11:24


WordPress 新用户注册,无法收到邮件

作者: 李云
更新时间:2018-05-18 11:25


WordPress新用户注册时,提示“您的密码重设链接无效,请在下方请求新链接”

问题描述

1、新用户注册,点击邮箱中的链接
2、提示“您的密码重设链接无效,请在下方请求新链接。”

解决方案

问题原因
邮箱中的链接地址多了字符【>】 (可将光标移至链接上,查看左下角显示的链接地址),导致传给 wordpress 的链接不符合要求。
注:以下两个步骤,当 wordpress 升级时,文件会被覆盖,需要再次修改。

1、解决新用户注册时链接无效(去掉左右尖括号)
修改 %WORDPRESS_HOME%/wp-includes/pluggable.php 中的以下代码(大约 1896 行):

# 修改前
	$message .= '<' . network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user->user_login), 'login') . ">\r\n\r\n";
# 修改后
	$message .= network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user->user_login), 'login') . "\r\n\r\n";

2、解决找回密码时链接失效(去掉左右尖括号)
修改 %WORDPRESS_HOME%/wp-login.php 中的以下代码(大约 367 行):

# 修改前
	$message .= '<' . network_site_url( "wp-login.php?action=rp&key=$key&login=" . rawurlencode( $user_login ), 'login' ) . ">\r\n";
# 修改后
	$message .= network_site_url( "wp-login.php?action=rp&key=$key&login=" . rawurlencode( $user_login ), 'login' ) . "\r\n";

作者: 李云
更新时间:2018-05-18 11:25


软件工具 » Sublime Text

用 Sublime Text 编辑文件(txt/md)后,浏览器打开乱码

问题描述

新建一个文件 test.md ,用 Sublime Text 3 编辑,输入中文后,保存为 UTF-8 编码。用浏览器打开文件 test.md,显示乱码。

解决方案

方案一:修改编码为 UTF-8 with BOM
编码方式不正确导致的。用 Sublime Text 3 再次编辑 test.md 文件,选择 UTF-8 with BOM 编码(File - Save with Encoding - UTF-8 with BOM)并保存。 用浏览器打开进行测试,中文显示正常。

作者: 李云
更新时间:2018-05-18 11:25


软件工具 » FileZilla

Windows 7系统,FileZilla 服务端启动后,本地可以连接,远程无法连接。

Windows 防火墙阻止了。
点击 ´允许运行另一程序...´

点击 ´浏览...´

选择 ´FileZilla Server.exe´

作者: 李云
更新时间:2018-05-18 11:25


浏览器通过 ftp://IP 访问,访问速度非常慢

问题描述

开启 ´FileZilla Server´ 服务后,浏览器通过 ftp://IP 访问,点击查看 ´XX.md´ 文件,返回上级目录,再点击查看该文件,重复一次或多次操作后,访问速度非常慢,需要 10 秒才能加载完成。

问题环境
操作系统:Windows Server 2008 R2 Enterprise x64
FileZilla Server 版本:0.9.43

解决方案

方案一:升级版本到 0.9.60
升级 ´FileZilla Server´ 版本到 0.9.60 后,问题不再出现。

作者: 李云
更新时间:2018-05-18 11:26


安装报错:Could not load TLS libraries. Aborting start of administration interface.

问题描述

安装 ´FileZilla_Server-0_9_60_2.exe´ 后,双击快捷图标,启动报错:´Could not load TLS libraries. Aborting start of administration interface.´ 。
问题环境
操作系统:Windows Server 2008 R2 Enterprise x64

解决方案

解决方案一:降低程序版本。
将 ´FileZilla Server´ 的版本降低到0.9.43。

解决方案二:安装微软补丁。
安装微软操作系统补丁 KB2533623 ,安装完成后重启电脑。

作者: 李云
更新时间:2018-05-18 11:26


软件工具 » Selenium

org.openqa.selenium. SessionNotCreatedException

问题描述

堆栈信息:

org.openqa.selenium.SessionNotCreatedException: session not created exception
from unknown error: Runtime.executionContextCreated has invalid 'context': {"auxData":{"frameId":"15008.1","isDefault":true},"id":1,"name":"","origin":"://"}
  (Session info: chrome=59.0.3071.115)
  (Driver info: chromedriver=2.23.409699 (49b0fa931cda1caad0ae15b7d1b68004acd05129),platform=Windows NT 6.1.7600 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 2.32 seconds
Build info: version: '2.53.0', revision: '35ae25b1534ae328c771e0856c93e187490ca824', time: '2016-03-15 10:43:46'
System info: host: 'LiYun', ip: '10.200.4.94', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_77'
Driver info: org.openqa.selenium.remote.RemoteWebDriver
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:206)
    at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:158)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:678)
    at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:249)
    at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:131)
    at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:158)
    at com.tairan.framework.control.BrowserEmulator.<init>(BrowserEmulator.java:107)
    at com.tairan.qa.trjr.testcase.usercenter.RegisterCase.beforeClass(RegisterCase.java:38)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:86)
    at org.testng.internal.Invoker.invokeConfigurationMethod(Invoker.java:514)
    at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:215)
    at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:142)
    at org.testng.internal.TestMethodWorker.invokeBeforeClassMethods(TestMethodWorker.java:178)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:108)
    at org.testng.TestRunner.privateRun(TestRunner.java:782)
    at org.testng.TestRunner.run(TestRunner.java:632)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:366)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:361)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:319)
    at org.testng.SuiteRunner.run(SuiteRunner.java:268)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1244)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
    at org.testng.TestNG.run(TestNG.java:1064)
    at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:132)
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:230)
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:76)

解决方案

方案一:确认chromedriver版本和chrome浏览器版本一致
问题原因:chromedriver版本和chrome浏览器版本不一致。
例如这里,chromedriver版本号为2.23,支持chrome版本为v51-53,而实际运行的Chrome浏览器版本为59。

作者: 李云
更新时间:2018-06-03 21:00


org.openqa.selenium. InvalidElementStateException

问题描述

堆栈信息:
invalid element state: Element is not currently interactable and may not be manipulated

解决方案

方案一:元素定位错误。
定位到的不是要操作的元素,先确定定位路径正确且只有一个。

作者: 李云
更新时间:2018-06-03 20:59


org.openqa.selenium. NoSuchElementException

问题

异常类:org.openqa.selenium.NoSuchElementException

解决方案

1、元素定位路径错误
修改定位路径,并先在浏览器中进行测试

2、页面(DOM)未加载完成
说明:如果你的元素定位路径中有些节点(元素节点、文本节点等)是通过JS生成的,当DOM加载完成时,JS可能还在执行,而selenium判断页面加载完成应该是不考虑JS的,所以可能会出现页面实际未全部加载完成的情况。

解决方法一
线程等待:如1000毫秒;

try {
	Thread.sleep(1000);
} catch (InterruptedException e) {
	e.printStackTrace();
}

解决方法二
显示等待:超时时间内,轮询查找,selenium2中默认轮询时间为500毫秒一次。

//示例代码:超时时间内轮询查找
//或者自己设置轮询时间:
//new WebDriverWait(driver, timeOutInSeconds, sleepInMillis);
WebElement we = new WebDriverWait(driver, 3).until(new ExpectedCondition<WebElement>() {

	@Override
	public WebElement apply(WebDriver driver) {
		return driver.findElement(By.id("testid"));
	}

});

//selenium2源码
//参见类:org.openqa.selenium.support.ui.FluentWait<T>
//参见方法:public <V> V until(Function<? super T, V> isTrue)
//以下为轮询时间设置,重点的三句代码
public static final Duration FIVE_HUNDRED_MILLIS = new Duration(500, MILLISECONDS);
private Duration interval = FIVE_HUNDRED_MILLIS;
sleeper.sleep(interval);

解决方法三
隐式等待:全局设置,针对所有元素,超时时间内轮询查找。

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

3、driver焦点不在元素所在frame
将WebDriver的焦点切换到元素所在Frame或IFrame。

作者: 李云
更新时间:2018-06-03 20:58


org.openqa.selenium. WebDriverException

问题

堆栈信息如下:

org.openqa.selenium.WebDriverException: unknown error: Element is not clickable at point (255, 575)
(Session info: chrome=60.0.3112.113)
(Driver info: chromedriver=2.31.488763 (092de99f48a300323ecf8c2a4e2e7cab51de5ba8),platform=Windows NT 6.1.7600 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 249 milliseconds
Build info: version: '2.53.0', revision: '35ae25b1534ae328c771e0856c93e187490ca824', time: '2016-03-15 10:43:46'
System info: host: '***', ip: '***', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_77'
Driver info: org.openqa.selenium.remote.RemoteWebDriver
Capabilities [{applicationCacheEnabled=false, rotatable=false, mobileEmulationEnabled=false, networkConnectionEnabled=false, chrome={chromedriverVersion=2.31.488763 (092de99f48a300323ecf8c2a4e2e7cab51de5ba8), userDataDir=C:\Users\Think\AppData\Local\Temp\scoped_dir35164_16594}, takesHeapSnapshot=true, pageLoadStrategy=normal, databaseEnabled=false, handlesAlerts=true, hasTouchScreen=false, version=60.0.3112.113, platform=XP, browserConnectionEnabled=false, nativeEvents=true, acceptSslCerts=true, locationContextEnabled=true, webStorageEnabled=true, browserName=chrome, takesScreenshot=true, javascriptEnabled=true, cssSelectorsEnabled=true, setWindowRect=true, unexpectedAlertBehaviour=}]
Session ID: 73b0eb77cee85d6c901ce4cb459daa9c
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:1.8.0_77]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) ~[?:1.8.0_77]
...

或者

org.openqa.selenium.WebDriverException: unknown error: Element <a ui-sref="loanTrialDetail({type:'audit',id:'20170801090014C6A92B6B765411E7905BFA163E034260'})" class="btn btn-outline btn-circle btn-sm red" href="#/loan_trial_detail/audit/20170801090014C6A92B6B765411E7905BFA163E034260">...</a> is not clickable at point (1200, 41). Other element would receive the click: <a href="#" class="dropdown-toggle" dropdown-menu-hover="" data-toggle="dropdown" data-close-others="true" aria-haspopup="true" aria-expanded="false">...</a>
(Session info: chrome=60.0.3112.113)
(Driver info: chromedriver=2.31.488763 (092de99f48a300323ecf8c2a4e2e7cab51de5ba8),platform=Windows NT 6.1.7600 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 230 milliseconds
Build info: version: '2.53.0', revision: '35ae25b1534ae328c771e0856c93e187490ca824', time: '2016-03-15 10:43:46'
System info: host: '***', ip: '***', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_77'
Driver info: org.openqa.selenium.remote.RemoteWebDriver
Capabilities [{applicationCacheEnabled=false, rotatable=false, mobileEmulationEnabled=false, networkConnectionEnabled=false, chrome={chromedriverVersion=2.31.488763 (092de99f48a300323ecf8c2a4e2e7cab51de5ba8), userDataDir=C:\Users\Think\AppData\Local\Temp\scoped_dir33688_30564}, takesHeapSnapshot=true, pageLoadStrategy=normal, databaseEnabled=false, handlesAlerts=true, hasTouchScreen=false, version=60.0.3112.113, platform=XP, browserConnectionEnabled=false, nativeEvents=true, acceptSslCerts=true, locationContextEnabled=true, webStorageEnabled=true, browserName=chrome, takesScreenshot=true, javascriptEnabled=true, cssSelectorsEnabled=true, setWindowRect=true, unexpectedAlertBehaviour=}]
Session ID: 1a91284ce6e7c0ef6ca6adcc29d53091
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:1.8.0_77]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) ~[?:1.8.0_77]
...

解决方案

因为要点击的元素被其他元素全部或部分覆盖

(1)滚动窗口到该元素所在位置后再进行点击,参考Selenium之滚动。需要说明的一点是,这里使用Actions类进行滚动可能无法解决该问题,建议使用Element.scrollIntoView()或window.scrollTo(x,y)。

(2)修改定位路径,选择其他也可实现点击效果的元素路径替换原来的路径。比如我遇到的问题中使用By.xpath("//span[text()='»']")代替By.xpath("//span[text()='»']//parent::li")后问题解决。具体原因,暂且未明。

作者: 李云
更新时间:2018-06-03 21:05


软件工具 » Eclipse

导入或新建的 Dubbo 工程,XML 文件中报错。

问题描述

报错信息

Multiple annotations found at this line:
    - schema_reference.4: Failed to read schema document 'http://code.alibabatech.com/schema/dubbo/dubbo.xsd', because
    1) could not find the document;
    2) the document could not be read;
    3) the root element of the document is not <xsd:schema>.
    - cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'dubbo:reference'.

解决方案

方案一:因为无法访问 http://code.alibabatech.com
1、找到本地Maven仓库中dubbo的jar包。将jar包中META-INF文件夹下dubbo.xsd文件拖动到一个文件夹内(建议在文档盘内(此处为E盘)新建一个文件夹,专门用于存放第三方jar包、文件、库等)。

2、按照下图中的数字顺序,依次点击或选择。
在图中6指示的下拉框位置,选择下拉选项【Schema location】。
在图中7指示的文本框内,追加内容“/dubbo.xsd”,完整的key为:´http://code.alibabatech.com/schema/dubbo/dubbo.xsd´。

3、右击报错的工程,点击【Validate】,稍等片刻后(16秒左右),工程图标上的红叉将会消失。

作者: 李云
更新时间:2018-05-18 11:30


软件工具 » Dubbo

Dubbo Admin 管理台中发现同一个服务有两个提供者,怎么禁止其中一个提供者?

问题描述

问题环境
被测系统使用了 disconf 做配置中心,使用了 dubbo 做分布式远程调用。
问题描述
为了调试测试环境的一个问题,在本地 eclipse 中启动了对应项目(项目的 disconf 配置和出问题的测试环境一致)(该项目,即服务,记为服务A),并关闭了测试环境中的服务A。当定位到问题原因后,需要将服务A(提供者)切回使用测试环境的服务,于是关闭本地的服务A,开启测试环境的服务A。
当启动另一个服务B时,因为B是A的消费者,而在 dubbo 管理台中查看,发现服务A有本地和测试环境两个提供者。
怎么才能禁止使用服务A的本地提供者?

解决方案

登录 dubbo 控制台,选择 服务治理 - 机器
找到本地机器的 IP,点击提供者
全选,点击【批量禁用】

作者: 李云
更新时间:2018-05-18 11:30


电子产品 » AirPods

AirPods 耳机,iPhone 可以连上,但 IPad 连不上

问题描述

iphone 手机连接 airpods 耳机正常
现象1:ipad 打开蓝牙,可以搜索到 airpods 耳机设备,但连接时提示不在通信范围内
现象2:ipad 打开蓝牙,忽略 airpods 耳机设备,重新搜索设备,搜索不到 airpods

解决方案

长按充电盒背面的重新匹配按钮,进行重新匹配。

作者: 李云
更新时间:2018-05-01 17:06


编程语言 » HTML/CSS

8位颜色值在某些低版本浏览器不兼容

问题描述

css 属性 color 使用了8位颜色值,导致某些低版本浏览器不兼容(不生效)。
举例:

color:#000000a3

解决方案

方案一:将 8 为颜色值改为 rgba 值
举例:

color: rgba(0, 0, 0, 0.64);

8 位颜色值和 rgba 值相关转换方法
方法一:使用 chrome 浏览器的开发者工具
1、输入 8 位颜色值,点击右侧的上下箭头
2、得到 RGBA 值,点击弹窗以外的区域3、得到 css 代码

参考资料
1、Android 颜色,6位和8位数颜色的区别和应用

作者: 李云
更新时间:2018-05-18 11:31


其他

Twitter 注册账号,手机号无法发送短信

注册时,选择手机号注册,而且必须加上+86。
1、比如使用手机号注册,填写:+86 18868876666。
2、收到验证码:【Your confirmation code is 903059.回复TD退订【英富必】】
3、注册成功。

作者: 李云
更新时间:2018-05-18 11:31


软件工具 » GitLab

git clone 提示 Permission denied (publickey).

问题描述

本案例中,使用了 GitLab 进行代码托管。
1、在本地电脑生成 SSH Key
2、在 GitLab 的 个人主页 - SSH Keys 添加SSH Key(公钥)
3、使用shh -T example.com 访问
4、报错:Permission denied (publickey).

解决方案

方案一:设置用户名
原因:没有设置用户名导致,访问没有权限。设置用户名,如下:

$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com

 

作者: 李云
更新时间:2018-05-18 11:49


编程语言 » Groovy

groovy 命令行编译报错

问题

使用命令行编译groovy脚本,编译报错。
1、文件结构

PS E:\workspace\groovy\test\util> tree /f
卷 文档 的文件夹 PATH 列表
卷序列号为 000B-3DFE
E:.
    GA.groovy
    GB.groovy
    hello.groovy

没有子文件夹

2、文件内容
hello.groovy

import util.*

println GA.ga("liyun")
println GB.gb(1)

GA.groovy

package util

class GA{

	def static ga(String name){
		println name
	}
}

GB.groovy

package util

class GB{

	def static gb(int age){
		println age
	}

}

3、命令及結果:E:\workspace\groovy\test\util> groovy .\hello.groovy

PS E:\workspace\groovy\test\util> groovy .\hello.groovy
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
Compilation incomplete: expected to find the class GA in file:/E:/workspace/groovy/test/util/GA.groovy, but the file con
tains the classes: util.GA

Compilation incomplete: expected to find the class GB in file:/E:/workspace/groovy/test/util/GB.groovy, but the file con
tains the classes: util.GB

2 errors

解决方案

方案一:更改hello.groovy文件的路径
将hello.groovy文件放到和util文件夹同级别

PS E:\workspace\groovy\test> tree /f
卷 文档 的文件夹 PATH 列表
卷序列号为 000B-3DFE
E:.
│  hello.groovy
│
└─util
        GA.groovy
        GB.groovy

编译结果:

PS E:\workspace\groovy\test> groovy .\hello.groovy
liyun
null
1
null

 相关链接:https://stackoverflow.com/a/5221011/8589807

作者: 李云
更新时间:2018-05-18 17:52


JsonOutput.toJson、prettyPrint等方法,中文被转义

问题描述

使用了 JsonOutput 的 prettyPrint 方法或者 toJson 方法,返回的字符串中,中文被转义为 \u738b 的形式

解决方案

\u738b 为 Unicode 字符。解决方法是解析 Unicode 字符为中文字符。

package org.qadoc.groovy.util

import groovy.json.JsonOutput
import org.apache.commons.lang3.StringEscapeUtils

/**
 * JSON工具类
 * author:李云
 * time:2018-05-08
 */
class JsonUtils{

    /**
     * 对象转JSON字符串(中文不转义)
     * @param object 对象
     * @return 未转义的JSON字符串
     */
    def static String toJson(Object object){
        //普通对象转JSON文本:如果文本中有中文,中文会转义为Unicode字符
        //例如:groovy.json.JsonOutput.toJson("李云")
        //OutPut: "\u674e\u4e91"
        def jsontext = JsonOutput.toJson(object)
        //处理JSON文本中的Unicode字符
        return StringEscapeUtils.unescapeJava(jsontext)
    }

}

作者: 李云
更新时间:2018-06-14 11:40


编程语言 » Groovy » Grape

groovy 编译时,jar包下载失败

问题描述

编译groovy脚本报错,使用了 Grape 进行包管理:

E:\workspace\groovy\pict_tool>groovy hello.groovy
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:General error during conversion:Error grabbing Grapes -- [download failed: commons-codec#commons-codec;1.10!commons-codec.jar, download failed: stax#stax-api;1.0.1!stax-api.jar]

java.lang.RuntimeException: Error grabbing Grapes -- [download failed: commons-codec#commons-codec;1.10!commons-codec.jar, download failed: stax#stax-api;1.0.1!
stax-api.jar]
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:83)
        at org.codehaus.groovy.reflection.CachedConstructor.doConstructorInvoke(CachedConstructor.java:77)
        at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrap.callConstructor(ConstructorSite.java:84)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallConstructor(CallSiteArray.java:59)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:238)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:250)
        at groovy.grape.GrapeIvy.getDependencies(GrapeIvy.groovy:422)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSite.invoke(PogoMetaMethodSite.java:169)
        at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:59)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:51)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:157)
        at groovy.grape.GrapeIvy.resolve(GrapeIvy.groovy:569)
        at groovy.grape.GrapeIvy$resolve$1.callCurrent(Unknown Source)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:51)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:157)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:193)
        at groovy.grape.GrapeIvy.resolve(GrapeIvy.groovy:536)
        at groovy.grape.GrapeIvy$resolve$0.callCurrent(Unknown Source)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:51)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:157)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:185)
        at groovy.grape.GrapeIvy.grab(GrapeIvy.groovy:254)
        at groovy.grape.Grape.grab(Grape.java:167)
        at groovy.grape.GrabAnnotationTransformation.visit(GrabAnnotationTransformation.java:376)
        at org.codehaus.groovy.transform.ASTTransformationVisitor$3.call(ASTTransformationVisitor.java:346)
        at org.codehaus.groovy.control.CompilationUnit.applyToSourceUnits(CompilationUnit.java:966)
        at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:626)
        at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:602)
        at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:579)
        at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:323)
        at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:293)
        at groovy.lang.GroovyShell.parseClass(GroovyShell.java:677)
        at groovy.lang.GroovyShell.run(GroovyShell.java:506)
        at groovy.lang.GroovyShell.run(GroovyShell.java:496)
        at groovy.ui.GroovyMain.processOnce(GroovyMain.java:597)
        at groovy.ui.GroovyMain.run(GroovyMain.java:329)
        at groovy.ui.GroovyMain.process(GroovyMain.java:315)
        at groovy.ui.GroovyMain.processArgs(GroovyMain.java:134)
        at groovy.ui.GroovyMain.main(GroovyMain.java:114)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.codehaus.groovy.tools.GroovyStarter.rootLoader(GroovyStarter.java:116)
        at org.codehaus.groovy.tools.GroovyStarter.main(GroovyStarter.java:138)
1 error

解决方案

方案一:删除 Jar 包缓存文件,重新下载
1、找出所有报错信息中提示的jar包,删除 grape 缓存和 maven repository 缓存中对应文件夹(可以在grapeConfig.xml中自定义缓存文件夹路径,默认 grape 缓存路径为:C:\Users\${user.home}\.groovy\grapes,默认 maven 缓存文件夹为:C:\Users\${user.home}\.m2\repository)。
2、重新下载

相关链接:https://github.com/apache/groovy/blob/master/src/resources/groovy/grape/defaultGrapeConfig.xml

作者: 李云
更新时间:2018-05-18 12:27


软件工具 » Fiddler

Fiddler 根证书安装失败:Creation of the root certificate was not successful.

问题描述

Fiddler 根证书安装失败:Creation of the root certificate was not successful.

解决方案

下载附件:fiddlercertmaker.exe ,双击安装。

作者: 李云
更新时间:2018-06-14 15:27


软件工具 » Jenkins

Jenkins Job 脚本启动 Tomcat 失败,但登录目标服务器启动正常。

问题描述

Jenkins 上 Job 执行成功,查看服务器进程和日志,Tomcat 启动报错,没有 Tomcat 进程。

# Tomcat 报错信息
/usr/local/apache-tomcat-8.0.32/bin/catalina.sh: line 401: /usr/java/jdk1.8.0_66/bin/java: No such file or directory

用 Xshell 登录目标服务器,查看 JAVA_HOME 和 PATH 变量的值,如下:

[root@vscloud /]# echo $JAVA_HOME;echo $PATH 
/usr/java/jdk1.8.0_65
/usr/java/jdk1.8.0_65/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

在 Jenkins 的 Job 中增加 Debug 语句。

# Debug 脚本
echo ---debug begin---
pwd
java -version
echo $JAVA_HOME
echo $JRE_HOME
echo $PATH
echo $CLASS_PATH
echo ---debug end---
# Debug 结果
+ echo ---debug begin---
---debug begin---
+ pwd
/usr/local/apache-tomcat-8.0.32/bin
+ echo JAVA_HOME:/usr/java/jdk1.8.0_66
JAVA_HOME:/usr/java/jdk1.8.0_66
+ echo JRE_HOME:
JRE_HOME:
+ echo PATH:/usr/java/jdk1.8.0_66/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
PATH:/usr/java/jdk1.8.0_66/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
+ echo CLASS_PATH:
CLASS_PATH:
+ echo ---debug end---
---debug end---

解决方案

方案一:Job 脚本中设置  JAVA_HOME 和 PATH 变量
原因分析:上面问题中,Jenkins 脚本获取到的 JAVA_HOME 和 PATH 来自 Jenkins 自身服务所在服务器的环境变量。
解决方案:Jenkins Job 脚本中将 JAVA_HOME 和 PATH 变量设置为目标服务器的值。

# Job 脚本中增加 Java 环境变量设置
export JAVA_HOME=/usr/java/jdk1.8.0_65
export PATH=/usr/java/jdk1.8.0_65/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin 

推测:Jenkins 可能先获取 Job 中设置的环境变量值,没有设置获取自身服务所在服务器的环境变量值。

作者: 李云
更新时间:2018-05-01 17:07