美文网首页
登录模块自动化测试实现(2)

登录模块自动化测试实现(2)

作者: testerPM | 来源:发表于2020-01-23 16:11 被阅读0次

    如何确定登录成功或者失败的弹出框提示信息(toast内容)是前端写的还是接口返回的:
    (1)fiddler抓包
    (2) F12->network->XHR

    弹出框提示信息停留时间短,很快消失了,这要怎么定位呢?
    (1)提示信息出来后
    F12->source 点击右边的暂停建

    image.png

    (2)调整网速
    F12-->network->online->slow 3g


    image.png

    自动化测试用例设计原则:
    1 .用例相互之间没有干扰,任何一条用例
    都可以单独执行,不依赖与其他用例
    设计思路:每去执行一条用例,就重新打开浏览器
    2.用例重复的操作/断言
    设计思路:通过dataProvider数据提供者,驱动测试用例执行
    3.自动化测试用例是由手工测试用例转化而来的

    选择用例的原则--重要的且比较适合自动化
    基础重复的功能---登录
    业务核心---投资理财
    测试用例优先级---优先级高
    历史Bug比较多的模块
    BeforeTest和BeforeMethod的区别
    BeforeTest:是测试suit执行之前执行的----是suit套件里面所有的测试方法执行之前执行---针对所有的测试方法---只执行一次
    BeforeMethod:是在@Test注解中的测试方法执行之前执行---针对单个测试方法,如果有多个测试方法都要执行,那么每执行完一个测试方法,会从BeforeMethod处再执行一次(BeforeMethod中的代码会执行多次)

    AfterTest和AfterMethod的区别:?
    AfterTest:是在所有测试方法执行结束之后再执行----只会执行一次
    AfterMethod:是针对单个测试方法执行结束之后再执行,如果有多个测试方法,每个测试方法都会执行一遍AfterMethod中的代码(会执行多次)

    上节写了成功登录正向case,下面写反向case:

    演示如下:

    package com.lemon.testcases;
    
    import static org.testng.Assert.assertTrue;
    
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.chrome.ChromeDriver;
    import org.openqa.selenium.support.ui.ExpectedConditions;
    import org.openqa.selenium.support.ui.WebDriverWait;
    import org.testng.Assert;
    import org.testng.annotations.AfterTest;
    import org.testng.annotations.BeforeTest;
    import org.testng.annotations.Test;
    
    public class Logincases {
    
        public static WebDriver driver;
    
        @BeforeTest
        public void setUp() {
            // 前置
            // 打开浏览器
            openBrowser("chrome");
            driver.get("http://120.78.128.25:8765/Index/login.html");
        }
    
    
        /**
         * 成功登录
         */
        @Test
        public void Login_success() throws InterruptedException {
            // 找到手机号输入框 输入手机号
            WebElement phone = driver.findElement(By.name("phone"));
            phone.sendKeys("13323234545");
            // 找到到密码输入框 输入密码
            WebElement password = driver.findElement(By.name("password"));
            password.sendKeys("lemon123456");
            // 找到登录按钮 点击登录
            WebElement login = driver.findElement(By.xpath("//button[text()='登录']"));
            login.click();
            //断言
            // 显示等待----我的账户元素可见且存在
            WebDriverWait wait = new WebDriverWait(driver, 6);
            WebElement until = wait
                    .until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//a[contains(text(),'我的帐户')]")));
            // 断言--我的账户 元素可见 until.isDisplayed()==true 说明断言成功
            Assert.assertTrue(until.isDisplayed());
            
            
    
        }
    
        
        /**
         * 未注册
         */
        @Test
        public void unregister() {
                    // 找到手机号输入框 输入  未注册的手机号
                    WebElement phone = driver.findElement(By.name("phone"));
                    phone.sendKeys("13333333331");
                    // 找到到密码输入框 输入密码
                    WebElement password = driver.findElement(By.name("password"));
                    password.sendKeys("lemon123456");
                    // 找到登录按钮 点击登录
                    WebElement login = driver.findElement(By.xpath("//button[text()='登录']"));
                    login.click();
                    //断言
                    WebDriverWait wait = new WebDriverWait(driver,5);
                    WebElement until = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@class=\\\"layui-layer-content\\\"]")));
                    Assert.assertTrue(until.isDisplayed());
    
            
        }
    
    
        @AfterTest
        public void teardown() {
            // 退出浏览器
            driver.quit();
        }
    
        public static void openBrowser(String browser) {
            if (browser.equals("chrome")) {
                // 1.设置chromedriver驱动文件的路径
                System.setProperty("webdriver.chrome.driver", "src/test/resources/chromedriver.exe");
                // 2.打开浏览器
                driver = new ChromeDriver();
                // 4.退出浏览器即关闭浏览器
                // quit是退出浏览器,close是只关闭当前打开的窗口,不等于关闭整个浏览器
                // driver.quit();
            }
        }
    
    }
    
    
    

    执行上面代码:

    
    PASSED: Login_success
    FAILED: unregister
    org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"css selector","selector":"*[name='phone']"}
      (Session info: chrome=79.0.3945.88)
    For documentation on this error, please visit: https://www.seleniumhq.org/exceptions/no_such_element.html
    Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:17:03'
    System info: host: 'DESKTOP-T8FJLOJ', ip: '192.168.101.17', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_65'
    Driver info: org.openqa.selenium.chrome.ChromeDriver
    Capabilities {acceptInsecureCerts: false, browserName: chrome, browserVersion: 79.0.3945.88, chrome: {chromedriverVersion: 79.0.3945.36 (3582db32b3389..., userDataDir: C:\Users\TF\AppData\Local\T...}, goog:chromeOptions: {debuggerAddress: localhost:49348}, javascriptEnabled: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: WINDOWS, platformName: WINDOWS, proxy: Proxy(), setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify}
    Session ID: 436fe9bb55f354ebc6c627911f008c0e
    
    

    从上面报错可以发现:未注册的case执行报错了,这是为什么呢?

    这是因为:登录case执行ok,就进入到首页了,首页是没有登录界面的,所有就报找不到元素的错误,那么如何解决呢?
    解决方法:先执行未注册的case,再执行登录case
    @Test(priority=1) @Test(priority=2) 设置优先级 值越高,执行顺序就越靠后

    代码设置优先级ok,再次执行:
    未注册case可以执行,但是登录case又执行失败:如下图
    这是因为,执行 未注册case,输入手机号,没有清空


    image.png

    上面问题如何解决?
    解决方式:每执行一次case,就重新打开一个新的浏览器(没有缓存)

    代码优化如下:

    
    package com.lemon.testcases;
    
    import static org.testng.Assert.assertTrue;
    
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.chrome.ChromeDriver;
    import org.openqa.selenium.support.ui.ExpectedConditions;
    import org.openqa.selenium.support.ui.WebDriverWait;
    import org.testng.Assert;
    import org.testng.annotations.AfterMethod;
    import org.testng.annotations.AfterTest;
    import org.testng.annotations.BeforeMethod;
    import org.testng.annotations.BeforeTest;
    import org.testng.annotations.Test;
    
    public class Logincases {
    
        public static WebDriver driver;
    
        @BeforeMethod
        public void setUp() {
            // 前置
            // 打开浏览器
            openBrowser("chrome");
            driver.get("http://120.78.128.25:8765/Index/login.html");
        }
    
        /**
         * 成功登录
         */
        @Test(priority = 2)
        public void Login_success() throws InterruptedException {
            // 找到手机号输入框 输入手机号
            WebElement phone = driver.findElement(By.name("phone"));
            phone.sendKeys("13323234545");
            // 找到到密码输入框 输入密码
            WebElement password = driver.findElement(By.name("password"));
            password.sendKeys("lemon123456");
            // 找到登录按钮 点击登录
            WebElement login = driver.findElement(By.xpath("//button[text()='登录']"));
            login.click();
            // 断言
            // 显示等待----我的账户元素可见且存在
            WebDriverWait wait = new WebDriverWait(driver, 6);
            WebElement until = wait
                    .until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//a[contains(text(),'我的帐户')]")));
            // 断言--我的账户 元素可见 until.isDisplayed()==true 说明断言成功
            Assert.assertTrue(until.isDisplayed());
    
        }
    
        /**
         * 未注册
         */
        @Test(priority = 1)
        public void unregister() {
            // 找到手机号输入框 输入 未注册的手机号
            WebElement phone = driver.findElement(By.name("phone"));
            phone.sendKeys("13333333331");
            // 找到到密码输入框 输入密码
            WebElement password = driver.findElement(By.name("password"));
            password.sendKeys("lemon123456");
            // 找到登录按钮 点击登录
            WebElement login = driver.findElement(By.xpath("//button[text()='登录']"));
            login.click();
            // 断言
            WebDriverWait wait = new WebDriverWait(driver, 5);
            WebElement until = wait
                    .until(ExpectedConditions.visibilityOfElementLocated(By.className("layui-layer-content")));
            String actualValue = "此账号没有经过授权,请联系管理员!";
            String expectedValue = until.getText();// 获取元素的文本的值
            Assert.assertEquals(actualValue, expectedValue);
    
        }
    
        @AfterMethod
        public void teardown() {
            // 退出浏览器
            driver.quit();
        }
    
        public static void openBrowser(String browser) {
            if (browser.equals("chrome")) {
                // 1.设置chromedriver驱动文件的路径
                System.setProperty("webdriver.chrome.driver", "src/test/resources/chromedriver.exe");
                // 2.打开浏览器
                driver = new ChromeDriver();
                // 4.退出浏览器即关闭浏览器
                // quit是退出浏览器,close是只关闭当前打开的窗口,不等于关闭整个浏览器
                // driver.quit();
            }
        }
    
    }
    
    
    
    

    疑问:反向case 有很多,要全面覆盖,每个case写一个测试方法吗?
    答案:肯定不是。如果反向用例元素定位方式是一样的,可以通过数据驱动,传参实现,使用同一个测试方法

    
    package com.lemon.testcases;
    
    import static org.testng.Assert.assertTrue;
    
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.chrome.ChromeDriver;
    import org.openqa.selenium.support.ui.ExpectedConditions;
    import org.openqa.selenium.support.ui.WebDriverWait;
    import org.testng.Assert;
    import org.testng.annotations.AfterMethod;
    import org.testng.annotations.AfterTest;
    import org.testng.annotations.BeforeMethod;
    import org.testng.annotations.BeforeTest;
    import org.testng.annotations.DataProvider;
    import org.testng.annotations.Test;
    
    public class Logincases {
    
        public static WebDriver driver;
    
        @BeforeMethod
        public void setUp() {
            // 前置
            // 打开浏览器
            openBrowser("chrome");
            driver.get("http://120.78.128.25:8765/Index/login.html");
        }
    
        /**
         * 反向case数据提供源
         * 
         * @return
         */
        @DataProvider
        public Object[][] loginDatas() {
    
            Object[][] datas = { { "13333333331", "lemon123456", "此账号没有经过授权,请联系管理员!" },
                    { "13323234545", "123456", "帐号或密码错误!" }
    
            };
    
            return datas;
        }
    
        /**
         * 成功登录
         */
        @Test(priority = 2)
        public void Login_success() throws InterruptedException {
            // 找到手机号输入框 输入手机号
            WebElement phone = driver.findElement(By.name("phone"));
            phone.sendKeys("13323234545");
            // 找到到密码输入框 输入密码
            WebElement password = driver.findElement(By.name("password"));
            password.sendKeys("lemon123456");
            // 找到登录按钮 点击登录
            WebElement login = driver.findElement(By.xpath("//button[text()='登录']"));
            login.click();
            // 断言
            // 显示等待----我的账户元素可见且存在
            WebDriverWait wait = new WebDriverWait(driver, 6);
            WebElement until = wait
                    .until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//a[contains(text(),'我的帐户')]")));
            // 断言--我的账户 元素可见 until.isDisplayed()==true 说明断言成功
            Assert.assertTrue(until.isDisplayed());
    
        }
    
        /**
         * 未注册
         */
        @Test(priority = 1, dataProvider = "loginDatas")
        public void login_failure(String mobilephone, String pwd, String msg) {
            // 找到手机号输入框 输入 未注册的手机号
            WebElement phone = driver.findElement(By.name("phone"));
            phone.sendKeys(mobilephone);
            // 找到到密码输入框 输入密码
            WebElement password = driver.findElement(By.name("password"));
            password.sendKeys(pwd);
            // 找到登录按钮 点击登录
            WebElement login = driver.findElement(By.xpath("//button[text()='登录']"));
            login.click();
            // 断言
            WebDriverWait wait = new WebDriverWait(driver, 5);
            WebElement until = wait
                    .until(ExpectedConditions.visibilityOfElementLocated(By.className("layui-layer-content")));
            String actualValue = msg;
            String expectedValue = until.getText();// 获取元素的文本的值
            Assert.assertEquals(actualValue, expectedValue);
    
        }
    
        @AfterMethod
        public void teardown() {
            // 退出浏览器
            driver.quit();
        }
    
        public static void openBrowser(String browser) {
            if (browser.equals("chrome")) {
                // 1.设置chromedriver驱动文件的路径
                System.setProperty("webdriver.chrome.driver", "src/test/resources/chromedriver.exe");
                // 2.打开浏览器
                driver = new ChromeDriver();
                // 4.退出浏览器即关闭浏览器
                // quit是退出浏览器,close是只关闭当前打开的窗口,不等于关闭整个浏览器
                // driver.quit();
            }
        }
    
    }
    
    
    
    
    

    执行结果:

    PASSED: login_failure("13333333331", "lemon123456", "此账号没有经过授权,请联系管理员!")
    PASSED: login_failure("13323234545", "123456", "帐号或密码错误!")
    PASSED: Login_success
    
    ===============================================
        Default test
        Tests run: 3, Failures: 0, Skips: 0
    ===============================================
    
    
    ===============================================
    Default suite
    Total tests run: 3, Failures: 0, Skips: 0
    ===============================================
    
    [TestNG] Time taken by [FailedReporter passed=0 failed=0 skipped=0]: 4 ms
    [TestNG] Time taken by org.testng.reporters.jq.Main@7c30a502: 21 ms
    [TestNG] Time taken by org.testng.reporters.SuiteHTMLReporter@1d251891: 15 ms
    [TestNG] Time taken by org.testng.reporters.XMLReporter@b684286: 4 ms
    [TestNG] Time taken by org.testng.reporters.EmailableReporter2@511baa65: 3 ms
    [TestNG] Time taken by org.testng.reporters.JUnitReportReporter@5b464ce8: 2 ms
    
    
    

    相关文章

      网友评论

          本文标题:登录模块自动化测试实现(2)

          本文链接:https://www.haomeiwen.com/subject/cmkpzctx.html