专栏首页凯哥JavaSelenium+TestNG实战-6 自动化实现发一篇文章

Selenium+TestNG实战-6 自动化实现发一篇文章

前面我们实现了基本框架的搭建过程,把第一条自动化登录的脚本进行了业务Action和测试脚本进行分层或者分离,使用了POM思想去构造首页,测试类利用工厂类进行元素初始化操作。群里有朋友提醒,在第五篇中HomePage.java每个方法可以不用写返回类型,建议全部改成void,这个确实正确,因为测试脚本类使用了PageFactory类,所以页面类不需要返回方法。如果要写返回方法,测试类不使用PageFactory类,而是直接把每个页面类先创建一个实例对象,然后去调用实例方法。所以,这里我们采用页面工厂类,记得把前面return方法改成void。本篇来介绍如何把发文章这个用例自动化实现。

声明:本文由凯哥Java(www.kaigejava.com)发布于凯哥个人博客。

在本文末尾,凯哥会添加前五篇文章链接,方便大家阅读。

测试用例步骤

1. 登录

2. 登录后点击文章tab

3. 点击写文章label

4. 输入标题

5. 输入文章正文部分

6. 右侧点击发布按钮

7. 检查发布后文章是不是自己之前创建的文章

 下面我们继续利用POM思想,来组织我们页面对象和页面元素。文章这个tab下还有4个页面:所有文章,写文章,分类目录,标签。这里我们在pageobjects包下新建一个article的包,在article包下新建一个writearticle和allarticle两个包。然后在writearticle包下新建一个NewArticle.java文件,开始写我们页面元素和发文章相关方法构造。这里,大家注意到了,左侧是一些公共菜单栏,我们可以把这个写成一个菜单导航页面。

MenuNavigation.java内容如下

package pageobjects;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.WebElement;

import org.openqa.selenium.support.FindBy;

import myframework.BasePage;

public class MenuNavigation extends BasePage {

/**

* 记住,新建一个页面类,就里面写上构造方法

* @param driver

*/

public MenuNavigation(WebDriver driver) {

super(driver);

}

// 左侧文章菜单

@FindBy (xpath=".//*/div[@class='wp-menu-name' and text()='文章']")

WebElement Article_tab;

// 写文章

@FindBy (xpath=".//*/a[contains(@href,'post-new') and text()='写文章']")

WebElement Article_writeArticle_label;

// 所有文章 标签

@FindBy (xpath=".//*/a[@href='edit.php'][text()='所有文章']")

WebElement Article_AllArticles;

/**

* 点击左侧文章菜单

*/

public void clickArticle() {

click(Article_tab);

}

/**

* 点击左侧所有文章菜单

*/

public void clickAllArticle() {

click(Article_AllArticles);

}

/**

* 点击写文章

*/

public void clickNewArticle() {

click(Article_writeArticle_label);

}

}

NewArticle.java

package pageobjects.article.writeacticle;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.WebElement;

import org.openqa.selenium.support.FindBy;

import myframework.BasePage;

public class NewArticle extends BasePage {

/**

* 写文章页面元素定位和相关发文章方法定义

*/

public NewArticle(WebDriver driver) {

super(driver);

}

// 元素定位

// 文章标题输入定位

@FindBy (xpath=".//*/input[@id='title']")

WebElement Article_writeArticle_titleInputBox;

// 点击文本,有可视和文本两个

@FindBy (xpath=".//*[@id='content-html']")

WebElement Article_writeArticle_TextType;

// 正文输入定位

@FindBy (xpath=".//*[@id='content']")

WebElement Article_writeArticle_bodyContentBox;

// 发布按钮

@FindBy (xpath=".//*/input[@id='publish']")

WebElement Article_writeArticle_publishBtn;

// 文章链接

@FindBy (xpath=".//*[@id='sample-permalink']/a")

WebElement Article_writeArticle_link;

// 发文章方法

public void publishArticle(String title, String bodyContent) {

type(Article_writeArticle_titleInputBox, title);

click(Article_writeArticle_TextType);

type(Article_writeArticle_bodyContentBox, bodyContent);

click(Article_writeArticle_publishBtn);

}

// 点击文章链接

public void clickArticleLink() {

click(Article_writeArticle_link);

}

}

在testsuites包下新建一个文章的包,然后新建一个发布文章的测试类。在写文章的自动化脚本测试类之前,我们思考一下,写文章的前提是登录,我们在前已经学会了写登录。那么如何在写文章的类中先执行登录,然后执行写文章的操作。这就涉及到了用例的窜接问题,如何启动一次浏览器执行多条测试用例。记住,需要在第一个条用例,一般都是登录用例,把driver定义成public static的类型,而且把登录用例作为一个工具类抽取出来,供其他方法调用。在前面基础上,参照TestLogin.java的内容,我在pageobjects下新建一个Login.java的类,内容如下。

package pageobjects;

import java.io.IOException;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.support.PageFactory;

import org.testng.Assert;

import myframework.BrowserEngine;

import pageobjects.dashboard.DashBoardPage;

import pageobjects.homepage.HomePage;

