Selenium 我的自动化测试历程 (Selenium+TestNG+Java+ReportNG+Jenkins)

喵喵 · 2016年11月28日 · 最后由 喵喵 回复于 2020年09月15日 · 2141 次阅读

测试环境:Java+Selenium+TestNG,Jenkins 持续集成。

测试代码

代码结构

采用页面对象模型 (Page Object),减少 UI 修改后,对代码的影响。

Java 编写,采用 TestNG 测试框架。

先说点概念的:

  • Selenium

    Selenium 是一套完整的 Web 应用程序测试系统,它包含了测试的录制(Selenium IDE)、编写及运行(Selenium Remote Control)和测试的并行处理(Selenium Grid)。Selenium 的核心 Selenium Core 基于 JsUnit,完全由 JavaScript 编写,因此可运行于任何支持 JavaScript 的浏览器上。

    Selenium Core:Selenium 的核心部分,它由一些纯 js 代码组成, 可以运行在 windows/linux 的不同 browser 上,而 IDE 是在 core 的基础上的一种应用, 通过 UI 实现类似 QTP/Winner 的脚本录制回放功能,它是 Selenium IDE 和 Selenium RC 的引擎。

    Selenium IDE: FireFox 的一个插件,支持脚本录制。

    Selenium RC: Selenium Remote Control,是客户端利用各种编程语言,通过网络向 Selenium Server 发送指令,Selenium Server 接收到测试指令后,启动浏览器并向其发出 JavaScript 调用实现对 Html 页面的全面追踪,并通过网络把执行结果返回给调用者。

    Selenium WD: Selenium WebDriver。Web 驱动。

    Selenium Grid:允许同时并行地、在不同的环境上运行多个测试任务,极大地加快 Web 应用的功能测试。(没有用过,不太了解)

  • TestNG

    TestNG 是一个测试框架,使用@Test控制测试的执行,执行后,自动输出测试报告。

环境搭建

Java 运行环境

根据个人电脑系统类型选择对应的 jdk 安装包下载(jdk-8u5-windows-x64.exe 或 jdk-7u45-windows-i586.exe)下载完成之后,打开软件进行安装。

  • 配置环境变量

    系统环境变量 JAVA_HOME:d:\Java\jdk1.8.0_05(写自己安装的 jdk 地址)

    系统环境变量 Path:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

    系统变量 CLASSPATH:;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;

配置完成之后,在 doc 下输入 javac,如果出现用法:javac。。,证明配置好了

JDBC 配置-sql-server

Jdbc 用于 java 读取 sql server 数据库。

数据库安装就不多说了,我本地 64 位计算机,jdk1.8,Sql Server 2008R2。

  1. 下载 Microsoft JDBC Driver 6.0(sqljdbc_6.0.7728.100_chs.tar.gz) 官网地址:http://www.microsoft.com/zh-cn/download/details.aspx?id=11774 我只留下了 sqljdbc4.jar
  2. 配置环境变量 CLASSPATH
    新增:C:\sqljdbc4;( 我放在了 C 盘根目录下)
  3. 复制包到相关目录下
    sqljdbc4.jar 文件拷到
    E:\Program Files\Java\jdk1.8.0_05\jre\lib\ext
    E:\Program Files\Java\jre8\lib\ext
    目录下,分别拷贝一份(看你的安装目录了)

Java 开发工具

eclipse-standard-kepler-SR1-win32-x86_64

相关包导入

  • TestNG

    TestNG 框架相关:
    bsh-2.0b4.jar,jcommander.jar,snakeyaml.jar 这三个包。

    在 org.testng.eclipse_6.9.9.201510270734 中 lib 中,我把整个文件夹 (rg.testng.eclipse_6.9.9.20151027073) 放在了 eclipse 所在的目录:\eclipse\features\org.testng.eclipse_6.9.9.201510270734\lib ,之后在引入这三个包。

  • Selenium
    selenium-server-standalone-2.48.2.jar

  • Jxl.jar
    用于读取 excel 表格

浏览器

浏览器使用火狐浏览器 39.0.3,虽然版本比较低,但是与 selenium 版本兼容,需要安装组件:firepath

页面元素

定位

通过页面元素的固定属性,来确定元素。可以通过 id,name,className,tagName,cssSelector,linkText,partialLinkText 等属性来定位,不太好定位的元素,可以使用 xpath 方式。

  • 1. 通过 id 定位

