Selenium三大组件

  • Selenium IDE,Firefox/Chrome浏览器的扩展插件,通过Selenium IDE我们可以录制和回放浏览器操作,快速实现自动化测试。
  • Selenium WebDriver,Selenium的核心,提供了各种语言环境的API来支持更多控制权和编写符合标准软件开发实践的应用程序。
  • Selenium Grid,分布式测试,通过Selenium Grid可以将自动化测试脚本分发到不同的测试机器中执行。

selenium详细介绍,查看官网https://selenium.dev/

Selenium WebDriver

第一个web自动化测试脚本

  1. 创建Maven项目
  2. 引入selenium依赖
<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>3.141.59</version>
</dependency>
  1. 下载浏览器驱动
    通过在chrome浏览器的地址栏上面输入chrome://version获取chrome版本
    下载对应的chromedriver https://chromedriver.storage.googleapis.com/index.html
  2. 编写自动化测试脚本
ChromeDriver driver = new ChromeDriver();
driver.get("https://www.baidu.com");
  1. 常见问题:

Selenium WebDriver原理

  • Selenium客户端(Java代码)首先启动驱动程序,调用驱动打开浏览器。
  • get访问网址/点击/输入…这些操作会通过指令发送给驱动,由驱动再次传给浏览器解释执行,通讯采用的是WebDriver协议
  • 浏览器将执行结果通知到客户端

元素定位

基础元素定位

  1. id属性定位
By.id("XX");
  1. name属性定位
By.name("XX");
  1. class属性定位
By.className("XX");
  1. 标签名定位
By.tagName("XX");
  1. 超链接完整文本定位
By.linkText("XX");
  1. 超链接部分文本定位
By.partialLinkText("XX");

css选择器

  1. css选择器定位
    7.1 根据标签名
By.cssSelector("input");
  1. 7.2 根据ID
By.cssSelector("#id");
By.cssSelector("标签名#id"); //使用html标签拼上#id
  1. 7.3 根据className(样式名),.class形式
By.cssSelector(".样式名");
By.cssSelector("标签名.样式名"); //标签名拼上样式
  1. 7.4 单属性选择定位
By.cssSelector("标签名[属性名='属性值']");
  1. 7.5 多属性选择定位
By.cssSelector("标签名[属性1='属性值'][属性2='属性值']");

xpath

  1. 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

页面元素是否在页面上可被单击

三大切换

持续更新中。。。