public class Login {

public static WebDriver driver;

//第一步,获取浏览器类型,打开浏览器。打开测试网站

public static void initSetup() throws IOException{

BrowserEngine browser = new BrowserEngine();

browser.initConfigData();

driver = browser.getBrowser();

}

// 用page factory类来加载初始化主页元素,点击登录这个链接

public static void loginValid() throws InterruptedException{

HomePage hp = PageFactory.initElements(driver, HomePage.class);

//

hp.scrollToLogin();

Thread.sleep(1000);

hp.clickLoginLnk();

Thread.sleep(1000);

hp.login("root", "123456");

Thread.sleep(2000);

// 跳转下一个页面,所以需要换新页面的对象来操作

DashBoardPage dbp = PageFactory.initElements(driver, DashBoardPage.class);

// 断言

Assert.assertTrue(dbp.verifyUserNameIsDisplayed());

}

}

就修改了两点,定义public static driver, 然后去重了退出浏览器操作。

下面我们来写测试发布文章的用例。

package testsuites.article;

import java.io.IOException;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.support.PageFactory;

import org.testng.annotations.BeforeClass;

import org.testng.annotations.Test;

import pageobjects.Login;

import pageobjects.MenuNavigation;

import pageobjects.article.writeacticle.NewArticle;

public class TestNewArticle {

public WebDriver driver;

@BeforeClass

public void setUp() throws IOException, InterruptedException {

Login.initSetup();

Login.loginValid();

driver = Login.driver;

}

@Test

public void testNewArticle() throws InterruptedException {

//初始化导航菜单页面

MenuNavigation mn = PageFactory.initElements(driver, MenuNavigation.class);

mn.clickArticle();

Thread.sleep(2000);

mn.clickNewArticle();

Thread.sleep(2000);

//初始化写文章页面

NewArticle na = PageFactory.initElements(driver, NewArticle.class);

String title = "我的第一篇自动化发布的文章";

String bodyContent = "第一行,这篇是演示如何通过自动化脚本来发布一篇文章。";

na.publishArticle(title, bodyContent);

// 点击链接跳转到该文章

na.clickArticleLink();

// 等待

Thread.sleep(1000);

}

}

运行成功环境:chrmoe 62+chromedriver(2.33),这里运行有点卡,特别是登录后停留在dashboard页面,有时候7 8 秒有时候十几秒都在加载页面,不知道是不是本地服务器的问题。上面代码是多次运行之后才有的结果,你可能会卡在某一个元素定位失败的问题上,没关系,多看看报错信息,根据报错去调整更好方法,知道运行成功,运行成功之后还需要多运行测试几遍。

这里最重要的是去理解如何把前面一个用例或者方法的driver变量传递给当前的用例,主要用到的就是定义静态变量driver。然后把这些步骤放到当前用例的BeforeClass里运行。自己要多花时间去理解这个driver的赋值过程,理解好了,两个用例就能连接一块跑,多个用例也是一样的道理。下一篇,接着本篇的内容,介绍如何断言创建的文章的正确性,还有就是driver在多个浏览器tab的跳转的问题。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Selenium+TestNG实战-7 多个tab之间driver的切换

    本篇接着前面内容,主要学习driver如何在同一个浏览器的两个不同tab进行切换,然后如何判断我们创建的文章就是我们新建的。

    凯哥Java
  • 使用idea实现springboot Mybatis 整合(springboot 2.x)

    本来这篇博文老在就写好了,但是后来发现很多功能其实根本就没有检验通过就发出来了,导致遗留了很多坑,比如最难搞的就是SqlSessionFactory和PageH...

    凯哥Java
  • JavaWeb练习之使用filter实现自动登陆

    本篇来做一个Filter的练习题,就是网站自动登录的,这个自动登录,我们在学习cookies的时候做过,这次使用Filter来做一遍。

    凯哥Java
  • vi 方向键和Backspace键失效问题的解决方法

    Tencent JCoder
  • 1 秒杀系统模拟基础实现,使用DB实现

    业务隔离:将秒杀业务独立出来,尽量不与其他业务关联,以减少对其他业务的依赖性。譬如秒杀业务只保留用户id,商品id,数量等重要属性,通过中间件发送给业务系统,完...

    天涯泪小武
  • Netty中的ChannelHander详解

    channelHandler是用来做什么的?ChannelHandler用来处理组件之间的交互,结合它的状态做各种业务,通过ChannelPipelinel来连...

    爬蜥
  • Thrift入门及 Java 实现简单demo

    本文并未与spring boot集成,仅实现了demo.可以将本文中的类作为spring中的bean使用即可.

    呼延十
  • 手写RPC框架第二章《netty通信》

    案例介绍 在我们实现rpc框架的时候,需要选择socket的通信方式。而我们知道一般情况下socket通信类似与qq聊天,发过去消息,什么时候回复都可以。但是我...

    小傅哥
  • 使用nodejs和Java访问远程服务器的服务

    既然这篇文章用的是nodejs和Java访问远程服务器的服务,那么咱们先用另一门编程语言,SAP的ABAP(我日常工作使用得最多的编程语言)来开发一个服务吧。

    Jerry Wang
  • background-clip的正确使用姿势

    background-clip可以用来控制背景图片/颜色的填充范围。 我们知道,默认的background会填充盒模型的content+padding+bord...

    贾顺名

扫码关注云+社区

领取腾讯云代金券