driver.findElement( By.id("Text1"))

  • 2. 通过 name 定位

driver.findElement( By.name("输入"))

  • 3. 通过 xpath 定位

driver.findElement( By.xpath("html/body/div[1]/p[1]/label/input"))

  • 4. 通过 linkText 定位链接

driver.findElement( By.linkText ("这是一个链接")),需要完整匹配文字

  • 5. 通过 partialLinkText 定位链接

driver.findElement( By. partialLinkText ("链接")),不需要完整匹配文字

  • 6. findElements()

定位多个元素,返回一个 list,List elements,通过 elements.get(index).click();进行遍历操作,index 从 0 开始。

注意:如果属性中有空格,就只能使用 xpath 方法确定元素。

元素操作

1.文本框赋值

sendKeys("你好!")

2.清空文本框

clear()

3.获取文本框中内容

getAttribute("value")

4.点击

.click()

5.下拉框

  • 选择
    首先定义一个下拉框对象:
    Select select = new Select(driver.findElement(By.xpath("//*[@id='select_k1']")));
    第二步,通过对象定位所选的下拉框内容,三种方法:

 //通过可见文本去选择
select.selectByVisibleText("哈尔滨");   
//通过html中的value值去选择  
select.selectByValue("heb");         
//通过index(索引从 0 开始) 选择  
 select.selectByIndex(2);    
  • 获取下拉框已选值

    使用 getFirstSelectedOption() 获得所选的项,再通过 getText() 获得值:

    select. getFirstSelectedOption().getText()

6.复选框

7.单选按钮

//选中

click();

//判断单选框是否被选中,返回布尔值
isSelected();

8.页面弹框处理 (alert)

//声明对话框变量
Alert alert = driver.switchTo().alert();
//获取弹框中的文字
alert.getText()
//点击弹框中的确定
alert.accept();    

9.表单 (Form)

Form 中的元素的操作和其它的元素操作一样,对元素操作完成后对表单的提交:

WebElement approve = driver.findElement(By.id("approve"));
approve.submit(); 
//只适合于表单的提交,例如百度搜索框输入关键字后按回车键进行搜索

10.上传文件

//定位上传控件  
WebElement upload = driver.findElement(By.id("替换成实际的定位的值"));   
//定义了一个本地文件的路径  
String filePath = "d:\text.txt";  
//为上传控件进行赋值操作,将需要上传的文件的路径赋给控件  
upload.sendKeys(filePath);  

11.拖拉

//定义第一个元素  
WebElement element1 =driver.findElement(By.XX));   
//定义第二个元素   
WebElement element2= driver.findElement(By.XX));   
//将第一个元素拖拽到第二个元素  
(new Actions(driver)).dragAndDrop(element1, element2).perform();   

12.鼠标悬停

Actions action = new Actions(driver);  
action.moveToElement(driver.findElement(By.XX)).perform();  

13.滚动页面至某元素出现

JavascriptExecutor js = (JavascriptExecutor) driver;  
js.executeScript("arguments[0].scrollIntoView(true);", driver.findElement(By.XX));   

执行用例

使用 TestNG 中的@Test执行用例。

@Beforeclass 在执行类之前执行, @Afterclass在执行类之后执行

输出结果

TestNG

TestNG 自带的结果,html 类型。

ReportNG

1.配置:

  • 下载
    三个包:guice-3.0.jar,reportng-1.1.4.jar,velocity-dep-1.4.jar,导入到项目中;

  • 配置监听
    Windows->preference-TestNG,配置如下图:

关闭默认监听,改为:org.uncommons.reportng.HTMLReporter

  • 配置 xml 文件

    新增:

    <listener class-name="org.uncommons.reportng.HTMLReporter" />

注明:我放在了前面

2.二次开发

反编译工具:jd-gui.exe(打开导入文件即可) 或 jad.exe 和 net.sf.jadclipse_3.3.0.jar

2.1 配置:

下载 jad.exe 和 jadclipse(需要下载支持 eclipse 版本的,我的 eclipse 是 4.3.0)。

将 jad.exe 放在 java 目录下:E:\Program Files\Java\jdk1.8.0_05\jre\bin;
下载地址:http://download.csdn.net/detail/shilinjie_8952/9674940
将 net.sf.jadclipse_3.3.0.jar 拷贝到:XX\eclipse\plugins 下面,重启 eclipse
打开之后,选择 Eclipse->Window->Preferences->Java,设置如下图:

