问题描述
解决方案
将allure-report中的文件夹history以及其下文件,copy到结果文件夹里(./allure-results/ )
在次mvn test,allure.bat generate ./allure-results/
打开报告 allure.bat open ./allure-report (即可见趋势图)

作者: 胡男
更新时间:2018-10-12 15:55
注册用户成功,或者在管理后台添加用户成功。但登录时失败。
方案一:激活用户
注册用户后,没有激活。点击【编辑】。
激活用户
方案二:添加权限
用户注册成功后,没有分配相应权限。
作者: 李云
更新时间:2018-05-18 11:20
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”
修改附件最大限制,比如修改为 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);
作者: 李云
更新时间:2018-05-18 11:21
1、获取免费SSL证书(HTTPS证书)。阿里云、腾讯云、百度云等都有提供免费SSL证书服务。
2、修改系统设置里的基本URL网址为https3、修改服务器配置,使http访问跳转https。下面以nginx为例:
在server的80端口配置中,增加 return 301 https://$server_name$request_uri;
参考资料:
1、Nginx的https配置记录以及http强制跳转到https的方法梳理
作者: 李云
更新时间:2018-05-18 11:19
问题背景
测试环境,有多套分支测试环境,每套环境都使用了 Nginx 做域名和请求代理。
现象描述
接口返回500,但接口请求行、请求正文、请求类型都正确,登录相关服务,查看日志,没有日志输出。
接口返回值
{
"code": "50000",
"message": "系统异常",
"data": null
}
方案一:host 配置错误
(1)配置到了其他分支测试环境,将 Host 配置修改正确。
(2)开启 Fiddler 的情况下,切换了 Host 。因为 Fiddler 有 host 缓存,所以实际请求的还是以前映射的 IP 。
作者: 李云
更新时间:2018-05-18 11:22
现象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}),但不想该字符串被计算,而是直接发送该字符串。
示例:
{
"mykey":"${value}"
}
为了确保在发送的请求中不计算表达式的值,你需要添加一个额外的 "$"。即使用 ´$${value}´ 代替 ´${value}´ 。
示例:
SoapUI 中接口请求正文:
{
"id":"ad001",
"content":"$${soapui}"
}
实际发送内容:
{
"id":"ad001",
"content":"${soapui}"
}
作者: 李云
更新时间:2018-06-14 16:56
操作系统: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
点击菜单栏的菜单:File - Preference ,设置界面(Preference)无法打开(点击菜单没有弹出设置窗口)。
可能原因:工作空间(workspace)文件异常。
解决方法:
1、更换工作空间:File - Workspace - Switch Workspace 。
2、新建工作空间:File - Workspace - New Workspace 。
作者: 李云
更新时间:2018-06-20 13:47
因为某些场景需要,需要关闭 Windows 系统的时间自动同步。
方案一:【Windows 7】关闭时间自动同步设置
请参考:【百度经验】如何让Windows系统自动同步系统时间
方案二:【Windows 7】关闭时间自动同步服务
打开服务停止时间自动同步服务
方案三:【Windows 10】关闭时间自动同步设置
1、右击任务栏中的时间所在位置2、点击 【调整日期/时间】
3、将 【自动设置时间】关闭,或者点击【其他日期、时间和区域设置】进行详细设置(比如,需要更改时间同步服务器)。
作者: 李云
更新时间:2018-05-18 11:23
操作系统:【版次】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 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
作者: 李云
更新时间:2018-06-23 17:28
在普通Y型路口,支路右转进入主路,要使用右转向,这跟T型路口是一样的。
而在高速公路匝道合流进入主路时,就要使用左转向灯了,这是因为匝道不是直接汇入主道的,还有一段与主道平行的辅助车道,车辆在这段辅助车道加速后,再向左变道汇入主道,就需要使用左转向。
作者: 李云
更新时间:2018-05-18 11:24
出现Wordpress只显示一个主题的情况, 是因为php禁用了scandir函数, 开启即可.
PHP配置文件 vim /usr/local/php/etc/php.ini
搜索disable_functions, 删除scandir
重启php或重启LNMP
# 重启PHPlnmp php-fpm restart
# 重启LNMPlnmp 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 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
安装邮件插件:Easy WP SMTP
安装后测试发送邮件可能会遇到以下问题:
【插件】【Easy WP SMTP】 发送邮件报错:SMTP ERROR: Password command failed: 535 Error
作者: 李云
更新时间:2018-05-18 11:25
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
新建一个文件 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
Windows 防火墙阻止了。
点击 ´允许运行另一程序...´
点击 ´浏览...´
选择 ´FileZilla Server.exe´
作者: 李云
更新时间:2018-05-18 11:25
开启 ´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
安装 ´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
堆栈信息:
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
堆栈信息:
invalid element state: Element is not currently interactable and may not be manipulated
方案一:元素定位错误。
定位到的不是要操作的元素,先确定定位路径正确且只有一个。
作者: 李云
更新时间:2018-06-03 20:59
异常类: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: 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
报错信息
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
问题环境
被测系统使用了 disconf 做配置中心,使用了 dubbo 做分布式远程调用。
问题描述
为了调试测试环境的一个问题,在本地 eclipse 中启动了对应项目(项目的 disconf 配置和出问题的测试环境一致)(该项目,即服务,记为服务A),并关闭了测试环境中的服务A。当定位到问题原因后,需要将服务A(提供者)切回使用测试环境的服务,于是关闭本地的服务A,开启测试环境的服务A。
当启动另一个服务B时,因为B是A的消费者,而在 dubbo 管理台中查看,发现服务A有本地和测试环境两个提供者。
怎么才能禁止使用服务A的本地提供者?
登录 dubbo 控制台,选择 服务治理 - 机器找到本地机器的 IP,点击提供者
全选,点击【批量禁用】
作者: 李云
更新时间:2018-05-18 11:30
iphone 手机连接 airpods 耳机正常
现象1:ipad 打开蓝牙,可以搜索到 airpods 耳机设备,但连接时提示不在通信范围内
现象2:ipad 打开蓝牙,忽略 airpods 耳机设备,重新搜索设备,搜索不到 airpods
长按充电盒背面的重新匹配按钮,进行重新匹配。
作者: 李云
更新时间:2018-05-01 17:06
css 属性 color 使用了8位颜色值,导致某些低版本浏览器不兼容(不生效)。
举例:
color:#000000a3
方案一:将 8 为颜色值改为 rgba 值
举例:
color: rgba(0, 0, 0, 0.64);
8 位颜色值和 rgba 值相关转换方法
方法一:使用 chrome 浏览器的开发者工具
1、输入 8 位颜色值,点击右侧的上下箭头2、得到 RGBA 值,点击弹窗以外的区域
3、得到 css 代码
作者: 李云
更新时间:2018-05-18 11:31
注册时,选择手机号注册,而且必须加上+86。
1、比如使用手机号注册,填写:+86 18868876666。
2、收到验证码:【Your confirmation code is 903059.回复TD退订【英富必】】
3、注册成功。
作者: 李云
更新时间:2018-05-18 11:31
本案例中,使用了 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脚本,编译报错。
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
作者: 李云
更新时间:2018-05-18 17:52
使用了 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 进行包管理:
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 根证书安装失败:Creation of the root certificate was not successful.
下载附件:fiddlercertmaker.exe ,双击安装。
作者: 李云
更新时间:2018-06-14 15:27
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