0


SpringBoot+selenium模拟用户操作浏览器

Selenium

Selenium是一个用于Web应用程序自动化测试的开源工具套件。它主要用于以下目的:

  1. 浏览器自动化:Selenium能够模拟真实用户在不同浏览器(如Chrome、Firefox、IE/Edge等)中的交互行为,通过编程方式控制浏览器执行一系列操作,例如点击按钮、填写表单、导航页面等。
  2. 兼容性测试:通过编写脚本在多种浏览器和操作系统环境下运行测试,确保Web应用在不同组合下都能正确工作。
  3. 功能测试:创建回归测试用例来验证软件功能是否按预期工作,以及用户需求是否得到满足。
  4. 端到端测试:进行从用户界面到后端服务的整体流程测试,检查系统组件间的集成效果。
  5. 支持多种语言:Selenium WebDriver API 可以使用Java、Python、C#、Ruby等多种编程语言实现测试脚本。
  6. 与DevTools集成:在较新的Selenium版本中,提供了对Chromium内嵌的Chrome DevTools的支持,允许开发者执行更深层次的浏览器操作和调试任务。

总的来说,Selenium帮助开发团队提高Web应用的质量保障效率,通过自动化测试减少手动测试的重复性和复杂性,并有助于持续集成和持续部署(CI/CD)流程的实施。

下载Selenium

Selenium的下载通常分为两个步骤:首先,你需要下载并安装适用于你开发环境的Selenium WebDriver库(针对不同编程语言有不同的库);其次,根据你的测试需求下载对应浏览器的驱动程序。

以下是一些常见编程语言中Selenium WebDriver库的下载和安装方式:

Python
使用pip工具进行安装:

  1. pip install selenium

Java
在Maven项目中添加如下依赖到pom.xml文件:

  1. <dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>最新版本号</version></dependency>

或在Gradle项目中添加:

  1. implementation 'org.seleniumhq.selenium:selenium-java:最新版本号'

如果不使用构建工具,可以直接从Maven仓库下载selenium-java.jar包。

C#
对于.NET环境,可以通过NuGet包管理器在Visual Studio中安装Selenium.WebDriver NuGet包。

下载浏览器驱动

安装完WebDriver库后,接下来需要下载浏览器驱动,例如:

将下载的浏览器驱动放在系统的PATH路径下,或者在代码中明确指定驱动路径,即可配合WebDriver开始编写自动化测试脚本了。

获取最新版本的chrome和chromeDriver https://sites.google.com/a/chromium.org/chromedriver/downloads

Java代码

yml配置文件

  1. system:#驱动信息driver:mode:1# 驱动模式(0:本地 1:远程)headless:0#是否显示浏览器(0:显示 1:不显示)name: webdriver.chrome.driver
  2. path: D:\drivers\chromedriver-win64\chromedriver.exe
  3. # 远程driver驱动地址remoteUrl: http://127.0.0.1:9515systemUrl: http://目标服务器地址