配置打开.class 默认方式:

.class 和.class without source 都要修改为默认值是 JadClipse


注意:如果修改完成后,打开的.class 文件全是注释,说明 Jad 的路径不正确。
有时这个反编译的不好用,可以配合 jd-gui.exe 或者其他反编译软件一起查看源码。

2.2 修改源码

思路:新建一个工程,导入需要的包,按照 ReportNG 创建目录和 java 文件,肯定会有些错误,修改一(因为是反编译的,所以会有些问题)能编译通过就可以,(我的是最笨的,一个一个创建的 java 文件,应该有更好的办法)。按照需求修改源码,右键工程,就可以导出 jar 了。

元素管理

两种方法都可以对元素进行管理:

  1. Excel 文件存储元素
    可以将元素统一存储在 excel 中,在执行用例之前,统一读取到数组中,包括:编号,名称,查找方法,值,描述。

  1. 数据库存储元素
    可以将元素通过工具直接插入到数据库中保存,在执行用例之前,统一读取到数组中,包括:编号,名称,查找方法,值,描述等字段。描述在这里(自己写的 C# 小程序)
    读取数据库中的数据请见

用例管理
用例采用 excel 进行管理,用 sheet 区分不同功能,储存相关需要验证的字段,固定列:第一列(编号),倒数第二列(预期结果),最后一列(错误类型),三列固定的值,用于在代码中使用。请见

持续集成

采用 Jenkins+Ant+Svn 实现。

Jenkins 是基于 Java 开发的一种持续集成工具,用于监控持续重复的工作,功能包括:持续的软件版本发布/测试项目、监控外部调用执行的工作。

Ant:形象来说,你要把代码从某个地方拿来,编译,再拷贝到某个地方去等等操作,这里用来:从 svn 上签出到某个文件夹下—>编译—>执行用例

Jenkins 配置

  1. 安装 jdk
    步骤参考本文环境搭建-Java 运行环境。
  2. 下载 Jenkins
    通过官网下载:https://jenkins.io/index.html

下载下来的是一个 msi 文件,直接点击安装,默认安装,时间挺长的,而且好多插件装不上,没关系,用到再哪个装哪个。

装完之后,访问:http://127.0.0.1:8080/ ,需要登录,登录名:admin,admin 的密码保存在安装目录 Jenkins\secrets\initialAdminPassword 文件中。

  1. 插件安装

    Ant Plugin:执行 build.xml 文件

    SVN Publisher plugin:通过 SVN 签出源码

    HTML Publisher Plugin:将测试结果显示在 Jenkins 中

    Email Extension Plugin:发邮件使用

  2. 系统配置
    系统管理—Global Tool Configuration,配置 jdk 和 ant

注意:登录就去有时会报错,错误大概就是插件没有安装好,去系统设置里面,找一下报错的插件,装上就好了。步骤如下:

找到插件,勾选,点击下面直接安装:

安装过程中可能会出现下载插件失败的情况,可以根据失败提示中的下载地址,下载到本地,选择 “高级” 上传下载的插件,就会自动安装了:

节点配置
有时候没有选项:Launch slave agents using Java Web Star

解决:系统管理-Configure Global Security-随机选取勾上 tcp port for JNLP agents,原来是禁用的

Ant 配置

  1. Jdk 安装 参考本文环境搭建-Java 运行环境
  2. Ant 下载:http://ant.apache.org/srcdownload.cgihttp://download.csdn.net/detail/shilinjie_8952/9689638 下载。

环境变量:

ant_home:E:\ant\apache-ant-1.9.7-bin\apache-ant-1.9.7,bin 目录所在路径

Path: %ANT_HOME%\bin ant.bat 所在路径

在 doc 下,测试:ant.bat,出现下图配置成功:

Jenkins 使用

1.创建节点

点击 ok

进入配置节点:

创建好之后,如下图:

启动节点:点击 “Launch”,下载,之后,双击下载到的 slave-agent.jnlp 文件,或在 doc 下执行红框中的那一串(我用命令启动提示 Unable to access jarfile slave.jar),都可以启动,启动好如下图:

2.创建任务

点击 “创建一个新任务”,填写任务名称,选择自由风格,如下图:

设置源码管理:添加 svn 源码路径,设置 svn 的用户名密码

构建触发器:设置何时什么频率进行构建

我设置的是:每天 17 点 28 分构建,28 17 * * * 说明:

第一个参数代表的是分钟 minute,取值 0~59;

第二个参数代表的是小时 hour,取值 0~23;

第三个参数代表的是天 day,取值 1~31;

第四个参数代表的是月 month,取值 1~12;

最后一个参数代表的是星期 week,取值 0~7,0 和 7 都是表示星期天。

所以 28 17 * * * 表示的就是每天的 17 点 28 构建一次。

构建:选择 Execute Windows batch command,填写 ant

或者选择 Invoke Ant:

构建后,需要显示一下测试报告,采用 publish html report 方式,实际上就是读取一个 html 文件,显示在 jenkins 里面的 Html Report 中

如果需要发送邮件,也可以添加一个构建后操作:

需要填写收件人地址,邮件内容选择了 html;Attach Build Log,选择 Attach Build Log(发送日志附件);trigger 触发发邮件,选择总是发邮件。

需要参考下面:5.配置发送邮件 将发邮件配置好

Defult content 内容

<body>
    <table  border="1" cellspacing="0" cellpadding="5">
        <tr height=30 bgcolor="#aaa">
            <td  align="center"  >名称</td>
            <td align="center"  ></td>
        </tr>
        <tr  height=30  bgcolor="#d5d5d5">
            <td align="left" >项目名称</td>
            <td align="left" >$PROJECT_NAME</td>
        </tr>
        <tr height=30 bgcolor="#d5d5d5">
            <td align="left">执行编号</td>
            <td align="left"  >$BUILD_NUMBER</td>
        </tr>
        <tr height=30 bgcolor="#d5d5d5">
            <td align="left"  >构建状态</td>
            <td align="left"  >$BUILD_STATUS</td>
        </tr>
        <tr height=30 bgcolor="#d5d5d5">
            <td align="left"  >触发原因</td>
            <td align="left"  >${CAUSE}</td>
        </tr>
        <tr height=30 bgcolor="#d5d5d5">
            <td align="left"  >日志地址</td>
            <td align="left"  ><a href="${BUILD_URL}console">${BUILD_URL}console</a></td>
        </tr>
        <tr height=30 bgcolor="#d5d5d5">
            <td align="left"  >构建地址</td>
            <td align="left"  ><a href="$BUILD_URL">$BUILD_URL</a></td>
        </tr>
        <tr height=30 bgcolor="#d5d5d5">
            <td height=30 bgcolor="#d5d5d5" colspan="2"   > 
                ${JELLY_SCRIPT,template="html"}
            </td>

</tr>
</table>

到此,任务就创建好了。

构建的过程是:先利用 svn 签出源码,然后根据构建中的 ant 命令或 Invoke Ant 方式执行构建,实际上就是在源码文件夹中寻找 build.xml 文件,并执行,接下来需要说明一下被执行的 build.xml 文件如何配置。

3.配置 build.xml 文件

这个配置很重要,决定了能否执行测试用例

4.构建

可以按照构建触发器中的设置进行构建,也可以立刻构建查看各项是否设置正确:

构建过程中查看控制台,可以查看到过程:

执行完用例之后,通过 HTML Report 查看结果

5.配置发送邮件

 系统设置:Jenkins Location 设置系统管理员地址

系统设置:Extended E-mail Notification 设置

我用的是 qq 邮箱,密码是 16 位授权码,需要勾选 ssl,不然服务器报错

 系统设置:邮件通知
要与系统管理员邮箱设置一致,密码 16 位授权码

问题与解决方法

1.问题:构建过程中,不显示浏览器

解决方法:不使用系统级服务,而是手动启动 Jenkins。

我的电脑->管理->服务和应用程序->服务,将 jenkins 服务禁用,并且禁止启动,自行用命令启用

java -Dhudson.model.DirectoryBrowserSupport.CSP= -jar "E:\Program Files (x86)\Jenkins\jenkins.war"
最好写成 bat 文件,内容:

echo "Jenkins CI automation testting"

java -Dhudson.model.DirectoryBrowserSupport.CSP= -jar "E:\Program Files (x86)\Jenkins\jenkins.war"

pause

每次启动通过 bat 文件启动

2.问题:构建报错:编码 GBK 的不可映射字符

解决方法:在 build.xml 中,javac 下,增加

<compilerarg  line="-encoding UTF-8 "/>

,build.xml 中有注释。

3.问题:报告显示不正确,index 中没有值

解决方法:在启动时,用:java -Dhudson.model.DirectoryBrowserSupport.CSP= -jar "E:\Program Files (x86)\Jenkins\jenkins.war"启动。

~~

mysql 存储元素及 java 源码示例,请参考文章中的链接下载

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 39 条回复 时间 点赞

厉害,实现的很完整,数据库管理元素的界面是用什么写的?

#1 楼 @sunkuan2007 😄 元素管理使用 C# 写的

元素管理点个赞,其他的也整理的很清楚了。

挺好的文章,不过我个人认为把元素这么直接抽离,对后期代码维护并没有很好的作用,如果我是新接手这个项目,我需要看代码,并再看数据库或者 excel,才能确定我修改是否正确,从产品角度来说,本来一步搞定的事情,我至少分为 2 步甚至 3 步才能完成,我想法是直接把元素在 PO 文件中参数化处理,元素还是在该 po 文件中,查找较为方便,毕竟测试代码不像开发那样需要做打包动作

—— 来自 TesterHome 官方 安卓客户端

#4 楼 @hu_qingen 嗯嗯,我再去研究一下这个 po 文件,没有听过这个,还好写出来,不然都不知道有这个 po 文件。。。。😃🙏

#3 楼 @testercc 我脚着新手入门够用了,整理的还是啰嗦了一点,也是记下自己工作过程中的问题,有些杂

开源学习一下啊。楼主

挺不错的,赞,不过现在稳定性如何啊?
现在前端变化这么快,以前也做 UI 类 case,但是维护代价总是太大了,最后不得不寻找 http 层的测试

#8 楼 @ruoya503 还可以,因为单位是做产品的,界面元素相对稳定,即使是变化也是在布局样式上的微调,基本上元素不会消失,直接修改元素的值就可以,一般不用调整代码

喵喵 #10 · 2016年11月29日 Author

#7 楼 @dfan 我有时间的时候整理一下哈~

太 感谢了

喵喵 #12 · 2016年11月29日 Author

#11 楼 @_PC_ 😁 哈哈,看来是有用了~

#12 楼 @672010021 你跟陈大喵,张大喵什么关系😂

喵喵 #14 · 2016年11月29日 Author

#13 楼 @mads 😂 😂 😂 是雷锋和雷峰塔,周杰和周杰伦的关系。。。哈哈,准确的说,木有关系😂

@672010021 里面的元素不会都放在一个 excle 文件或者数据库的表中吧,那样看起来不是很多么。而且修改了一个元素后,都不好去修改。

喵喵 #16 · 2016年11月29日 Author

#15 楼 @cloudwind excel 是一张表一个 sheet 中的,数据库也是一张表,元素起名字的时候都是有规律的,在 excel 表格里是可以排序的,如果通过元素管理的工具访问,那也方便了,那个工具我做了有检索,元素的属性基本上存上就很少改动,除非报错了调试的时候,需要查一下报错的元素值对应页面哪个元素,可以通过出错的元素值进行检索查看

@672010021 额,那就是一个 sheet 对应一个页面吧,是说一个 excel 中通过 sheet 来标识页面吧,比如登录页面,个人中心页面,类似这种吧。然后在这些页面中标识每个页面的元素么。我是直接写在代码中的,比如定义一个 Basepage,然后通过继承它,然后有 loginpage,等等其它页面。至于你说的那个数据库的管理元素感觉也是一个好方法。应该也是一个页面对应一个表格吧。有 loginpage 表,应该不是将所有元素都放在一个表格吧,那样不太好管理。。

@672010021 因为我这边主要是 app 的 ui,我也在想怎么想处理好这些 ui 的元素。经常碰到很多页面的元素都有重复的。只能暂时通过页面来定义,比如个人中心页面,反馈页面,登录页面,视频信息页面等等。如何有效的管理这些元素是个大问题。。。

喵喵 #19 · 2016年11月29日 Author

#18 楼 @cloudwind 嗯嗯,也可以用 sheet 分开,我开始使用 sheet 分开的,后来一瞅一个 sheet 也没几条数据,就干脆放一起了,你说的好多页面都有重复的问题是不是好多页面都用到了一个元素,这个存一个就成了,用再去取

喵喵 #20 · 2016年11月29日 Author

#17 楼 @cloudwind 用多个表也成,就是自动化测试代码那边取数据的时候,得按照分好的表取值,分别从不同的表取数据,有个自己的规律就成😀

你好楼主,我可以联系你么(微信?),我也在做这块但是有很多不懂得想咨询你

喵喵 #22 · 2016年11月29日 Author

#21 楼 @alfredwu 主页 url 里面有我的 qq~

#22 楼 @672010021 在哪里看?找不到呢

喵喵 #24 · 2016年11月30日 Author

#23 楼 @alfredwu 672010021

666,我就接触过 web 和手机端自动化测试

喵喵 #26 · 2016年11月30日 Author

#25 楼 @TestWriter2016 手机端自动化没做下去,只做了登录,哈哈,但底层的处理都是通用的,原理也差不离

终于碰到一个跟我玩一样套路的了,不过我还在摸索中。。

—— 来自 TesterHome 官方 安卓客户端

终于看到一个玩一样套路的了,不过我才刚接触

—— 来自 TesterHome 官方 安卓客户端

4.遗留问题:操作后,需要向测试人员发送邮件,邮件发送失败提示:SendFailedException message: 553 authentication is >required,126 smtp7,DsmowADX5VYXxztYRH8tCQ--.15695S2 1480312600。待解决。 ~~

正好昨天也碰到这个问题,楼主可以尝试下一下方法:

  • 邮箱需要开启 SMTP 服务(现在网易系的邮箱开启 SMTP 时需要验证码,改用 sina 邮箱)
  • 需与系统设置 - 系统管理员地址一致
  • 如使用邮件插件,填入正确的 SMTP server



喵喵 #30 · 2016年12月13日 Author

#29 楼 @peace 哇,谢谢,我也换了个 qq 邮箱,用了 16 位的授权码,勾选了 ssl,就好啦。

这个厉害了 先收藏了哈 谢谢 LZ 分享

喵喵 我工作中的 API 测试 (TestNG,Oauth) 中提及了此贴 01月18日 16:02

这是我在社区里看到最最接地气的一片技术帖子了!赞,希望作者有时间多多分享下!

喵喵 #34 · 2017年03月15日 Author
吕明浩 回复

😃 谢啦~~写的比较啰嗦,下次分开写,不然太长了,抓不住重点了

喵喵 自动化测试_Web 页面元素管理工具 中提及了此贴 03月15日 11:49

楼主您好。我是新手,希望能指导下,多谢。
1.元素管理 excel 中,“元素名称” 列有什么作用?比如登录页用户名框 login_username,代码是自动在页面类中生成一个名为 login_username 的成员变量(WebElement 类型)?如何实现的?
2.用例管理 excel 中,“用户名”、“密码” 列这 5 个字,代码如何根据它们找到元素的?(即根据这 5 个字,如何找出对应的 id、xpath 等定位器)
谢谢指导,期待帮助。

回复

不好意思,公司不允许上网,所以我的回答的太迟了,可能你已经解决了,但还是给个答复

  1. 元素名称列在元素管理 excel 中,是唯一标识,可以通过这个值,找到唯一一条记录,代码中通过这个记录,来定义元素; 具体代码中,封装了一个类,描述了一个元素的属性,包括:元素名(对应 excel 中的元素名称),查找类型(xpath,id 等)
  2. 我在代码里面,把用例管理 excel 中的数据,一次性的读取到了一个二维数组里面,通过固定下标的方式,访问用例中的数据(其中,预期结果和用例名称,这后两列是固定的,可以通过数组列数减二和减一来确定下标值),用例 excel 中,不涉及到查找元素

如果不明白,可以加 qq672010021

您好,请问下我 jenkins 已经配置了相应的邮箱配置(管理员处邮箱和发送邮箱一直,密码使用的授权码,邮箱是 163 的),但发送测试邮件的时候 还是会提示我 553 authentication is required 错误


正常配置后,虽然发送测试邮件总是 553,但正式构建后,是可以发送成功的,很无语啊

仅楼主可见
喵喵 #42 · 2020年09月15日 Author

文章末尾新增 java 源码示例、mysql 版本元素管理工具下载链接

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册