1)CSS选择器定位元素
CSS选择器是一种模式,用于选择需要样式化的HTML元素。在Web开发中,CSS选择器用于定位文档中的元素,以便对它们应用样式规则。这里介绍几种常用的CSS选择器:
-
元素选择器(类型选择器):
选择所有指定类型的元素。例如,p
选择所有<p>
元素。 -
类选择器:
选择所有具有指定类名的元素。类名以点(.
)开头。例如,.classname
选择所有具有类名classname
的元素。 -
ID选择器:
选择具有指定ID的元素。ID在HTML文档中应该是唯一的。ID选择器以井号(#
)开头。例如,#idname
选择具有IDidname
的元素。 -
属性选择器:
根据元素的属性及属性值来选择元素。例如,[type="text"]
选择所有type
属性值为text
的元素。 -
后代选择器(或包含选择器):
选择某个元素内部的后代元素。使用空格分隔两个选择器。例如,div p
选择<div>
元素内部的所有<p>
元素。 -
子选择器:
选择直接子元素。使用>
分隔两个选择器。例如,ul > li
选择所有直接位于<ul>
元素内部的<li>
元素。 -
相邻兄弟选择器:
选择紧接在另一元素后的元素,且二者有相同的父元素。使用+
分隔两个选择器。例如,h1 + p
选择所有紧跟在<h1>
元素后的<p>
元素。 -
通用兄弟选择器:
选择某个元素之后的所有兄弟元素,且二者有相同的父元素。使用~
分隔两个选择器。例如,h1 ~ p
选择所有在<h1>
元素之后的<p>
元素。 -
伪类选择器:
用于选择元素的特殊状态。例如,:hover
选择鼠标指针浮动在上面的元素,:first-child
选择作为其父元素的第一个子元素的元素。 -
伪元素选择器:
用于样式化元素的特定部分。例如,::before
在元素内容之前插入新内容,::after
在元素内容之后插入新内容。
CSS选择器可以组合使用,以更精确地定位元素。例如,.classname p
选择所有类名为classname
的元素内部的<p>
元素。
2)xpath定位元素
XPath(XML Path Language)是一种在XML文档中查找信息的语言,但它也经常被用于HTML文档的解析,特别是在Web自动化测试(如Selenium)和网页爬虫中,以定位和操作页面上的元素。XPath提供了一种强大的方式来选择节点,无论是基于节点的属性、位置还是其他条件。
在Web自动化测试中,使用XPath定位元素时,通常会根据元素的HTML结构、属性(如id、class、name等)以及它们之间的相对位置来编写XPath表达式。下面是一些XPath定位元素的常见示例:
1. 基于元素ID
如果元素有一个唯一的ID,可以直接使用它来定位元素,但XPath不是直接支持ID选择器的(像CSS选择器那样使用#
),而是需要通过属性选择器来实现:
//*[@id='elementId'] |
这里,//*
表示选择文档中的任何元素,[@id='elementId']
是一个条件,表示选择那些id
属性值为elementId
的元素。
2. 基于元素标签名
选择所有<p>
标签的元素:
//p |
3. 基于类名
选择所有类名为classname
的元素:
//*[contains(concat(' ', normalize-space(@class), ' '), ' classname ')] |
注意,这里使用了contains
和concat
函数来处理类名可能存在的空格和多个类名的情况。
4. 基于属性
选择所有type
属性为text
的<input>
元素:
//input[@type='text'] |
5. 基于位置
选择第一个<div>
元素内的第二个<p>
元素:
//div/p[2] |
6. 组合条件
选择所有类名为classname
且type
属性为text
的<input>
元素:
//input[@type='text' and contains(concat(' ', normalize-space(@class), ' '), ' classname ')] |
注意事项
- XPath表达式对大小写敏感,因此请确保在编写XPath时,元素标签名、属性名等的大小写与HTM
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
public class Main {
public static void main(String[] args) {
//创建一个驱动
WebDriver webDriver=new ChromeDriver();
//打开百度首页
webDriver.get("https://www.baidu.com");
//定位百度搜索框(通过css选择器定位元素)
/* WebElement search_input = webDriver.findElement(By.cssSelector(".s_ipt"));*/
//通过xpath定位元素
/* WebElement search_input=webDriver.findElement(By.xpath("//*[@id=\"kw\"]"));*/
WebElement search_input=webDriver.findElement(By.tagName("input"));
// 通过标签定位元素
if(search_input==null){
System.out.println("测试不通过");
}else {
System.out.println("测试通过");
}
// webDriver.quit();
webDriver.close();
}
}
在使用Selenium WebDriver进行自动化测试时,webDriver.quit()
和 webDriver.close()
是两个常用的方法来结束浏览器会话,但它们之间存在一些关键的区别:
webDriver.quit()
:- 当调用
quit()
方法时,它会关闭所有与WebDriver实例关联的浏览器窗口,并结束WebDriver会话。这意呀着,如果打开了多个浏览器窗口或标签页,使用quit()
会关闭它们全部。 - 在结束浏览器会话之后,你将无法再使用这个WebDriver实例来执行任何浏览器操作,因为它已经与浏览器断开了连接。
quit()
方法是一个更加彻底的资源清理方式,因为它不仅关闭了浏览器窗口,还释放了WebDriver占用的系统资源。
- 当调用
webDriver.close()
:- 与
quit()
不同,close()
方法仅关闭当前浏览器窗口或标签页。如果你的WebDriver实例打开了多个窗口或标签页,close()
只会关闭当前激活的那个窗口,而不会影响其他窗口。 - 如果你的测试脚本仅打开了一个浏览器窗口,那么
close()
和quit()
在效果上看起来可能是一样的,因为它们都关闭了唯一的浏览器窗口。但是,在资源管理方面,quit()
更优,因为它确保了WebDriver占用的资源被完全释放。 - 如果在关闭最后一个窗口后还需要执行一些清理工作(比如检查日志或清理临时文件),你可能更倾向于使用
close()
,因为它不会立即结束WebDriver会话。但是,在完成这些额外工作后,仍然应该调用quit()
来确保资源被正确释放。
- 与
总结:
- 使用
quit()
来结束所有的浏览器窗口并释放WebDriver占用的资源。 - 使用
close()
来关闭当前激活的浏览器窗口,而不影响其他窗口或标签页。如果你只打开了一个窗口,且不需要执行额外的清理工作,quit()
和close()
在效果上可能相同,但推荐使用quit()
以确保资源被完全释放。