文章目录
一、环境准备二、Web 自动化测试 Demo三、元素定位常用方法四、元素定位失败可能原因五、测试对象操作六、等待操作七、信息打印
在学习 Web 自动化测试的过程中,selenium 是其中的常用工具。除了其开源免费,包含丰富的 API 以外,它还支持多浏览器,多系统,多语言等等优点
一、环境准备
这里将使用Java语言,在谷歌浏览器(Chrome)下来进行 selenium 工具的使用。
想要开展自动化测试,首先要保证环境已经部署到位,包括 selenium 工具包,Chrome浏览器,Webdriver(Chromedriver 谷歌驱动),java版本至少为8
关于 selenium 工具包,在我们创建好一个 Maven 项目之后,就需要在 pom.xml 中引入依赖。完成后,一定要点开界面右上角的 Maven 按钮,点击刷新按钮进行刷新
Chrome 浏览器记得在官方网页下载就行。
由于使用的是 Chrome 浏览器,那么我们使用的驱动得是谷歌驱动(Chromedriver),这个驱动的作用就是协助打开 Chrome 浏览器的,因为代码是没有办法自己直接打开浏览器,进行一系列操作的。
下载驱动的具体操作呢,首先要先查看一下 Chrome 浏览器的版本,浏览器右上角的三个点 ▶️ 帮助 ▶️ 关于 Google Chrome
然后,进入下面的地址,选择与 Chrome 版本最接近的版本,点进去,下载驱动
链接:Chromedriver
下载完成后,将 chromedriver.exe 放到 C:\Program Files\Java\jdk1.8.0_192\bin 目录下(默认情况下)
PS:最好停止浏览器自动更新的功能,不然版本更新后,又需要下载新的驱动
具体操作,控制面板 ▶️ 管理工具 ▶️ 服务 ▶️ Google更新服务禁用(右击属性设置)
二、Web 自动化测试 Demo
主要内容就是打开浏览器,打开百度网页,在搜索框中输入搜索关键词,点击 “百度一下“ 搜索按钮,查看到搜索结果内容,关闭浏览器
public class Test1 {
//创建出一个驱动对象来
private ChromeDriver driver = new ChromeDriver();
//自动化测试前必须的操作:打开网址
public void startTest() {
driver.get("https://www.baidu.com/");
}
public void demoTest() throws InterruptedException {
Thread.sleep(1000);//等待1秒,为了更方便的查看测试状态
//找到 id 为 "kw" 的元素(百度输入框),然后往该元素中填充搜索词 "巴巴"
driver.findElement(By.id("kw")).sendKeys("巴巴");
Thread.sleep(1000);
//找到 id 为 "su" 的元素('百度一下'按钮),然后点击一下
driver.findElement(By.id("su")).click();
Thread.sleep(1000);
}
//自动化测试后必须的操作:释放掉驱动对象,浏览器关闭
public void endTest() {
driver.quit();
}
}
调用测试方法类
public class RunTest {
public static void main(String[] args) throws InterruptedException {
Test1 test1 = new Test1();
test1.startTest(); //测试准备
test1.demoTest(); //测试 ing
test1.endTest(); //测试收尾
}
}
三、元素定位常用方法
在上面的测试 Demo 中就已经举例出了一种元素定位方法——By.id()【通过id】
除此外还有通过 cssSelector,xpath,tagName,className,name,partialLinkText,linkText
//一、id 定位(全局唯一,可定位成功)
driver.findElement(By.id("kw"));
//二、cssSelector 定位(唯一,可定位成功)
driver.findElement(By.cssSelector("#kw"));
//三、xpath 定位(唯一,可定位成功)
driver.findElement(By.xpath("//*[@id=\"kw\"]"));
//四、tagName 定位(标签名不唯一性大,定位失败率高)
driver.findElement(By.tagName("input"));
//五、className 定位(不唯一性大,定位失败率高)
driver.findElement(By.className("s_ipt"));
//六、name 定位(有定位失败的可能)
driver.findElement(By.name("wd"));
//七、linkText 定位(链接名定位)
driver.findElement(By.linkText("hao123"));
//八、partialLinkText 定位(部分链接名定位)
driver.findElement(By.partialLinkText("123"));
定位元素时,一定要保证元素能够找到且唯一,否则定位失败
四、元素定位失败可能原因
原因一:定位的方式不唯一,或者根本就没与该元素
检查该元素是否可定位,可通过F12的console标签通过document.querySelector() 的方法定位,可验证是否能找到元素
原因二:如果使用 cssSelector 或者 xpath 的话,其定位方式错误
按下F12,ctrl+f,把要检查的 cssSelector 输入,看能否只定位到一个元素。
原因三:页面还没有加载完成,就开始定位元素
一般来说,代码执行的速度比页面渲染速度要快。代码执行到了,但目标元素在页面中还没有渲染出来导致没法定位到目标元素,因此需要合理使用元素等待
原因四:元素没有达到可见的条件
比如目标元素需要鼠标悬停或者单击页面上的某个元素或者需要需要滚动条下拉才能找到。或者还有可能,需要定位的元素在新的窗口中,但是还没有打开新的窗口,需要切换到新窗口才可以找到目标元素。还有可能某些元素本来就是不可见的,比如 display 属性为 none,这就需要通过 JavaScript 修改 display 的值
原因五:存在表单嵌套
顺着定位元素往上找,查看是否有
五、测试对象操作
5.1 click 点击对象
driver.findElement(By.partialLinkText("123")).click();
5.2 send_keys 按键输入
driver.findElement(By.id("kw")).sendKeys("巴巴");
5.3 clear 清除输入
driver.findElement(By.id("kw")).clear();
5.4 submit 提交表单
driver.findElement(By.id("su")).submit();
click 和 submit 都可以操作按钮,不同的是,click 可以点击页面中的任何元素,但可以 click 的地方不一定可以 submit ,所以一般使用 click 就行
5.5 getText 文本获取
String str = driver.findElement(By.partialLinkText("123")).getText();
System.out.println(str);
获取的文本是不包含在标签内的,标签中的 value 值指的是 value 的属性值
5.6 getAttribute 属性值获取
String str1 = driver.findElement(By.id("su")).getAttribute("type");
String str2 = driver.findElement(By.id("su")).getAttribute("value");
String str3 = driver.findElement(By.id("su")).getAttribute("id");
String str4 = driver.findElement(By.id("su")).getAttribute("class");
System.out.println("type:"+str1+" value:"+str2+" id:"+str3+" class:"+str4);
六、等待操作
在元素定位失败的原因中有提到过,代码的执行速度比页面渲染的速度快,如果目标元素还没渲染出来,代码就已经执行到了,就会导致找不到目标元素,所以等待的操作是非常有必要的
强制等待
Thread.sleep(1000);
参数是强制等待的时间,单位是毫秒,用法非常简单。指定多少时间就会让程序暂停多少时间,等待时间结束后才会继续执行下一步,方便调试查看测试过程。但固定的等待时间导致测试时间过长,降低测试效率
隐式等待
public void waitTest() {
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(2));
//隐式等待,设置等待的时间为 2,单位为秒
driver.findElement(By.id("kw")).sendKeys("狗狗");
driver.findElement(By.id("su")).click();
driver.findElement(By.xpath("//*[@id=\"5\"]/div/div/h3/a")).click();
}
隐式等待指的是在自己设置的这段时间内,不停的等待目标元素出现,如果在时间范围内始终没有出现,就会抛出找不到元素异常(NoSuchElementException)。并且隐式等待作用范围为整个 Webdriver 生命周期,所以放在哪里影响不大,只要没退出浏览器就一直存在。
和强制等待相比,无疑是节省了很多的时间
显示等待
隐式等待有个缺点,那就是需要等待所有的元素都展现出来了才会执行下一步。与之相比,显示等待的优点就是针对某个元素进行等待,不需要等到所有元素都渲染好,目标元素出现就可以结束了,进一步提高测试效率,但是写法相较于前两种来说更为复杂。
public void waitTest() {
driver.findElement(By.id("kw")).sendKeys("狗狗");
driver.findElement(By.id("su")).click();
//创建一个显示等待的对象,初始化时传入两个参数,一个是驱动对象,另一个是等待时间
WebDriverWait wait = new WebDriverWait(driver,Duration.ofSeconds(3));
//在规定时间内不停寻找目标元素
//结束的契机就是until括号内的条件满足,即目标元素已经被找到了,没找到就抛出异常
wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[@id=\"5\"]/div/div/h3/a"))).click();
}
PS:隐式等待和显示等待不要放在一起使用,不然实际等待的时间将没有办法预期
七、信息打印
public void printTest() {
String title = driver.getTitle(); //获取网址标题
String url = driver.getCurrentUrl(); //获取网址 url
System.out.println("title:"+title+" url:"+url);
}
参考阅读
发表评论