- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
Selenium是一个用于Web应用程序自动化测试的开源工具套件。它主要用于以下目的:
总的来说,Selenium帮助开发团队提高Web应用的质量保障效率,通过自动化测试减少手动测试的重复性和复杂性,并有助于持续集成和持续部署(CI/CD)流程的实施.
Selenium的下载通常分为两个步骤:首先,你需要下载并安装适用于你开发环境的Selenium WebDriver库(针对不同编程语言有不同的库);其次,根据你的测试需求下载对应浏览器的驱动程序.
以下是一些常见编程语言中Selenium WebDriver库的下载和安装方式:
Python: 使用pip工具进行安装:
pip install selenium
Java: 在Maven项目中添加如下依赖到pom.xml文件:
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>最新版本号</version>
</dependency>
或在Gradle项目中添加:
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 。
system:
#驱动信息
driver:
mode: 1 # 驱动模式(0:本地 1:远程)
headless: 0 #是否显示浏览器(0:显示 1:不显示)
name: webdriver.chrome.driver
path: D:\drivers\chromedriver-win64\chromedriver.exe
# 远程driver驱动地址
remoteUrl: http://127.0.0.1:9515
systemUrl: http://目标服务器地址
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.net.ConnectException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.TimeUnit;
@Slf4j
@Component
public class WebDriverUtils {
@Autowired
private Environment env;
/**
* 是否显示浏览器(0:否 1:是)
*/
private static String headless;
/**
* 驱动远程地址
*/
private static String driverRemoteUrl;
private static String systemUrl;
@PostConstruct
public void init() {
headless = env.getProperty("system.driver.headless");
driverRemoteUrl = env.getProperty("system.driver.remoteUrl");
systemUrl = env.getProperty("system.driver.systemUrl");
}
/**
* 等待时间
*/
public final static int timeSeconds = 10;
private static String getRemoteUrl(String driverRemoteUrl) {
String remoteUrl = null;
if (StringUtils.isNotBlank(driverRemoteUrl)) {
if (driverRemoteUrl.contains(",")) {
String[] split = driverRemoteUrl.split(",");
remoteUrl = split[(new Random()).nextInt(split.length)];
} else {
remoteUrl = driverRemoteUrl;
}
}
return remoteUrl;
}
/**
* 获取驱动
*
* @return
* @throws ConnectException
*/
public static WebDriver getDriver() {
log.info("进入启动浏览器");
ChromeOptions chromeOptions = new ChromeOptions();
// 设置浏览器是否可见
if ("1".equals(headless)) {
chromeOptions.addArguments("--headless");
chromeOptions.addArguments("--disable-gpu");
// headless模式下必须设置这两个参数,否则会报连接超时
chromeOptions.addArguments("--proxy-server='direct://'");
chromeOptions.addArguments("--proxy-bypass-list=*");
} else {
chromeOptions.addArguments("--no-sandbox");
}
WebDriver driver = null;
log.info(String.format("driverRemoteUrl:%s", driverRemoteUrl));
DesiredCapabilities dc = DesiredCapabilities.chrome();
dc.setCapability(ChromeOptions.CAPABILITY, chromeOptions);
try {
driver = new RemoteWebDriver(new URL(getRemoteUrl(driverRemoteUrl)), dc);
} catch (Exception e) {
e.printStackTrace();
throw new ApplicationException(-1, "RemoteWebDriver连接远程驱动失败");
}
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(timeSeconds, TimeUnit.SECONDS);
driver.manage().timeouts().pageLoadTimeout(timeSeconds, TimeUnit.SECONDS);
driver.manage().timeouts().setScriptTimeout(timeSeconds, TimeUnit.SECONDS);
return driver;
}
/**
* 关闭浏览器驱动
*
* @param driver
*/
public static void quitBrowser(WebDriver driver) {
try {
if (driver != null) {
driver.close();
driver.quit();
log.info("浏览器关闭成功");
}
} catch (Exception e) {
log.error("浏览器关闭异常 - {}", e.getMessage());
throw new ApplicationException(-1, e.toString());
}
}
public static synchronized boolean openBrowser(WebDriver driver) {
log.info("即将打开浏览器");
try {
driver.get(systemUrl);
return true;
} catch (Exception e) {
log.error("打开浏览器异常,{}",e);
return false;
}
}
/**
* 刷新浏览器
* @param driver
* @return
*/
public static synchronized void refreshBrowser(WebDriver driver) {
driver.navigate().refresh();
}
private static boolean alertExists(float timeout, WebDriver driver) {
long start = System.currentTimeMillis();
while ((System.currentTimeMillis() - start) < timeout * 1000) {
try {
driver.switchTo().alert();
return true;
} catch (Exception e) {
}
}
return false;
}
/**
* 关闭登录消息提醒弹窗
*
* @param timeout
* @param driver
*/
private static void closePrompt(float timeout, WebDriver driver) {
long start = System.currentTimeMillis();
while ((System.currentTimeMillis() - start) < timeout * 1000) {
try {
close_ymPrompt(driver);
} catch (Exception e) {
log.error("无法找到登陆消息提醒弹窗");
} finally {
sleep("500");
}
}
}
public static void close_ymPrompt(WebDriver driver) {
WebElement closePromptEle = driver.findElement(By.className("ymPrompt_close"));
closePromptEle.click();
}
/**
* 点击弹窗
*
* @param driver
*/
private static void clickConfirmEle(WebDriver driver) {
try {
long start = System.currentTimeMillis();
// 点击确定
while (System.currentTimeMillis() - start < 2 * 1000) {
WebElement saveconfirm = driver.findElement(By.id("ymPrompt_btn_0"));
saveconfirm.click();
sleep("500");
}
} catch (Exception e) {
log.debug("没有确定弹窗");
}
}
/**
* 获取属性值
*
* @param eleName
* @param attributeName
* @return
*/
public static String getAttributeByEle(WebElement webElement, String eleName, String attributeName) {
WebElement webEle = webElement.findElement(By.name(eleName));
return webEle.getAttribute(attributeName);
}
/**
* 休眠
*
* @param millis
*/
public static void sleep(String millis) {
try {
long waittingTime1 = Long.parseLong(millis);
Thread.sleep(waittingTime1);
} catch (Exception e) {
e.printStackTrace();
}
}
public static String findWindow(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)) {
findhandle = handle;
find = true;
break;
}
}
}
return findhandle;
}
private static List<WebElement> findWebElements(WebDriverWait wait, String ele) {
try{
return wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.name(ele)));
}catch (Exception e){
log.error("未查询到元素");
}
return null;
}
/**
*
* @return 当前打开窗口的最后一个句柄
*/
public static String getLastHandle(WebDriver driver) {
Set<String> Allhandles = driver.getWindowHandles();//获取当前打开窗口的所有句柄
List<String> lst = new ArrayList<String>(Allhandles);
return lst.get(lst.size()-1);
}
}
我把这段代码也放到工具类里了 。
/**
* 模拟登录某个系统
* @param driver
* @param wait
* @param username
* @param password
* @return
*/
public static synchronized boolean loginSystem(WebDriver driver, WebDriverWait wait, String username,
String password) {
log.info("即将登录,页面地址 - [{}]", systemUrl);
try {
log.info("即将登录,登录信息 - [账号: {}]", username);
sleep("1000");
WebElement usernameElement = driver.findElement(By.id("name"));
// 输入用户名
usernameElement.sendKeys(username);
WebElement passwordElement = driver.findElement(By.id("pwd"));
// 输入密码
passwordElement.sendKeys(password);
// 点击登录
log.info("点击登录");
WebElement loginElement = driver.findElement(By.id("login"));
loginElement.click();
// 等待2秒,防止目标系统反应过慢
sleep("2000");
//获取弹框值判断是否登录成功
Alert alert = driver.switchTo().alert();
String text = alert.getText();
alert.accept();
log.info("登录成功");
return true;
} catch (Exception e) {
log.error("登录异常,{}",e);
return false;
}
}
/**
* 模拟填充表单内容并保存
* @param driver
* @param param
* @return
*/
public static synchronized boolean sendGzjs(WebDriver driver, MyParam param) {
try {
log.info("开始填充表单:{}", param.toString());
WebElement ndElement = driver.findElement(By.id("nd"));
// 输入年度
ndElement.sendKeys(param.getNd());
WebElement yfElement = driver.findElement(By.id("yf"));
// 输入月份
yfElement.sendKeys(param.getYf());
WebElement contentElement = driver.findElement(By.id("content"));
// 输入内容
contentElement.sendKeys(param.getContent());
log.info("点击保存");
WebElement loginElement = driver.findElement(By.id("save"));
loginElement.click();
// 等待2秒,防止目标系统反应过慢
sleep("2000");
//获取弹框值判断是否保存成功
Alert alert = driver.switchTo().alert();
String text = alert.getText();
alert.accept();
if ("目标系统返回的错误信息!".equals(text)) {
log.info("发送失败");
return false;
}
log.info("发送成功");
return true;
} catch (Exception e) {
log.error("发送异常,{}",e);
return false;
}
}
最后此篇关于SpringBoot+Selenium模拟用户操作浏览器的文章就讲到这里了,如果你想了解更多关于SpringBoot+Selenium模拟用户操作浏览器的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我的“登录”是在 IE 浏览器中进行的,登录后,如果我单击链接,它们就会在 Chrome 浏览器中打开。如何在同一个测试用例中将我当前的浏览器从 IE 切换到 Chrome。如果我创建一个 chrom
您好,我不明白在 Firefox 的内容属性中使用的特殊字符的不同显示行为。我已经剥离了一切并创造了一支笔: http://codepen.io/rpkoller/pen/Fbgav 在其“基本形式”
我正在研究 Spring Data REST,特别是 HAL 浏览器。我一直在关注 http://docs.spring.io/spring-data/rest/docs/current/refere
我正在使用工具提示,在 ie 上出现定位错误。我放了jquery浏览器代码 我的工具提示 $('.tooltip').tooltip({ position: "bottom center"
我应该如何处理蓝鸟协程中的错误? 我使用co in节点已有一段时间,它具有出色的捕获功能。 co(function*() { return new Promise(function(resol
package webviewbrowser; import java.util.List; import javafx.application.Application; import javafx.
我有一些 JavaScript 在同一域上的两个独立服务器之间共享请求。 .com 是 JavaScript 中域的要求吗? 在这种情况下,两台服务器都位于 .abc.tyy 域上,tyy 通常是 .
package webviewbrowser; import java.util.List; import javafx.application.Application; import javafx.
我正在尝试构建仍支持 NPAPI 的先前版本的 Chromium 浏览器。我已经获得了代码,并且可以使用 stand build 命令在我的 mac 上构建最新版本的 Chromium gclient
我环顾四周,找不到 browscap 的 Python 等效项(我在 PHP 中使用它来检测给定的用户代理字符串是什么浏览器。 我希望我不必自己写......:P 最佳答案 看看这个,它应该做你想要的
是否有任何 chrome 或 firefox 扩展允许 javascript 在客户端 PC 中创建写入文件? 最佳答案 你想做什么? HTML5 有一个 File API .这是最好的解决方案,因为
当我点击链接或刷新或关闭标签页时,我有这段代码会发出警报。 但我需要在关闭 窗口(选项卡)上仅 发出警报。怎么做? 我的网站上有很多外部和内部链接。
我目前正在尝试使用 Browserify + Angular,但我遇到了一个奇怪的问题。我在我的 Controller 的子目录中创建了一个名为 controllers/start-controlle
我正在为客户(项目已被接受,但现在是解释不同功能的问题)写一份详细的估算,以开发一个响应式布局的网站。 这不是我第一次进行此类开发,但这是一个关键客户,必须铺平道路。 布局将从 300px 宽度调整到
我在时事通讯上设计了一些黑底白字。由于时事通讯在打印时看起来不错且可读。我需要使布局和文本与浏览器中的内容相似。 通常情况下,黑色文本和无背景颜色是浏览器/网络邮件客户端的默认打印样式吗? 最佳答案
我有一个使用 GWT/mGWT 构建的移动友好网络应用程序。该应用程序有白色输入文本框和深灰色输入文本。但是,在 Android 浏览器上,文本显示为白色,因此是不可见的。我尝试的所有 CSS 都无法
我创建了一个带有选择输入的页面来更改正在使用的 jQuery UI 主题。当主题更改时,它会存储在 cookie 中。页面加载时,如果 cookie 存在,则恢复主题,否则加载默认主题。 当我使用 F
在我的 CSS 中,我使用了以下代码片段: word-break: break-word; -webkit-hyphens: auto; hyphens: auto; 渲染引擎如何知道在所有不同语言中
我的网络浏览器 Safari 有问题,我在 Chrome、FireFox 中测试了我的网站。 Safari 版本也是正确的,但是,当需要在 1920x1080 或更高分辨率下对其进行测试时,它无法正常
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我是一名优秀的程序员,十分优秀!