java page object_Selenium+PageObject+Java实现测试用例

本文介绍了如何运用Selenium和PageObject设计模式来编写Java自动化测试用例,针对知乎登录场景进行了详细说明。通过创建BasePage、BaseTest、HomePage和LoginPage类,实现了页面操作和测试步骤,包括无效用户名和密码、空用户名和密码的测试场景。测试框架使用了TestNG,但实际运行中遇到了由于Chrome版本过高导致的登录问题,以及需要解决的验证码问题。
摘要由CSDN通过智能技术生成

selenium:selenium是一个自动化测试工具,支持chrome,firefox,Safari等主流浏览器的。下载对应浏览器的驱动,就能使用selenium对web页面进行测试。

PageObject:其实是一种设计模式,总的来说就是把每一个页面封装成一个对象。对页面的操作写成一个方法。好处在于当前端ui修改后,我们不需要到每一个测试用例上修改,只需要修改页面对应的类即可。

下面针对知乎登陆实现具体的测试用例。

项目的结构如下:

20181126183647538541.png

其实pages存放的每个页面对应的对象,tests文件夹是测试用例,utilities是一些辅助类。

测试框架我们使用的testNG框架

整个项目所需要的依赖入下:

org.seleniumhq.selenium

selenium-java

3.14.0

test

org.testng

testng

6.14.3

packagepages;import io.appium.java_client.android.*;importorg.openqa.selenium.WebDriver;importorg.openqa.selenium.support.ui.ExpectedConditions;importorg.openqa.selenium.WebElement;importorg.openqa.selenium.support.ui.WebDriverWait;importorg.openqa.selenium.support.PageFactory;importorg.openqa.selenium.By;importorg.testng.Assert;public classBasePage {

publicWebDriver driver;publicWebDriverWait wait;publicBasePage(WebDriver driver){this.driver=driver;

wait= new WebDriverWait(driver,15);

}public voidwaitVisibility(By elementBy){

wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(elementBy));

}public voidclick(By elementBy){

waitVisibility(elementBy);

driver.findElement(elementBy).click();

}public voidwriteText(By elementBy,String text){

waitVisibility(elementBy);

driver.findElement(elementBy).sendKeys(text);

}publicString readText(By elementBy){

waitVisibility(elementBy);returndriver.findElement(elementBy).getText();

}public voidassertEquals(By elementBy,String expectedText){

waitVisibility(elementBy);

Assert.assertEquals(readText(elementBy),expectedText);

}

}

BasePage类是所有page类的基类,包括初始化浏览器驱动和一些页面常见的操作。

BaseTest.java

packagetests;importorg.openqa.selenium.remote.CapabilityType;importorg.openqa.selenium.remote.DesiredCapabilities;importorg.testng.annotations.AfterClass;importorg.testng.annotations.BeforeClass;importio.appium.java_client.AppiumDriver;importio.appium.java_client.android.AndroidDriver;importio.appium.java_client.remote.MobileCapabilityType;importorg.openqa.selenium.WebDriver;importorg.openqa.selenium.chrome.ChromeDriver;importjava.net.MalformedURLException;importjava.net.URL;public classBaseTest {publicWebDriver driver;@BeforeClasspublic voidsetup(){

System.setProperty("webdriver.chrome.driver","D:\\\\chrome-driver\\chromedriver.exe");

driver= newChromeDriver();

driver.manage().window().maximize();

}

@AfterClasspublic voidteardown(){

driver.quit();

}

}

BaseTest.java实现的测试前准备动作,测试完成的动作。

LoginTest.java

packagetests;importpages.HomePage;importpages.LoginPage;importorg.testng.annotations.Test;public class LoginTest extendsBaseTest {

@Testpublic voidinvalidLoginTest_InvalidUserNameInvalidPassword() {

HomePage homePage= newHomePage(driver);

homePage.goToN11()

.goToLoginPage()

.loginToZhihu("email@qq.com", "password")

.verifyLoginPassword("账号或密码错误");

}

@Testpublic voidinvalidLoginTest_EmptyUsernameAndPassword(){

HomePage homePage= newHomePage(driver);

homePage.goToN11()

.goToLoginPage()

.loginToZhihu("","")

.verifyLoginUserName("请输入手机号或邮箱")

.verifyLoginPassword("请输入密码");

}

}

LoginTest是针对知乎登陆写的具体测试用例,这里包括两个测试用例。一个是使用错误的的账号和密码进行登陆。第二个是使用的空的账号和密码。

然后给出预期的应该出现的结果。

HomePage.java

packagepages;importorg.openqa.selenium.By;importorg.openqa.selenium.WebDriver;importorg.openqa.selenium.support.ui.ExpectedCondition;importorg.openqa.selenium.support.ui.WebDriverWait;importsun.rmi.runtime.Log;public class HomePage extendsBasePage{publicHomePage(WebDriver driver){super(driver);

}

String baseURL= "https://www.zhihu.com";

By signInButtonBy= By.xpath("//*[@id=\"root\"]/div/main/div/div/div/div[2]/div[2]/span");publicHomePage goToN11(){

driver.get(baseURL);return this;

}publicLoginPage goToLoginPage(){

click(signInButtonBy);return newLoginPage(driver);

}

}

HomePage主要是唤起浏览器,进入到知乎的首页,然后通过找到登录按钮,跳转到登录页面。

20181126183647660603.png

知乎的首页如图所示,我们通过xpath找到"登录”按钮所在的位置,然后点击,跳转到登录页面。

登录页面如下

20181126183648146900.png

LoginPage.java

packagepages;importpages.BasePage;importorg.openqa.selenium.WebDriver;importorg.openqa.selenium.By;importio.appium.java_client.android.AndroidElement;importio.appium.java_client.android.AndroidDriver;importorg.testng.asserts.Assertion;public class LoginPage extendsBasePage {

By usernameBy= By.name("username");

By passwordBy= By.name("password");

By loginButtonBy= By.className("SignFlow-submitButton");publicLoginPage(WebDriver driver) {super(driver);

}publicLoginPage loginToZhihu(String username, String password) {

writeText(usernameBy, username);

writeText(passwordBy, password);

click(loginButtonBy);return this;

}publicLoginPage verifyLoginUserName(String expectedText){

By errorMessageUsernameBy= By.xpath("//*[@id=\"root\"]/div/main/div/div/div/div[2]/div[1]/form/div[1]/div[2]/div[2]");

assertEquals(errorMessageUsernameBy,expectedText);return this;

}publicLoginPage verifyLoginPassword(String expectedText){

By errorMessagePasswordBy= By.xpath("//*[@id=\"root\"]/div/main/div/div/div/div[2]/div[1]/form/div[2]/div/div[2]");

assertEquals(errorMessagePasswordBy,expectedText);return this;

}

}

LoginPage.java主要实现了找到账号和密码元素所在的位置,然后进行填充。还有一个方法就是使用断言,看看出现的结果和预期的结果是否一致。这里的两个断言的分别的对应是LoginTest.java对应的两个测试用例中的对结果的判断。

errorMessageUsernameBy表示的是实际结果,

expectedText表示的预期结果。

然后我们启动LoginTest类,不出意外的话,Failures:0。但我这个用例中chrome版本太高了,登录知乎出现了missing argument grant_type错误。据说可以通过降低chrome版本结局

20181126183648452545.png

其实这个代码还是有问题,要想登录知乎,有些输入验证码。验证码的问题后面再讲。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值