基于Maven与Selenium在@BeforeMethod中实现多用户登录的方法咨询
关于Selenium setUp方法实现多用户/员工账号登录的解决方案
当然可以在setUp方法里实现多类型用户登录,员工账号登录也完全没问题!我结合你提供的现有代码,给你梳理下具体的实现思路和修改方案:
一、实现多类型用户登录的两种常用方式
你现在的代码里固定调用了login("manageuser"),要实现灵活切换用户,我们可以从参数化控制和批量多实例登录两个方向入手:
1. 用Maven参数灵活指定单用户登录(适合单次运行指定用户)
这种方式可以让你通过Maven命令或者pom.xml配置,灵活切换每次测试的登录用户,不用修改代码:
- 第一步,在你的
pom.xml里配置Maven Surefire插件,添加系统属性传递:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.0.0-M7</version> <configuration> <systemPropertyVariables> <login.user.type>${login.user.type}</login.user.type> </systemPropertyVariables> </configuration> </plugin> </plugins> </build>
- 第二步,在pom.xml里可以设置默认的登录用户(可选):
<properties> <!-- 默认用manageuser登录 --> <login.user.type>manageuser</login.user.type> </properties>
- 第三步,修改你的
setUp方法,读取这个系统属性并动态调用登录:
@BeforeMethod public void setUp(){ log.info("Setting up test"); prop = new Properties(); prop.load(new FileInputStream(new File(loginFile))); verificationErrors = new StringBuffer(); log.info("Running Firefox Driver"); System.setProperty("webdriver.gecko.driver", GECKO_DRIVER_PATH); // 注意:原代码缺少driver初始化,这里补上,否则会空指针! driver = new FirefoxDriver(); driver.manage().deleteAllCookies(); baseUrl = getSeleniumTarget(); driver.manage().timeouts().implicitlyWait(45, TimeUnit.SECONDS); driver.manage().timeouts().pageLoadTimeout(80, TimeUnit.SECONDS); driver.manage().window().setPosition(new Point(0, 0)); driver.manage().window().maximize(); WebDriverThreadLocal.setWebDriver(driver); // 读取Maven传递的用户类型,没有则用默认值 String userType = System.getProperty("login.user.type", "manageuser"); login(userType); }
- 运行时指定用户的命令:
# 比如要登录员工账号,直接运行 mvn test -Dlogin.user.type=employeeuser
2. 批量登录多用户(适合一次测试需要多个用户在线的场景)
如果你的测试需要同时登录多个不同类型的用户(比如打开多个浏览器实例),可以在setUp里创建多个WebDriver实例,分别登录不同用户:
// 先定义一个Map来存储用户类型和对应的driver private Map<String, WebDriver> driverMap = new HashMap<>(); @BeforeMethod public void setUp(){ log.info("Setting up test"); prop = new Properties(); prop.load(new FileInputStream(new File(loginFile))); verificationErrors = new StringBuffer(); log.info("Running multiple Firefox Drivers"); System.setProperty("webdriver.gecko.driver", GECKO_DRIVER_PATH); // 定义需要登录的所有用户类型 List<String> userTypes = Arrays.asList("manageuser", "employeeuser", "customeruser"); for(String userType : userTypes){ WebDriver driver = new FirefoxDriver(); driver.manage().deleteAllCookies(); driver.manage().timeouts().implicitlyWait(45, TimeUnit.SECONDS); driver.manage().timeouts().pageLoadTimeout(80, TimeUnit.SECONDS); driver.manage().window().maximize(); // 把driver和用户类型关联存储,方便后续测试使用 driverMap.put(userType, driver); // 修改login方法,支持传入指定的driver login(driver, userType); } } // 修改原login方法,接收WebDriver参数,适配多实例场景 protected void login(WebDriver driver, String username) { LoginPage page = PageFactory.initElements(driver, LoginPage.class); log.info("Logging in as " + username); driver.get(baseUrl + prop.getProperty("login.customerportal")); page.setUsername(prop.getProperty(username + ".username")); page.setPassword(prop.getProperty(username + ".password")); page.clickLoginButton(); }
二、员工账号登录的具体配置
员工账号登录的逻辑和你现有的用户登录完全一致,只需要两步:
- 在你的配置文件(比如
.properties文件)里添加员工账号的配置项:
# 原有管理用户配置 manageuser.username=your_manage_user manageuser.password=your_manage_pwd # 新增员工账号配置 employeeuser.username=your_employee_user employeeuser.password=your_employee_pwd
- 然后通过上面的Maven参数方式传入
employeeuser,或者在批量登录的列表里加入employeeuser,就能自动完成员工账号的登录了。
另外提醒下:原代码里的driver变量没有初始化(比如driver = new FirefoxDriver()),这个一定要补上,否则会出现空指针异常哦!
内容的提问来源于stack exchange,提问作者sapana
相关产品推荐
相关产品推荐

