Java+Selenium3框架设计篇4-如何实现登录功能放在setUp()方法中

2024-06-11 12:18

本文主要是介绍Java+Selenium3框架设计篇4-如何实现登录功能放在setUp()方法中,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       本篇主要是回答一个网友的问题,就是他可以执行登录,但是登录之后的用例就执行不了,报空指针异常。在这里,特意用京东网站,结合testNG来举例实现这个功能,解决这个报错。我们的场景大概是这样的,我需要先登录,然后在京东首页搜索一个商品。就这么一个简单的测试场景,我们的测试用例的重点是在搜索商品,测试的前提条件是登录。

解决思路:

1. 登录是搜索的前提条件

2.登录能不能封装到一个普通类中去,然后在测试脚本中setUp方法中调用登录的脚本

3.如何把登录页面的driver实例对象传递给首页,然后进行搜索。

按照这个思路,我们先把登录页面,在POM中写好,封装好登录的方法。然后新建一个Login类,主要是调用BrowserEngine类中的浏览器和测试地址。第三,在测试搜索类中的BeforeClass下调用Login类的方法,项目结构如下。(主要是下面红圈的四个类文件)

1.HomePage中增加点击登录事件

package pageObject;import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import framework.BasePage;public class HomePage extends BasePage{/** 京东商城的首页,主要提供一些其他子模块或者页面的入口,一般点击一个元素,进入下一页面*/// 元素定位//搜索输入框@FindBy (id="key")WebElement search_inputBox;//搜索提交按钮@FindBy (xpath="//*[@id='search']/div/div[2]/button")WebElement search_submitBtn;// 登录链接@FindBy (xpath="//*[@id='ttbar-login']/a[1]")WebElement login_lnk;public HomePage(WebDriver driver) {super(driver);}/** 搜索框输入关键字,点击搜索*/public SearchResultListPage searchWithKeyword(String keyword){type(search_inputBox, keyword);click(search_submitBtn);return new SearchResultListPage(driver); }/** 点击登录链接*/public LoginPage clickLoginLnk(){click(login_lnk);return new LoginPage(driver);}
}
2.LoginPage主要是定义登录页面的元素和方法

package pageObject;import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;import framework.BasePage;public class LoginPage extends BasePage {/** 登录页面,这里主要测试账号和密码的登录方式,第三方登录暂时不考虑*///元素定位//点击 账户登录 菜单@FindBy (xpath="//*[@id='content']/div/div[1]/div/div[2]/a")WebElement loginType_byAccount;// 用户名@FindBy (id="loginname")WebElement login_userName;// 密码@FindBy (id="nloginpwd")WebElement login_password;// 密码@FindBy (id="loginsubmit")WebElement login_submitBtn;// 构造函数public LoginPage(WebDriver driver) {super(driver);}/** 用户名和密码登录*/public HomePage login(String username, String password){click(loginType_byAccount);type(login_userName, username);type(login_password, password);click(login_submitBtn);return new HomePage(driver);}}
3 Login类,完全就是单独拿出来表示一个模块或者功能来使用。

package pageObject.functions;import java.io.IOException;import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.PageFactory;import framework.BrowserEngine;
import pageObject.HomePage;
import pageObject.LoginPage;public class Login {public WebDriver driver;//第一步,获取浏览器类型,打开浏览器。打开测试网站public void initSetup() throws IOException{BrowserEngine browser = new BrowserEngine();browser.initConfigData();driver = browser.getBrowser();}// 用page factory类来加载初始化主页元素,点击登录这个链接public void loginValid(){HomePage homepage = PageFactory.initElements(driver, HomePage.class);//点击主页上的登录链接homepage.clickLoginLnk();//跳转到登录页面,初始化登录界面的元素LoginPage loginpage = PageFactory.initElements(driver, LoginPage.class);//测试一个有效的用户名登录loginpage.login("你自己的用户名", "你自己密码");}}
4. 测试类的写法

package testSuite;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 pageObject.HomePage;
import pageObject.functions.Login;public class Test_HomePage_Search {public WebDriver driver;@BeforeClasspublic void setUp() throws IOException{Login login = new Login();login.initSetup();login.loginValid();driver = login.driver;}@Testpublic void test_searchGoods(){HomePage hp = PageFactory.initElements(driver, HomePage.class);hp.searchWithKeyword("Java");}}
       注意上面setUp内的写法,先初始化一个Login类的实例,然后调用相关方法,最后得到driver传递给当前测试类定义的driver,这样接下来@Test的方法才能顺利执行,不会报空指针的问题。

       这个问题暂时得到了解决,但是还是有缺陷,如果有几十个测试类文件,如何保证,只开一次浏览器,只登陆一次,测试完几十个测试用例之后,才关闭浏览器。这个问题值得思考,在当前测试脚本类中写多个@Test方法,这个笨方法就不考虑。好像利用TestNG中的group,然后配置testng.xml也达不到,启动一次浏览器,执行几百个脚本用例,然后关闭浏览器的效果,这个有待研究。我项目中,还是分模块来执行,一个模块,启动一次浏览器,执行十几个用例,然后关闭,执行下一个模块, 依然还需要启动浏览器。这个有待优化,有没有人有更好的方法,谢谢分享出来,大家一起学习。


这篇关于Java+Selenium3框架设计篇4-如何实现登录功能放在setUp()方法中的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1051146

相关文章

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

Java中如何正确的停掉线程

《Java中如何正确的停掉线程》Java通过interrupt()通知线程停止而非强制,确保线程自主处理中断,避免数据损坏,线程池的shutdown()等待任务完成,shutdownNow()强制中断... 目录为什么不强制停止为什么 Java 不提供强制停止线程的能力呢?如何用interrupt停止线程s

MySQL中On duplicate key update的实现示例

《MySQL中Onduplicatekeyupdate的实现示例》ONDUPLICATEKEYUPDATE是一种MySQL的语法,它在插入新数据时,如果遇到唯一键冲突,则会执行更新操作,而不是抛... 目录1/ ON DUPLICATE KEY UPDATE的简介2/ ON DUPLICATE KEY UP

Python中Json和其他类型相互转换的实现示例

《Python中Json和其他类型相互转换的实现示例》本文介绍了在Python中使用json模块实现json数据与dict、object之间的高效转换,包括loads(),load(),dumps()... 项目中经常会用到json格式转为object对象、dict字典格式等。在此做个记录,方便后续用到该方

SpringBoot请求参数传递与接收示例详解

《SpringBoot请求参数传递与接收示例详解》本文给大家介绍SpringBoot请求参数传递与接收示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录I. 基础参数传递i.查询参数(Query Parameters)ii.路径参数(Path Va

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

SpringBoot路径映射配置的实现步骤

《SpringBoot路径映射配置的实现步骤》本文介绍了如何在SpringBoot项目中配置路径映射,使得除static目录外的资源可被访问,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一... 目录SpringBoot路径映射补:springboot 配置虚拟路径映射 @RequestMapp

Java MCP 的鉴权深度解析

《JavaMCP的鉴权深度解析》文章介绍JavaMCP鉴权的实现方式,指出客户端可通过queryString、header或env传递鉴权信息,服务器端支持工具单独鉴权、过滤器集中鉴权及启动时鉴权... 目录一、MCP Client 侧(负责传递,比较简单)(1)常见的 mcpServers json 配置