文章目录
前言
1、该文是为了做个笔记,在需要的时候可以方便查找,侵权可删
2、文中的代码均为java
一、selenium的简介
java使用selenium
-
需要 (1)java环境 和 idea;
(2)引入依赖;
(3)下载对应的浏览器的webdriver
-
常用依赖
xml<!-- 添加 Selenium WebDriver 依赖 --> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>4.10.0</version> </dependency> <!-- 如果需要使用特定的浏览器引擎,还需添加对应的驱动依赖 --> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-chrome-driver</artifactId> <version>4.9.0</version> </dependency> <!-- TestNG测试依赖 --> <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>7.4.0</version> <scope>test</scope> </dependency>
Python使用selenium
- 需要: (1)安装python;(2)安装selenium库;(3)下载对应的浏览器的webdriver
- 安装方法 pip install selenium
常用的浏览器
- Chrome:ChromeDriver下载地址
- Firefox:GeckoDriver下载地址
- Edge:Microsoft WebDriver下载地址
- Internet Explorer:IEDriverServer ie浏览器设置方法
selenium的功能
- (1)主要被用于自动化测试
- (2)爬虫和数据抓取
- (3)网站监控 定期检查网站是否在线,以及页面元素是否按预期显示,可以用来监控网站的健康状态
- (4)视觉测试:结合图像识别技术,检查网页的视觉元素是否符合设计
- (5)浏览器兼容性测试
- (6)性能测试:模拟用户行为来评估网站的性能
- (7)api测试
- (8)用户旅程映射
- (9)自动化报告生成
二、chromeDriver的安装
查看本机的chrome版本?
打开chrome浏览器,地址栏输入"chrome://version/",可以看到版本为:126.0.6478.57
匹配对应的chromedriver并下载
Selenium 3.0及以上版本中,Firefox浏览器驱动独立了,需要下载和设置浏览器驱动。
对于Chrome,也需要下载对应的ChromeDriver
-
方法一:访问 谷歌的chromedriver官方下载站 如果没有,可以选择离当前版本最近的次版本
-
方法二:访问地址 https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json 选择离自己最近的版本号
记住放置的路径,我这里是:D:\Drivers\chromedriver-win64
在服务器上例如Centos如何安装Chrome
安装chrome:
curl https://intoli.com/install-google-chrome.sh | bash
查看chrome版本:google-chrome --version
下载chromedriver同上
三、selenium内容详解
chrome启动
java
public static void main(String[] args) {
// 设置系统属性,指定chromeDriver的路径
System.setProperty("webdriver.chrome.driver","D:\\Drivers\\chromedriver-win64");
// 创建webdriver对象
WebDriver driver = new ChromeDriver();
// 创建chromeOptions对象,可以设置Chrome的启动参数
ChromeOptions options = new ChromeOptions();
// 打开百度首页
driver.get("https://www.baidu.com");
}
注:后续不再重复webdriver的设置和创建了,均会以 driver 直接替代
chrome启动参数
前提:ChromeOptions options = new ChromeOptions();
java
// 禁用浏览器扩展。
options.addArguments("--disable-extensions");
// 启用无头模式(不显示浏览器界面)
options.addArguments("--headless");
// 指定浏览器分辨率
options.addArguments("window-size=1920x3000");
// 启动时最大化浏览器窗口
options.addArguments("start-maximized");
// 禁用GPU硬件加速
options.addArguments("--disable-gpu");
// 指定用户数据目录,用于自定义Chrome的用户配置文件
options.addArguments("--user-data-dir");
// 禁用弹出窗口拦截器
options.addArguments("--disable-popup-blocking");
// 彻底停用沙箱,这在非桌面环境中运行Chrome时非常有用
options.addArguments("--no-sandbox");
// 禁用网页安全性功能,用于解决跨域问题
options.addArguments("--disable-web-security");
// 忽略SSL证书错误
options.addArguments("--ignore-certificate-errors");
// 以隐身模式启动浏览器
options.addArguments("--incognito");
// 设置代理服务器地址和端口,例如 --proxy-server=127.0.0.1:8087
options.addArguments("--proxy-server");
// 设置浏览器窗口的位置
options.addArguments("--window-position");
// 设置浏览器窗口的大小
options.addArguments("--window-size");
// 禁用JavaScript
options.addArguments("--disable-javascript");
// 禁用插件
options.addArguments("--disable-plugins");
// 禁用图像
options.addArguments("--disable-images");
元素的定位方式
!!!
java
// 使用元素的ID属性来定位元素,这是最快且最准确的方式
driver.findElement(By.id("id值"));
// 使用CSS选择器来定位元素
driver.findElement(By.cssSelector("input[type='submit']"));
//使用元素的class属性来定位元素
driver.findElement(By.className("xxxx"));
//通过元素的标签名来定位元素
driver.findElement(By.tagName("xxxx"));
//通过元素的name属性来定位元素
driver.findElement(By.name("xxxx"));
//通过链接的完整文本内容来定位 <a> 标签元素
driver.findElement(By.linkText("xxxx"));
//通过链接文本的部分内容来定位 <a> 标签元素
driver.findElement(By.partialLinkText("xxxx"));
//通过包含指定文本的class属性来定位元素
driver.findElement(By.classNameContaining("xxxx"));
//通过包含指定文本的标签名来定位元素
driver.findElement(By.tagNameContaining("xxxx"));
//通过包含指定文本的CSS选择器来定位元素
driver.findElement(By.cssSelectorContaining("xxxx"));
//通过包含指定文本的XPath表达式来定位元素
driver.findElement(By.xpathContaining("//input[contains(@class,'partialClass')]"));
//使用XPath表达式来定位多个元素,返回一个元素列表
List<WebElement> elements = driver.findElements(By.xpath("//input"));
//使用XPath表达式来定位元素,XPath是一种在XML文档中查找信息的语言,也适用于HTML
driver.findElement(By.xpath("//input[@type='submit']"));
多说两句:
- 1、优先使用ID定位; ID是元素在HTML中的唯一标识符,使用ID进行定位是最直接、最快速的方式。如果元素有唯一的ID,应该优先使用ID进行定位,因为它的效率最高
- 2、Selenium官方推荐使用CSS选择器进行元素定位 因为CSS选择器的效率通常高于XPath,并且语法更加简洁。
CSS的获取可以用chrome的F12开发者模式中Element-右键-copy-copy selector来获取
- 3、避免使用xpath的绝对路径 绝对路径对页面结构要求比较严格,不建议使用绝对路径,因为页面结构的微小变化都可能导致定位失败
XPATH的获取可以用chrome的F12开发者模式中Element-右键-copy-copy xpath来获取
- 4、使用逻辑运算符组合定位:使用XPath的逻辑运算符and、or来组合更多元素特征,以提高定位的准确性。
- 5、避免使用过于通用的选择器:如find_element_by_tag_name,因为这种方法可能会返回多个元素,需要进一步使用下标来定位特定的元素
- 6、考虑元素的可访问性:选择那些在DOM结构中相对稳定且不太可能变化的元素属性进行定位
- 7、动态元素的处理:对于动态生成的元素,可以考虑使用显式等待(Explicit Wait),等待元素可见或可操作后再进行定位
- 8、框架和iframe的处理:当元素位于iframe或不同的框架中时,需要先切换到相应的框架中再进行元素定位。
- 9、异常处理:在定位元素时,应该添加异常处理逻辑,以便在元素未找到时能够给出清晰的错误信息。
等待机制
三种等待
-
硬等待【Hard Wait】(也叫强制等待)
javaThread.sleep(3000); // 硬等待,等待3秒
-
隐式等待【Implicit Wait】:等待页面所有元素
javadriver.manage().timeouts().implicitlywait(10,TimeUint.SECONDS); // 设置隐式等待时间为10秒
-
显式等待【Explicit Wait】:可以指定等待页面的某一个元素
- 显式等待使用WebDriverWait和ExpectedConditions来等待特定的条件发生
- WebDriverWait接收两个参数:一个WebDriver对象和一个秒数(最大等待时间)。如果在指定的时间内条件没有满足,将会抛出一个TimeoutException异常
javaWebDriverWait wait = new WebDriverWait(driver, 10); // 显式等待,等待一个元素可见,最多等待10秒 WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("xxxid值"))); // 等待元素可点击 WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("elementId"))); //等待元素存在 WebElement element = wait.until(ExpectedConditions.presenceOfElementLocated(By.id("elementId"))); //等待页面标题:会等待直到页面的标题完全匹配"预期的标题" WebElement element = wait.until(ExpectedConditions.titleIs("预期的标题"));
总结
- 【硬等待】 如果等待时间是三天,那么强制等待会一直等待直到三天结束;
通常不推荐使用,因为它会无条件的阻塞进程,效率低;
- 【隐式等待】 是等待页面所有的元素加载完成后才执行下面代码,如果加载过程中超过等待时间就会报错
- 【显示等待】 显示等待最长等待时间为设置的时间,在期间如果满足等待结束条件(until()方法中)就会结束等待
- 隐式等待和显示显式等待是常用的等待方式,只能等待可以根据项目需求自定义实现
等待超时处理方法
-
1、增加等待时间 : 针对页面加载缓慢 或 网络延迟引起的异常
-
2、优化元素定位: 确保使用的XPath或CSS选择器准确且唯一,避免因定位不当导致的超时
-
3、使用Try-Catch块来捕获和处理TimeoutException,可以防止脚本因超时而突然失败,并允许执行其他操作或记录错误
-
4、增加重试机制(代码示例如下)
javafor (int i = 0; i < maxAttempts; i++) { try { element = WebDriverWait(driver, 5).until(ExpectedConditions.presence_of_element_located((By.ID, "elementID"))); // 执行元素上的操作 break; // 如果成功,退出循环 } catch (TimeoutException e) { if (i < maxAttempts - 1) {continue; // 如果还有尝试次数,继续重试} else {throw e; // 如果已达最大尝试次数,抛出异常} } }
-
5、 检查网络连接 : 确保测试环境的网络连接稳定,因为不稳定的网络连接可能会导致WebDriver与网站交互时超时
-
6、更新Selenium和WebDriver : 保持Selenium和对应的WebDriver更新到最新版本,以确保与浏览器的兼容性
浏览器及窗口操作
包含浏览器的:前进、后退、滚动条操作、最大化、全屏、宽高设置、获取窗口位置和大小、设置窗口位置和大小
java
driver.navigate().back(); //浏览器后退
driver.navigate().refresh(); //刷新
driver.navigate().forward(); //浏览器前进
//浏览器滚动条操作,此时需要将webDriver强制转换
//executeScript()中是js代码,scrollTop方法是向上滚动多少个像素
((JavascriptExecutor)driver).executeScript("document.documentElement.scrollTop=10000");
//浏览器最大化
driver.manage().window().maximize();
//浏览器全屏
driver.manage().window().fullscreen();
//设置浏览器宽高
driver.manage().window().setSize(new Dimension(600,1000));
// 获取窗口大小:size.getWidth() 、size.getHeight()
Dimension size = driver.manage().window().getSize();
// 设置窗口大小
driver.manage().window().setSize(new Dimension(800, 600));
// 获取窗口位置:position.getX()、position.getY()
Point position = webDriver.manage().window().getPosition();
// 设置窗口位置
driver.manage().window().setPosition(new Point(100, 100));
键盘和鼠标操作
利用Actions和Keys类来模拟键盘操作,包括文本输入、按键和组合键序列
增强自动化脚本的用户交互能力
键盘事件
-
单个使用
1.TAB键:sendKeys(Keys.TAB)
- 回车键:sendKeys(Keys.ENTER)
3.空格键:sendKeys(Keys.SPACE)
4.回退键:sendKeys(Keys.ESCAPE)
-
组合使用
1.全选(Ctrl+A):sendKeys(Keys.CONTROL,'a')
2.复制(Ctrl+C):sendKeys(Keys.CONTROL,'c')
3.剪贴(Ctrl+X):sendKeys(Keys.CONTROL,'x')
4.粘贴(Ctrl+V):sendKeys(Keys.CONTROL,'v')
-
代码示例
java// 打开百度网页 driver.get("https://www.baidu.com"); //control+a driver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"A"); //control+x driver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"X"); //control+v driver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"V");
鼠标事件
通过ActionChains 类实现鼠标执行的操作:
1、contextClick() 单击
2、doubleClick() 双击
3、dragAndDrop() 拖动
4、moveToElement() 移动
5、perform() 右击
不能发送鼠标滚轮操作
java
// 打开百度网页
webDriver.get("https://www.baidu.com");
webDriver.findElement(By.cssSelector("#kw")).sendKeys("迪丽热巴");
webDriver.findElement(By.cssSelector("#su")).click();
//找到图片按钮
WebElement webElement = driver.findElement(By.cssSelector("#\\32 > div > div > div > div > div.list-scroll_7E1go > div > div:nth-child(1) > div.avatar-wrapper_622F1 > a:nth-child(1) > div > div._capsule_1e0bo_35.capsule_GwMlS.cu-line-clamp-1"));
//鼠标右击操作
Actions actions = new Actions(driver);
//鼠标移动到图片,右击,执行
actions.moveToElement(webElement).contextClick().perform();
浏览器关闭
可以通过quit()和close()方法关闭浏览器
java
webDriver.close(); // close关闭当前页面
webDriver.quit(); // quit关闭整个浏览器并且清空缓存