Selenium原理
Selenium是一个用于Web应用程序自动化测试工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作浏览器一样。支持的浏览器包括IE,Firefox,Safari,Chrome等
1、Selenium工作原理
编写的测试脚本作为客户端,通过使用webdriver类的实例化对象,真正地去调用webdriver这个应用,然后webdriver会在计算机上启动一个端口绑定浏览器启动作为服务端并监听来自于脚本的信息,并且将脚本信息处理为json格式的信息,通过http协议和浏览器内核进行通信,从而浏览器能够响应脚本的操作。
2、Webdriver驱动原理
Webdriver会将对应的浏览器绑定在特定端口启动,并作为一个服务器监听来自于测试脚本的命令,selenium测试脚本通过调用该服务操作本机安装的相应的浏览器。
3、Selenium环境搭建
1)引入Selenium Jar包
2)下载selenium Jar包之后添加到项目的build path中
官网地址:https://www.seleniumhq.org/download/ (不翻墙的话可能需要多次尝试)
推荐使用淘宝镜像:https://npm.taobao.org/
3)配置webdriver驱动器
目前市面主流的浏览器都针对selenium开发了对应的webdriver驱动器,因而需要下载和浏览器版本对应的webdriver.exe文件。chromedriver依然推荐在淘宝镜像下载。
注意:一定要确保浏览器版本和webdriver支持版本对应,否则将会导致无法启动浏览器或者运行过程中的位置问题。
Selenium 八种元素定位方法
1、id定位
如:findElement(By.id("username"))
2、name定位
如:findElement(By.name("name_vaule"))
3、class定位
如:findElement(By.className("logo"))
4、tag定位
如:findElement(By.tagName("tag_name"))
备注:tag_name应该是所有定位方式中最不靠谱的一种,因为在一个页面上
相同tag_name的元素极其容易出现
5、link定位
如:findElement(By.linkText("新闻"))
6、partial_link定位
当一个文字很长的链接时,我们可以只取其中的部分,只要取的部分
可以唯一标识元素
如:findElement(By.partialLinkText("新"))
7、xpath定位
绝对路径:从一个网页的根元素html开始往下查找元素,/html/body开头
相对路径://开头,标识在html文档的任意位置搜索相应的元素
绝对路径:findElement(By.xpath(“/html/body/div/div/div[5]/div/div/form/span/input”))
相对路径:findElement(By.xpath(“//*[@id="kw"]”))
//元素名[限制条件表达式][序号]
1)//表示在当前元素的后代元素中进行搜索
2)元素名用标签名称进行限制,*表示元素名的通配符
3)/表示在当前元素的直接子元素下进行查找。
如://*[@id="app"]/section/section/header/div/div/span[1]/span[2]
4)限制条件表达式:
当条件是元素的文本内容时,表达式写法是text()='文本内容'
如://div/span[1][text()="欢迎进入 Automatic Test Platform"]
当条件是元素开始标签中的属性,表达式写法是@属性='属性值',当只需要表达元素有某个属性而不关心它的值时,直接写@属性就可以了
可以用and连接多个表达式,加强限制。
not(限制表达式)就可以表达取非的操作。
如://*[@id='baidu' and not(@href)]
5)序号:注意xpath中序号从1开始。
如://*[@id="app"]/section/section/header/div/div/span[2]/a/span
6)轴定位:元素/轴定位关键字(parent/following-sibling)::元素名[限制表达式]
如:
8、CSS定位
CSS是层叠样式表,是一种用来表现HTML(标准通用标记语言的一个应
用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。
CSS使用选择器来为页面元素绑定属性。这些选择器可以被selenium用作另
外的定位策略。
常用CSS定位语法如下:
1、使用绝对路径来定位元素。CSS绝对路径指的是在DOM结构中具体的位
置,使用绝对路径来定位用户名输入字段,在使用绝对路径的时候,每个元
素之间要有一个空格。
findElement(By.cssSelector("html body div div div[5] div div form span input"))
这种策略有一定的局限性,如果界面的布局改变了,那么可能就定位不到我
们想要的元素了
2、 使用相对路径来定位元素
当使用CSS选择器来查找元素的时候,我们可以使用class属性来定位元素,
我们可以先指定一个HTML的标签,然后加上一个”.”符合,跟上class属性
的值
findElement(By.cssSelector("div a.mnav"))
findElement(By.cssSelector("div a.mnav + a"))
findElement(By.cssSelector(".mnav"))找界面所有className为mnav的元素
3、 使用相对ID选择器来定位元素
可以使用元素的ID来定位元素,先指定一个HTML标签,然后加上一个”#”
符号,跟上id的属性值
findElement(By.cssSelector("input#kw"))
findElement(By.cssSelector("#kw"))
这种方法也是会找界面所有id=kw的元素,不一定能定位到我们要的元素上
4 、使用属性值选择器来定位元素
通过指定元素中属性值来定位元素
单属性:findElement(By.cssSelector("a[name='tj_briicon']"))
多属性:findElement(By.cssSelector("a[name='tj_briicon'][class='s-bri c-font-normal c-color-t']"))
多属性主要用于在一个属性不足以定位一个元素的时候。
5、部分属性值的匹配
CSS选择器提供了一个部分属性值匹配定位元素的方法,这为了测试那些页
面上具有动态变化的属性的元素是非常有用的,例如界面技术EXTJS的
id,className是动态变化的。
匹配前缀:^= 匹配后缀:$=
匹配字符串:*= 内文字匹配:contains
1)匹配以 tj_ 开始的链接
findElement(By.cssSelector("a[name^='tj_'][class='s-bri c-font-normal c-color-t']"))
2)匹配以 mp3 结尾的链接
findElement(By.cssSelector("a[name$='mp3']"))
3)匹配包含 news 字符串的链接
findElement(By.cssSelector("a[name*='bao']"))
6、列表选择具体的匹配
Selenium中的CSS选择器允许我们更细致的浏览列表下的元素,如下图,我
想选择第三行链接,可以用nth-of-type或者nth-child
findElement(By.cssSelector("a[class^='mnav']:nth-of-type(3)"))
findElement(By.cssSelector("a[class^='mnav']:nth-child(3)"))
常用css定位语法
Xpath和Css部分定位功能对比,如下图:
总结:CSS定位语法比Xpath简洁,定位方式更灵活多样;不过对CSS理解比Xpath难;但不管是从性能上还是定位更复杂的元素上,CSS优于Xpath。
UI自动化实例
登录实例
package com.testing.test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class Demo2 {
public static void main(String[] args) {
String path ="E:\LearningMaterials\Example\eclipse-workspace\Interface\webdrivers\chromedriver.exe";
// 启动谷歌浏览器
System.setProperty("webdriver.chrome.driver",path);
WebDriver driver=new ChromeDriver();
// 浏览器最大化
driver.manage().window().maximize();
// 强制等待
sleep(30);
// 进入到指定网址
driver.get("http://123.57.1.35:8888/user/login?redirect=%2F");
// 用户名输入admin
driver.findElement(By.cssSelector("#username")).sendKeys("admin");
// 密码输入123456
driver.findElement(By.cssSelector("#password")).sendKeys("123456");
// 输入验证码
driver.findElement(By.cssSelector("#inputCode")).sendKeys("12");
// 点击登录按钮
driver.findElement(By.xpath("//*[@id="formLogin"]/div[3]/div/div/span/button")).click();
sleep(20);
// 关闭浏览器
driver.close();
}
private static void sleep(int i) {
}
}