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

  • 作者: 凯哥Java(公众号:凯哥Java)
  • 测试相关
  • 时间:2017-11-21 09:05
  • 7880人已阅读
简介 前面我们实现了基本框架的搭建过程,把第一条自动化登录的脚本进行了业务Action和测试脚本进行分层或者分离,使用了POM思想去构造首页,测试类利用工厂类进行元素初始化操作。群里有朋友提醒,在第五篇中HomePage.java每个方法可以不用写返回类型,建议全部改成void,这个确实正确,因为测试脚本类使用了PageFactory类,所以页面类不需要返回方法。如果要写返回方法,测试类不使用PageF

🔔🔔🔔好消息!好消息!🔔🔔🔔

有需要的朋友👉:联系凯哥 微信号 kaigejava2022

前面我们实现了基本框架的搭建过程,把第一条自动化登录的脚本进行了业务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的跳转的问题。

TopTop