工具类:包含打开、关闭、刷新浏览器功能

  1. importlombok.extern.slf4j.Slf4j;importorg.apache.commons.lang3.StringUtils;importorg.openqa.selenium.Alert;importorg.openqa.selenium.By;importorg.openqa.selenium.WebDriver;importorg.openqa.selenium.WebElement;importorg.openqa.selenium.chrome.ChromeOptions;importorg.openqa.selenium.remote.DesiredCapabilities;importorg.openqa.selenium.remote.RemoteWebDriver;importorg.openqa.selenium.support.ui.ExpectedConditions;importorg.openqa.selenium.support.ui.WebDriverWait;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.core.env.Environment;importorg.springframework.stereotype.Component;importjavax.annotation.PostConstruct;importjava.net.ConnectException;importjava.net.URL;importjava.util.ArrayList;importjava.util.List;importjava.util.Random;importjava.util.Set;importjava.util.concurrent.TimeUnit;@Slf4j@ComponentpublicclassWebDriverUtils{@AutowiredprivateEnvironment env;/**
  2. * 是否显示浏览器(0:否 1:是)
  3. */privatestaticString headless;/**
  4. * 驱动远程地址
  5. */privatestaticString driverRemoteUrl;privatestaticString systemUrl;@PostConstructpublicvoidinit(){
  6. headless = env.getProperty("system.driver.headless");
  7. driverRemoteUrl = env.getProperty("system.driver.remoteUrl");
  8. systemUrl = env.getProperty("system.driver.systemUrl");}/**
  9. * 等待时间
  10. */publicfinalstaticint timeSeconds =10;privatestaticStringgetRemoteUrl(String driverRemoteUrl){String remoteUrl =null;if(StringUtils.isNotBlank(driverRemoteUrl)){if(driverRemoteUrl.contains(",")){String[] split = driverRemoteUrl.split(",");
  11. remoteUrl = split[(newRandom()).nextInt(split.length)];}else{
  12. remoteUrl = driverRemoteUrl;}}return remoteUrl;}/**
  13. * 获取驱动
  14. *
  15. * @return
  16. * @throws ConnectException
  17. */publicstaticWebDrivergetDriver(){
  18. log.info("进入启动浏览器");ChromeOptions chromeOptions =newChromeOptions();// 设置浏览器是否可见if("1".equals(headless)){
  19. chromeOptions.addArguments("--headless");
  20. chromeOptions.addArguments("--disable-gpu");// headless模式下必须设置这两个参数,否则会报连接超时
  21. chromeOptions.addArguments("--proxy-server='direct://'");
  22. chromeOptions.addArguments("--proxy-bypass-list=*");}else{
  23. chromeOptions.addArguments("--no-sandbox");}WebDriver driver =null;
  24. log.info(String.format("driverRemoteUrl:%s", driverRemoteUrl));DesiredCapabilities dc =DesiredCapabilities.chrome();
  25. dc.setCapability(ChromeOptions.CAPABILITY, chromeOptions);try{
  26. driver =newRemoteWebDriver(newURL(getRemoteUrl(driverRemoteUrl)), dc);}catch(Exception e){
  27. e.printStackTrace();thrownewApplicationException(-1,"RemoteWebDriver连接远程驱动失败");}
  28. driver.manage().window().maximize();
  29. driver.manage().timeouts().implicitlyWait(timeSeconds,TimeUnit.SECONDS);
  30. driver.manage().timeouts().pageLoadTimeout(timeSeconds,TimeUnit.SECONDS);
  31. driver.manage().timeouts().setScriptTimeout(timeSeconds,TimeUnit.SECONDS);return driver;}/**
  32. * 关闭浏览器驱动
  33. *
  34. * @param driver
  35. */publicstaticvoidquitBrowser(WebDriver driver){try{if(driver !=null){
  36. driver.close();
  37. driver.quit();
  38. log.info("浏览器关闭成功");}}catch(Exception e){
  39. log.error("浏览器关闭异常 - {}", e.getMessage());thrownewApplicationException(-1, e.toString());}}publicstaticsynchronizedbooleanopenBrowser(WebDriver driver){
  40. log.info("即将打开浏览器");try{
  41. driver.get(systemUrl);returntrue;}catch(Exception e){
  42. log.error("打开浏览器异常,{}",e);returnfalse;}}/**
  43. * 刷新浏览器
  44. * @param driver
  45. * @return
  46. */publicstaticsynchronizedvoidrefreshBrowser(WebDriver driver){
  47. driver.navigate().refresh();}privatestaticbooleanalertExists(float timeout,WebDriver driver){long start =System.currentTimeMillis();while((System.currentTimeMillis()- start)< timeout *1000){try{
  48. driver.switchTo().alert();returntrue;}catch(Exception e){}}returnfalse;}/**
  49. * 关闭登录消息提醒弹窗
  50. *
  51. * @param timeout
  52. * @param driver
  53. */privatestaticvoidclosePrompt(float timeout,WebDriver driver){long start =System.currentTimeMillis();while((System.currentTimeMillis()- start)< timeout *1000){try{close_ymPrompt(driver);}catch(Exception e){
  54. log.error("无法找到登陆消息提醒弹窗");}finally{sleep("500");}}}publicstaticvoidclose_ymPrompt(WebDriver driver){WebElement closePromptEle = driver.findElement(By.className("ymPrompt_close"));
  55. closePromptEle.click();}/**
  56. * 点击弹窗
  57. *
  58. * @param driver
  59. */privatestaticvoidclickConfirmEle(WebDriver driver){try{long start =System.currentTimeMillis();// 点击确定while(System.currentTimeMillis()- start <2*1000){WebElement saveconfirm = driver.findElement(By.id("ymPrompt_btn_0"));
  60. saveconfirm.click();sleep("500");}}catch(Exception e){
  61. log.debug("没有确定弹窗");}}/**
  62. * 获取属性值
  63. *
  64. * @param eleName
  65. * @param attributeName
  66. * @return
  67. */publicstaticStringgetAttributeByEle(WebElement webElement,String eleName,String attributeName){WebElement webEle = webElement.findElement(By.name(eleName));return webEle.getAttribute(attributeName);}/**
  68. * 休眠
  69. *
  70. * @param millis
  71. */publicstaticvoidsleep(String millis){try{long waittingTime1 =Long.parseLong(millis);Thread.sleep(waittingTime1);}catch(Exception e){
  72. e.printStackTrace();}}publicstaticStringfindWindow(WebDriver driver,String title){// 找到属于该标题的窗口句柄Boolean find =false;String findhandle =null;long start =System.currentTimeMillis();while(!find &&(System.currentTimeMillis()- start)<10*1000){Set<String> handles = driver.getWindowHandles();for(String handle : handles){if(driver.switchTo().window(handle).getTitle().equals(title)){
  73. findhandle = handle;
  74. find =true;break;}}}return findhandle;}privatestaticList<WebElement>findWebElements(WebDriverWait wait,String ele){try{return wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.name(ele)));}catch(Exception e){
  75. log.error("未查询到元素");}returnnull;}/**
  76. *
  77. * @return 当前打开窗口的最后一个句柄
  78. */publicstaticStringgetLastHandle(WebDriver driver){Set<String>Allhandles= driver.getWindowHandles();//获取当前打开窗口的所有句柄List<String> lst =newArrayList<String>(Allhandles);return lst.get(lst.size()-1);}}

模拟用户浏览器操作

我把这段代码也放到工具类里了

  1. /**
  2. * 模拟登录某个系统
  3. * @param driver
  4. * @param wait
  5. * @param username
  6. * @param password
  7. * @return
  8. */publicstaticsynchronizedbooleanloginSystem(WebDriver driver,WebDriverWait wait,String username,String password){
  9. log.info("即将登录,页面地址 - [{}]", systemUrl);try{
  10. log.info("即将登录,登录信息 - [账号: {}]", username);sleep("1000");WebElement usernameElement = driver.findElement(By.id("name"));// 输入用户名
  11. usernameElement.sendKeys(username);WebElement passwordElement = driver.findElement(By.id("pwd"));// 输入密码
  12. passwordElement.sendKeys(password);// 点击登录
  13. log.info("点击登录");WebElement loginElement = driver.findElement(By.id("login"));
  14. loginElement.click();// 等待2秒,防止目标系统反应过慢sleep("2000");//获取弹框值判断是否登录成功Alert alert = driver.switchTo().alert();String text = alert.getText();
  15. alert.accept();
  16. log.info("登录成功");returntrue;}catch(Exception e){
  17. log.error("登录异常,{}",e);returnfalse;}}/**
  18. * 模拟填充表单内容并保存
  19. * @param driver
  20. * @param param
  21. * @return
  22. */publicstaticsynchronizedbooleansendGzjs(WebDriver driver,MyParam param){try{
  23. log.info("开始填充表单:{}", param.toString());WebElement ndElement = driver.findElement(By.id("nd"));// 输入年度
  24. ndElement.sendKeys(param.getNd());WebElement yfElement = driver.findElement(By.id("yf"));// 输入月份
  25. yfElement.sendKeys(param.getYf());WebElement contentElement = driver.findElement(By.id("content"));// 输入内容
  26. contentElement.sendKeys(param.getContent());
  27. log.info("点击保存");WebElement loginElement = driver.findElement(By.id("save"));
  28. loginElement.click();// 等待2秒,防止目标系统反应过慢sleep("2000");//获取弹框值判断是否保存成功Alert alert = driver.switchTo().alert();String text = alert.getText();
  29. alert.accept();if("目标系统返回的错误信息!".equals(text)){
  30. log.info("发送失败");returnfalse;}
  31. log.info("发送成功");returntrue;}catch(Exception e){
  32. log.error("发送异常,{}",e);returnfalse;}}

本文转载自: https://blog.csdn.net/weixin_42892177/article/details/139326195
版权归原作者 槐序0422 所有, 如有侵权,请联系我们删除。

“SpringBoot+selenium模拟用户操作浏览器”的评论:

还没有评论