写在前面 // 如果文章有问题的地方, 欢迎评论区或者私信指正
目录
未雨绸缪
什么是Selenium
在测试领域中,Selenium是一个用于自动化测试和浏览器自动化的开源框架。它允许开发人员编写脚本来模拟用户在浏览器中的行为,自动执行一系列操作,如点击按钮、填写表单、导航到不同页面等。Selenium最初是为Web应用程序的自动化测试而创建的,但后来也被广泛用于进行网络数据抓取和网页内容爬取,特别是那些需要JavaScript渲染的页面。
Selenium提供了多种编程语言的绑定,包括Python、Java、C#、JavaScript等,使开发人员能够使用自己熟悉的编程语言来编写自动化脚本。Selenium Grid是Selenium的一个功能,它允许同时在多个浏览器和操作系统上运行测试,从而提供了更广泛的测试覆盖范围。
一个简单的用例
public class Main {
public static void main(String[] args) {
ChromeOptions options = new ChromeOptions() ;
options .addArguments("--remote-allow-origins=*");
WebDriver webDriver = new ChromeDriver(options) ;
webDriver.get("https://www.baidu.com") ;
}
}
下面来一一解释:
ChromeOptions options = new ChromeOptions() ;
-
ChromeOptions options = new ChromeOptions();
这行代码是创建了一个新的ChromeOptions
对象实例,并将其赋值给变量options
。ChromeOptions
类是Selenium WebDriver中用于配置Chrome浏览器启动选项的一个类。 - 通过
ChromeOptions
对象,你可以设置各种启动参数、扩展程序、用户配置文件等,以定制Chrome浏览器的行为。例如,你可以设置浏览器窗口的大小、禁用图片加载、启用或禁用JavaScript等。 - 在你创建
ChromeOptions
对象之后,你通常会使用它的方法来添加配置选项。例如,你可以使用addArguments
方法来添加命令行参数,使用setExperimentalOption
方法来设置实验性选项,或者添加用户数据目录等。例如下面的语句:
options .addArguments("--remote-allow-origins=*");
- 具体来说,
--remote-allow-origins=*
这个参数是用来控制哪些远程页面或应用可以与此浏览器实例进行通信的。当设置为*
时,它允许任何来源的页面或应用与浏览器实例进行通信。
WebDriver webDriver = new ChromeDriver(options) ;
- 这行代码是在使用Selenium WebDriver来初始化一个新的Chrome浏览器实例。
- WebDriver 是Selenium WebDriver库中的一个核心接口, 用于与浏览器进行通信,以自动化网页操作。
- ChromeDriver: 这是WebDriver接口的一个实现,专门用于与Chrome浏览器进行通信。它封装了与Chrome浏览器实例交互所需的所有细节。
- 这行代码创建了一个新的ChromeDriver实例,并使用之前配置好的
options
对象来初始化它。初始化后的ChromeDriver实例赋值给了webDriver
变量,之后你就可以通过这个变量来控制Chrome浏览器了。
webDriver.get("https://www.baidu.com") ;
- 打开百度首页。
元素定位
元素的定位是自动化测试的核心,想要操作一个对象,就必须先拿到他,你可以类比一下我们使用js或者jquery来操作html元素,你可以通过一个标签的class或者id属性来定位。元素的定位有很多种方法,也是通过各种属性进行定位,但是无论什么方法,都必须保证页面上该属性的唯一性。
webdriver 提供了一系列的对象定位方法,常用的有以下几种:
- id
- name
- class name
- link text
- partial link text
- tag name
- xpath
- css selector
对其定位并获取到这个元素的时候,你就可以对其进行各种操作,例如点击,输入文本等:
- click 点击对象
- send_keys 在对象上模拟按键输入
- clear 清除对象输入的文本内容
- submit 提交
- text 用于获取元素的文本信息
操作对象后面讲解
id定位
id属性在我们页面元素中式唯一的(在整个页面当中),但不是所有的元素都有id,有的元素只有class属性,所以的一般具有id元素的可以使用id来定位:
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">
package com.example.forumspringboot27;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
public class Main {
public static void main(String[] args) {
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
WebDriver webDriver = new ChromeDriver(options);
webDriver.get("https://www.baidu.com");
// 找到百度搜索输入框
// 通过CSS选择器
WebElement baidu_searcch = webDriver.findElement(By.cssSelector(".s_ipt"));
// 输入信息
baidu_searcch.sendKeys("软件测试");
}
}
然后就会自动打开百度的页面然后再对应的 .s_ipt 对应的标签中输入 "软件测试"
xpath定位
XPath 是一种在XML 文档中定位元素的语言。因为HTML 可以看做XML 的一种实现,所以selenium 用户可是使用这种强大语言在web 应用中定位元素。XPath 扩展了上面id 和name 定位方式,提供了很多种可能性。
XPATH的获取可以用chrome的F12开发者模式中Element-右键-copy-copy xpath来获取
基于xml,通过xpath:
WebElement baidu_search_xpath = webDriver.findElement(By.xpath("//*[@id=\"kw\"]"));
baidu_search_xpath.sendKeys("软件测试2");
你可能会问,什么是xpath?
XPath,全称XML Path Language,即XML路径语言,是一种在XML文档中查找信息的语言。XPath最初是用来搜寻XML文档的,但同样适用于HTML文档的搜索。XPath使用路径表达式来选取XML文档中的节点或节点集,并可用于从XML文档中提取信息。XPath是XSLT标准中的重要核心组件,并且是W3C标准之一。XPath提供了丰富的标准函数库来处理字符串值、数值、日期和时间比较、节点和QName操作、序列操作、逻辑值等。
XPath的主要作用包括:
- 在XML文档中查找信息:XPath用于在XML文档中通过元素和属性进行导航,以确定XML文档中某部分的位置,并遍历XML文档中的元素和属性。
- 作为XSLT的主要元素:XPath在XSLT标准中是一个主要元素,必须遵循XPath才能使用XSLT文档。XSLT常用于将XML文档转换为其他格式,如HTML。
- 提供标准函数库:XPath含有超过100个内建的函数,用于处理各种数据类型和操作,如字符串值、数值、日期和时间比较、节点和QName处理、序列处理以及逻辑运算等。
XPath路径表达式与常规的电脑文件系统中的表达式非常相似,使用这些表达式可以在XML文档树状结构中查找节点。因此,XPath在XML数据处理和转换中扮演着重要角色。如需了解更多关于XPath的详细信息,建议查阅相关编程书籍或在线教程。
--
学习xml:https://www.w3school.com.cn/xml/
https://www.w3school.com.cn/xml/
--
我们现在讲述的例子中,主要存在两种类型的xpath:
- 绝对路径:/html/head/title (不常用)
- 相对路径:
- 相对路径 + 索引
- 相对路径 + 属性值
- 相对路径 + 通配符
- 相对路径 + 文本匹配
name定位
如果这个元素有name,并且元素的name命名在整个页面是唯一的,那么我们可以用name来定位这个元素。用上面百度输入框的例子,其中元素的属性name=”wd”
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">
public static void testByName() {
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
WebDriver webDriver = new ChromeDriver(options);
webDriver.get("https://www.baidu.com");
webDriver.findElement(By.name("wd")).sendKeys("你好");
}
tag name 定位和class name 定位
从上面的百度输入框的属性信息中,我们看到,不单单只有id 和name 两个属性, 比如class 和tagname(标签名)input 就是一个标签的名字,可以通过find_element_by_tag_name("input") 函数来定位。class="s_ipt",通过find_element_by_class_name("s_ipt")函数定位百度输入框。
在这里要注意的是,不是所有的元素用 tag name或者 class name来定位元素,首先要保证该元素的这两种属性在页面上是唯一的,才能够准确的定位。
虽然方便,但是要注意唯一性。
还是以百度的为例子:
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">
public static void testByName() {
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
WebDriver webDriver = new ChromeDriver(options);
webDriver.get("https://www.baidu.com");
webDriver.findElement(By.className("s_ipt")).clear();
// 这里需要注意,下面这种方式要尤其注意有没有重复的tagName
// webDriver.findElement(By.tagName("input")).sendKeys("hello");
}
这里如何定位不一一讲解,可以自行search。。。
操作元素
前面讲到了不少知识都是定位元素,定位只是第一步,定位之后需要对这个元素进行操作。是鼠标点击还是键盘输入,或者清除元素的内容,或者提交表单等。这个取决于定位元素需要进行的下一步操作。webdriver 中比较常用的操作对象的方法有下面几个:
- click 点击对象
- send_keys 在对象上模拟按键输入
- clear 清除对象输入的文本内容
- submit 提交
- text 用于获取元素的文本信息
- getAttribute 用于获取webDriver对象的属性值
click
触发鼠标点击事件,也就是你拿到一个元素,button也好,input也好,只要执行click操作,就相当于鼠标直接去点击,例如百度页面有一个搜索框和一个百度一下的按钮:
<input type="submit" value="百度一下" id="su" class="btn self-btn bg s_btn">
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">
我们首先获取这两个元素,然后在输入框中输入“软件测试”,然后再获取“百度一下”这个元素,然后执行click操作:
public static void testClick() {
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
WebDriver webDriver = new ChromeDriver(options);
webDriver.get("https://www.baidu.com");
// 获取输入框
WebElement kw = webDriver.findElement(By.id("kw"));
// 输入"软件测试"
kw.sendKeys("软件测试");
// 获取"百度一下"
WebElement su = webDriver.findElement(By.id("su"));
// 执行click操作
su.click();
}
输出: