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()
以确保资源被完全释放。
版权归原作者 田里插秧 所有, 如有侵权,请联系我们删除。