Selenium三大组件
- Selenium IDE,Firefox/Chrome浏览器的扩展插件,通过Selenium IDE我们可以录制和回放浏览器操作,快速实现自动化测试。
- Selenium WebDriver,Selenium的核心,提供了各种语言环境的API来支持更多控制权和编写符合标准软件开发实践的应用程序。
- Selenium Grid,分布式测试,通过Selenium Grid可以将自动化测试脚本分发到不同的测试机器中执行。
selenium详细介绍,查看官网https://selenium.dev/
Selenium WebDriver
第一个web自动化测试脚本
- 创建Maven项目
- 引入selenium依赖
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
</dependency>
- 下载浏览器驱动
通过在chrome浏览器的地址栏上面输入chrome://version获取chrome版本
下载对应的chromedriver https://chromedriver.storage.googleapis.com/index.html - 编写自动化测试脚本
ChromeDriver driver = new ChromeDriver();
driver.get("https://www.baidu.com");
- 常见问题:
Selenium WebDriver原理
- Selenium客户端(Java代码)首先启动驱动程序,调用驱动打开浏览器。
- get访问网址/点击/输入…这些操作会通过指令发送给驱动,由驱动再次传给浏览器解释执行,通讯采用的是WebDriver协议
- 浏览器将执行结果通知到客户端
元素定位
基础元素定位
- id属性定位
By.id("XX");
- name属性定位
By.name("XX");
- class属性定位
By.className("XX");
- 标签名定位
By.tagName("XX");
- 超链接完整文本定位
By.linkText("XX");
- 超链接部分文本定位
By.partialLinkText("XX");
css选择器
- css选择器定位
7.1 根据标签名
By.cssSelector("input");
- 7.2 根据ID
By.cssSelector("#id");
By.cssSelector("标签名#id"); //使用html标签拼上#id
- 7.3 根据className(样式名),.class形式
By.cssSelector(".样式名");
By.cssSelector("标签名.样式名"); //标签名拼上样式
- 7.4 单属性选择定位
By.cssSelector("标签名[属性名='属性值']");
- 7.5 多属性选择定位
By.cssSelector("标签名[属性1='属性值'][属性2='属性值']");
xpath
- xpath元素定位
- xpath其实就是一个path(路径),一个描述页面元素位置信息的路径,相当于元素的坐标
- xpath基于XML文档树状结构,是XML路径语言,用来查询xml文档中的节点
- 既可以用于XML,也可以用于HTML
8.1 xpath绝对定位 --不要用
绝对路径以单/号表示,而且是让解析引擎从文档的根节点开始解析,也就是html这个节点下开始解析
/html/body/div[2]/div/form/div[5]/button
缺点
后期维护性差
8.2 xpath相对定位 -推荐使用
相对路径则以//表示,则表示让解析引擎从文档的任意符合的元素节点开始进行解析
定位方式
- 属性定位
//标签名[@属性名='值']
- 文本定位
//标签名[text()='值']
- 模糊匹配
属性模糊匹配
//标签名[contains(@属性名,'值')]
文本模糊匹配
//标签名[contains(text(),'值')]
- 层级关系定位
使用场景:
如果通过常规的方法定位到的元素不是唯一的,那么可以考虑先通过他们不同的父级或父级的父级来定位。
#方式一:先找父级再找对应元素
//*[@id='father']/child
#方式二:先找父级的父级...再找对应元素
//*[@id='ancestor']//child
- xpath轴定位
以上方式都无法定位到元素的情况下,可以考虑轴定位
轴名称 | 释义 |
ancestor | 选取当前节点的所有祖先节点(包括父节点) |
parent | 选取当前节点的父节点 |
preceding | 选取当前节点之前的所有节点 |
preceding-sibling | 选取当前节点之前的所有兄弟节点–找哥哥 |
following | 选取当前节点之后的所有节点 |
following-sibling | 选取当前节点之后的所有兄弟节点–找弟弟 |
使用语法:
轴名称::标签名
示例:
//a[text()='登录']//parent::td
三大等待
- 强制等待
Thread.sleep(long millis);
优点:使用简单
缺点:容易造成时间浪费
- 隐式等待
在设置的超时时间范围内不断查找元素,直到找到元素或者超时为止
如:设置等待时间为5秒,在第3秒找到元素,不再继续等待
设置方式
driver.manage.timeouts().implicitlyWait(long time, TimeUnit unit);
优点:相对灵活
缺点:
只能等待元素存在,不能适用条件更复杂的情况,如:元素可点击、元素可见
- 显式等待
显式等待通常是我们自定义的一段代码,用来等待某个条件发生后再继续执行后续代码(如元素存在、元素可点击、元素可见等)
使用方式:
WebDriverWait wait = new WebDriverWait();
WebElement element = wait.until(expectCondition); //until:等待条件满足时为止
优点:
每隔一段时间扫描一次页面,检查元素是否满足等待结果条件,比如查找元素,则检查元素是否存在,不存在则继续等待,直到找到或超时。
该方式不是全局设置,对需要等待的元素进行设置,推荐优先使用这一种方法。
方法 | 等待条件 |
presenceOfElementLocated | 页面元素在页面源代码中存在 |
visibilityOfElementLocated | 页面元素在页面存在并且可见 |
elementToBeClickable | 页面元素是否在页面上可被单击 |
三大切换
持续更新中。。。