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

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

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

项目的结构如下:

java测试用例表格 java 测试用例_java测试用例表格

其实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主要是唤起浏览器,进入到知乎的首页,然后通过找到登录按钮,跳转到登录页面。

java测试用例表格 java 测试用例_测试用例_02

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

登录页面如下

java测试用例表格 java 测试用例_chrome_03

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版本结局

java测试用例表格 java 测试用例_java测试用例表格_04

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