Selenium+PageObject+Java实现测试用例

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

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

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

项目的结构如下:

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

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

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

<dependencies>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.14.0</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.14.3</version>
        </dependency>
    </dependencies>
 
package pages;
import io.appium.java_client.android.*;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.support.PageFactory;
import org.openqa.selenium.By;
import org.testng.Assert;
public class BasePage {

    public WebDriver driver;
    public WebDriverWait wait;
    public BasePage(WebDriver driver){
        this.driver=driver;
        wait= new WebDriverWait(driver,15);
    }
    public void waitVisibility(By elementBy){
        wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(elementBy));

    }
    public void click(By elementBy){
        waitVisibility(elementBy);
        driver.findElement(elementBy).click();
    }
    public void writeText(By elementBy,String text){
        waitVisibility(elementBy);
        driver.findElement(elementBy).sendKeys(text);
    }
    public String readText(By elementBy){
        waitVisibility(elementBy);
        return driver.findElement(elementBy).getText();
    }
    public void assertEquals(By elementBy,String expectedText){
        waitVisibility(elementBy);
        Assert.assertEquals(readText(elementBy),expectedText);
    }
}

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

BaseTest.java

package tests;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;

import io.appium.java_client.AppiumDriver;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.remote.MobileCapabilityType;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.net.MalformedURLException;
import java.net.URL;

public class BaseTest {
    public WebDriver driver;

    @BeforeClass
    public void setup(){
        System.setProperty("webdriver.chrome.driver","D:\\\\chrome-driver\\chromedriver.exe");
        driver = new ChromeDriver();
        driver.manage().window().maximize();
    }
    @AfterClass
    public void teardown(){
        driver.quit();
    }
}

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

LoginTest.java

package tests;
import pages.HomePage;
import pages.LoginPage;
import org.testng.annotations.Test;
public class LoginTest extends BaseTest {
    @Test
    public void invalidLoginTest_InvalidUserNameInvalidPassword() {
        HomePage homePage = new HomePage(driver);
        homePage.goToN11()
                .goToLoginPage()
                .loginToZhihu("[email protected]", "password")
                .verifyLoginPassword("账号或密码错误");

    }
    @Test
    public void invalidLoginTest_EmptyUsernameAndPassword(){
        HomePage homePage = new HomePage(driver);
        homePage.goToN11()
                .goToLoginPage()
                .loginToZhihu("","")
                .verifyLoginUserName("请输入手机号或邮箱")
                .verifyLoginPassword("请输入密码");
    }
}

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

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

HomePage.java

package pages;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;
import sun.rmi.runtime.Log;
public class HomePage extends BasePage{
    public HomePage(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");
    public HomePage goToN11(){
        driver.get(baseURL);
        return this;
    }
    public LoginPage goToLoginPage(){
        click(signInButtonBy);
        return new LoginPage(driver);
    }
}

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

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

登录页面如下

LoginPage.java

package pages;
import  pages.BasePage;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.By;
import io.appium.java_client.android.AndroidElement;
import io.appium.java_client.android.AndroidDriver;
import org.testng.asserts.Assertion;
public class LoginPage extends BasePage {
    By usernameBy = By.name("username");
    By passwordBy = By.name("password");
    By loginButtonBy = By.className("SignFlow-submitButton");
    public LoginPage(WebDriver driver) {
        super(driver);
    }

    public LoginPage loginToZhihu(String username, String password) {
        writeText(usernameBy, username);
        writeText(passwordBy, password);
        click(loginButtonBy);
        return this;
    }
    public LoginPage 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;
    }
    public LoginPage 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版本结局

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

 

原文地址:https://www.cnblogs.com/NaCl/p/Selenium.html

时间: 2024-09-30 04:23:48

Selenium+PageObject+Java实现测试用例的相关文章

Jmeter性能测试之如何写Java请求测试用例类

一. 引言: 最近工作中的一个项目要求做性能测试,该项目由提供服务的几个应用组成,选用的框架是阿里巴巴公司开源的服务框架Dubbo.关于Dubbo的介绍,网上也有很多资料,本人只是做了粗略的了解,没有深入研究,相关资料地址如下:http://www.iteye.com/magazines/103,http://alibaba.github.io/dubbo-doc-static/User+Guide-zh.htm#UserGuide-zh-%E6%80%A7%E8%83%BD%E6%B5%8B%

使用selenium遇到java.lang.NoSuchMethodError: org.apache.xpath.XPathContext,排查

处试selenium webdriver,运行小程序,抛如下错误: java.lang.NoSuchMethodError: org.apache.xpath.XPathContext.<init>(Z)V at org.apache.xpath.jaxp.XPathExpressionImpl.eval(XPathExpressionImpl.java:115) at org.apache.xpath.jaxp.XPathExpressionImpl.eval(XPathExpression

[selenium webdriver Java]常用api

1. 获取元素文本 WebElement类的getText()方法返回元素的innerText属性.所以元素里如果有子节点一样也会被返回出来.如下所示 1 public class GetText { 2 @Test 3 public void testGetText(){ 4 //启动driver,打开被测页面 5 System.setProperty("webdriver.chrome.driver", "chromedriver.exe"); 6 WebDri

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

原地址:http://blog.csdn.net/shilinjie_8952/article/details/53380373?locationNum=11&fps=1 测试环境:Java+Selenium+TestNG,Jenkins持续集成. 测试代码 代码结构 采用页面对象模型(Page Object),减少UI修改后,对代码的影响. Java编写,采用TestNG测试框架. 先说点概念的: Selenium Selenium是一套完整的Web应用程序测试系统,它包含了测试的录制(Sel

【Selenium 3+Java自动化(5)】-xpath定位

package com.mypro.jase; import java.net.URL; import java.security.cert.PKIXRevocationChecker.Option; import java.util.concurrent.TimeUnit; import javax.xml.bind.annotation.XmlID; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; im

【Selenium 3+Java自动化(4)】-八种元素定位

1 package com.mypro.jase; 2 3 import org.openqa.selenium.By; 4 import org.openqa.selenium.WebDriver; 5 import org.openqa.selenium.WebElement; 6 7 public class FindElement { 8 WebDriver driver; 9 String url = "http://www.baidu.com"; 10 11 /** 12

selenium phantomjs java无界面浏览器环境搭建

java selenium搭建无界面浏览器 1.http://phantomjs.org/ 下载windows版phantomjs 2.解压后bin目录下会有exe文件 3.测试代码: package se; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.phantomjs.PhantomJSDriver; pub

[selenium webdriver Java]元素定位——findElement/findElements

策略 语法 语法 描述 By id driver.findElement(By.id()) driver.findElements(By.id()) 通过id属性定位元素 By name driver.findElement(By.name()) driver.findElements(By.name()) 通过name属性定位元素 By class name driver.findElement(By.className()) driver.findElements(By.className(

selenium RC+JAVA 运行所遇到的问题

1.报错 Failed to start new browser session: java.lang.RuntimeException: Firefox 3 could not be found in the path!Please add the directory containing ''firefox.exe'' to your PATH environment. 遇到的原因:firefox没有安装在c盘(本人安装在d盘下),selenium找不到firefox路径.解决过程:首先尝试