Selenium原理
1、Selenium 1.0(Selenium RC):
早期的Selenium使用的是Javascript注入技术与浏览器打交道,需要Selenium RC启动一个Server,
将操作Web元素的API调用转化为一段段Javascript,在Selenium内核启动浏览器之后注入这段Javascript。
因为Javascript可以获取并调用页面的任何元素,自如的进行操作,所以才实现了Selenium的目的:自动化Web操作
2、Selenium 2.x
当Selenium2.x 提出了WebDriver的概念之后,它提供了完全另外的一种方式与浏览器交互。那就是利用浏览器原
生的API,封装成一套更加面向对象的Selenium WebDriver API,直接操作浏览器页面里的元素,甚至操作浏览器
本身(截屏,窗口大小,启动,关闭,安装插件,配置证书之类的)。由于使用的是浏览器原生的API,速度大大
提高,而且调用的稳定性交给了浏览器厂商本身,显然是更加科学。然而带来的一些副作用就是,不同的浏览器厂
商,对Web元素的操作和呈现多少会有一些差异,这就直接导致了Selenium WebDriver要分浏览器厂商不同,而提
供不同的实现。例如Firefox就有专门的FirefoxDriver,Chrome就有专门的ChromeDriver等等。(甚至包含了AndroidDriver和iOS WebDriver)
参考文章:
Selenium元素定位方法(八种)
1、通过Name定位元素
1.1、方法:By.name("name的值")
介绍:通过元素的name属性来定位元素(但一般name属性并不是唯一的)
示例: driver.findElement(By.name(""));
1.2、方法:By.tagName("tagName的值");
介绍:通过元素的标签名称来定位元素
示例:driver.findElement(By.tagName(""));
1.3、方法:By.className("className的值");
介绍:通过元素的class属性来进行定位(但一般name属性并不是唯一的)
示例:driver.findElement(By.className(""))
备注:该方法中的参数只有一个,所以若网页中class的属性有多个,只能选取其中一个来进行定位
2、通过ID定位元素
2.1、方法:By.id("id的值")
介绍:通过元素的id来进行定位
示例:driver.findElement(By.id("id的值"));
备注:元素的id是唯一的,所以首选By.id方法来进行元素的定位;
但有的元素没有id,就需要选择其他的方法来进行元素的定位
3、通过LinkText定位元素
3.1、方法:By.linkText("链接的全部内容")
介绍:作用于a标签,匹配链接的全部文字内容
示例:driver.findElement(By.linkText("车辆管理"));
3.2、方法:By.partiallinkText("链接的部分内容")
介绍:作用于a标签,匹配链接的部分文字内容
示例:driver.findElement(By.partiallinkText("车辆"));
4、通过css定位元素
4.1、方法:By.cssSelector("css表达式");选择某一个符合css表达式的元素
By.cssSelectors("css表达式");选择全部符合css表达式的元素
介绍:通过css表达式这种组合的方式来进行定位,和xpth方式基本相同
示例:driver.findElement(By.cssSelector(".bgcolor"));
备注:
1、cssSelector即css选择器,即 .bgcolor{ color : red }这个CSS表达式中 .bgcolor就是cssSelector
2、该方法还可以使用id,tagname,class来定位元素
(1)ID: By.cssSelector("#ID值"); //需要在id值前面加上#
(2)Tagname:By.cssSelector("tag值");
(3) Class:By.cssSelector(".class值"); //需要在前面加上 .(加上点)
5、通过xpth定位元素
5.1、方法:By.xpth("元素路径");选择某一个符合css表达式的元素
介绍:通过元素路径来进行定位
示例:driver.findElement(By.xpth("/html/body/div[1]/section/aside/div/"));
备注:元素的路径可以使用一些浏览器组件来进行查找,例如xpthFind、xpthHelp等,可以快速定位元素的路径
5.2、xpth定位语法
/ 绝对定位,从根节点进行选取
// 相对定位,从匹配选择的当前节点选择文档中的节点
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性,@class='XXX' @id='XXX' 属性放在[]中 【 //div[@name='phone']//input 】
* 通配符,匹配所有 //*
@* 通配符,匹配所有属性 //*[@*='hello']
5.3、xpth定位方式
xpath定位分为绝对定位和相对定位
(1)绝对定位 (/):严格按照路径、同级元素的位置来定位,缺点:页面一动,基本崩溃
例如:/html/body/div[2]/div/form/div[1]/input 以/html开始
(2)相对定位(//):有一个参照物 不考虑路径和位置 以//开头 //标签名[@属性名称=值]
例如//input[@name='phone'] # 标签名为input并且name属性值为phone
5.4、其他语法
(1)and or
示例: //input[@name='phone' and @datatype='m']
(2)包含
//input[contains(@class,'username') ] //标签名[contains(@属性值,被包含的值)]
(3)文本内容定位
示例://a[text()='数据分析'] //a[contains(text(),'数据分析')]