承接上篇,在上一篇中我们说到了webdriver API,接下来需要进行实际的代码操作
一、编写一个简单测试用例
1.在百度搜索框中输入文本信息并点击"百度一下"
private static void method1(){
//创建驱动
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
WebDriver webDriver = new ChromeDriver(options);
//打开百度
webDriver.get("https://www.baidu.com/");
//定位输入框并输入内容"软件测试"
webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件测试");
//点击"百度一下"按钮进行百度
webDriver.findElement(By.cssSelector("#su")).click();
//关闭跳转页面
webDriver.quit();
}
通过上文封装的方法运行测试以后会出现以下运行结果
通过代码我们可以看到
findElement()代表我们想要去寻找元素
By.cssSelector()代表我们使用css选择器去定位元素,其中#kw以及#su分别为百度搜索框和"百度一下"按钮
sendKeys()表示我们想要对一个元素进行输入操作
click()表示对找到的元素进行点击操作
2.检测自动化结果是否符合预期(即测试是否通过)
在实际应用时,不可能我们要一直盯着屏幕去检查如上案例的查询结果,不然程序运行一次还好,但是如果需要运行几百上千次,那肯定就不好搞了
于是我们就需要验证搜索结果是否包含我们的检索关键词
通过下图可以看到"软件测试"关键词会被包含在一个em标签中,所以我们检测结果的时候只需要定位到这些em标签然后做校验即可
于是我们将上一个代码进行补充
private static void method1() throws InterruptedException {
//创建驱动
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
WebDriver webDriver = new ChromeDriver(options);
//打开百度
webDriver.get("https://www.baidu.com/");
//定位输入框并输入内容"软件测试"
webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件测试");
//点击"百度一下"按钮进行百度
webDriver.findElement(By.cssSelector("#su")).click();
//找到所有的"软件测试"文案对应元素
sleep(4000);//强制等待4s,目的是等待html页面进行渲染,否则先运行定位元素操作容易出现查找不到元素的问题
List<WebElement> em = webDriver.findElements(By.cssSelector("em"));//找到em标签并存储在list集合中
//输出找到元素的个数
System.out.printf(String.valueOf(em.size()));
//关闭跳转页面
//webDriver.quit();
}
当上述方法成功运行后我们可以在控制台看到如下样式
通过控制台我们可以看到找出了29个对应的em标签,这意味着有29个软件测试文案被找出
注:因为搜索具有时间以及浏览器页面大小等个体差异,数字不一定非要等于29,只要不是找出0个什么的,应该就没问题
当然为了更直观的知道测试有没有通过,防止因为时间久远而不知道代码作用和目的,我们可以将控制台输出检测的结果数目变为文字描述
private static void method1() throws InterruptedException {
//创建驱动
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
WebDriver webDriver = new ChromeDriver(options);
//打开百度
webDriver.get("https://www.baidu.com/");
//定位输入框并输入内容"软件测试"
webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件测试");
//点击"百度一下"按钮进行百度
webDriver.findElement(By.cssSelector("#su")).click();
//找到所有的"软件测试"文案对应元素
sleep(4000);//强制等待4s,目的是等待html页面进行渲染,否则先运行定位元素操作容易出现查找不到元素的问题
List<WebElement> em = webDriver.findElements(By.cssSelector("em"));//找到em标签并存储在list集合中
//输出找到元素的个数
System.out.printf(String.valueOf(em.size()));
System.out.println();
if (String.valueOf(em.size()).equals("0")){
System.out.println("测试不通过");
} else {
System.out.println("测试通过");
}
//关闭跳转页面
webDriver.quit();
}
这样一个测试用例就完成了
二、操作测试对象
在这里说明一下,在此篇文章中可能多用css选择器去定位元素,而不是通过xpath去定位元素,原因是xpath定位元素效率比较低...
前面讲到了不少知识都是定位元素,定位只是第一步,定位之后需要对这个元素进行操作。是鼠标点击还是键盘输入,或者清除元素的内容,或者提交表单等。这个取决于定位元素需要进行的下一步操作。
webdriver 中比较常用的操作对象的方法有下面几个:
- click 点击对象
- send_keys 在对象上模拟按键输入
- clear 清除对象输入的文本内容
- submit 提交
- text 用于获取元素的文本信息
1.鼠标点击与键盘输入
上述案例就涉及到鼠标的点击与键盘输入,此处就不多做赘述
2.submit提交表单
打开百度搜索页面,按钮“百度一下”元素的类型type=“submit”,所以把“百度一下”的操作从click 换成submit 可以达到相同的效果:
webDriver.findElement(By.cssSelector("#su")).submit();
注意:使用submit操作时,对应元素必须在from标签中,所以一般实现点击操作使用click就可以了
3.text获取元素文本
找到想要获取的元素文本利用getText()方法去获取文本,但是好像这个方法总是有可能获取不到文本信息,于是推荐使用getAttribute()去获取文本信息具体使用方法如下
private static void method2(){
//创建驱动
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
WebDriver webDriver = new ChromeDriver(options);
//打开百度
webDriver.get("https://www.baidu.com/");
System.out.println(webDriver.findElement(By.cssSelector("#su")).getAttribute("value"));
System.out.println(webDriver.findElement(By.cssSelector("#su")).getText());
//关闭跳转页面
webDriver.quit();
}
上述代码我通过两种方法进行文本信息的获取结果如下
不出意外getAttribute()方法成功了,所以强烈推荐使用getAttribute()方法
三、添加等待
1.sleep休眠
在上面的代码示例中为了等待页面渲染,防止测试出现问题,我们使用了sleep()方法进行了强制等待
但是,当我们拥有很多测试用例时,强制等待就会浪费大量时间,有时候明明测试结果可以用2s完成,但是我们强制等待4s,那么一个测试用例就用了6s的时间,这样的测试用例多了,那么浪费的时间自然就多了起来
于是就有了智能等待的概念...
2.隐式等待
通过添加iimplicitlyWait() 方法就可以方便的实现智能等待;implicitlyWait的用法比sleep()更智能,后者只能选择一个固定的时间的等待,前者可以在一个时间范围内智能的等待。
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.DAYS);
隐式地等待并非一个固定的等待时间,当脚本执行到某个元素定位时,如果元素可以定位,则继续执行;如果元素定位不到,则它以轮询的方式不断的判断元素是否被定位到。直到超出设置的时长
还是之前的软件测试的例子
private static void method3(){
//创建驱动
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
WebDriver webDriver = new ChromeDriver(options);
//打开百度
webDriver.get("https://www.baidu.com/");
//定位输入框并输入内容"软件测试"
webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件测试");
//点击"百度一下"按钮进行百度
webDriver.findElement(By.cssSelector("#su")).click();
//找到所有的"软件测试"文案对应元素
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.DAYS);
List<WebElement> em = webDriver.findElements(By.cssSelector("em"));//找到em标签并存储在list集合中
//输出找到元素的个数
System.out.printf(String.valueOf(em.size()));
System.out.println();
if (String.valueOf(em.size()).equals("0")){
System.out.println("测试不通过");
} else {
System.out.println("测试通过");
}
webDriver.quit();
}
这里使用了webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.DAYS);
方法其中3代表数量集,后面的TimeUnit.DAYS代表等待时长,意思是最长等待三天(当然这个等待时长并不科学,但是可以提供给我们演示效果,不过等3小时当然也OK)
当我们运行method3()时,会发现测试用例的执行时间几秒就结束了,并没有说出现等待3天的情况,那么我们的测试就完成了...
如果说我们的代码中对应元素编写错误,那么代码就会等待三天然后报错,如果想要看到报错效果,可以将隐式等待的时间缩短,故意改错元素id,然后等待规定时长即可,我这里并不多做演示...
四、打印信息
打印信息通常用来验证我们测试对象的内容是否是我们需要找到的信息
1.打印百度首页url
示例
private static void method4(){
//创建驱动
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
WebDriver webDriver = new ChromeDriver(options);
//打开百度
webDriver.get("https://www.baidu.com/");
//获取当前页面url
String url = webDriver.getCurrentUrl();
//打印当前页面url在控制台,方便调试
System.out.println(url);
//判断url是否等于https://www.baidu.com/
if (url.equals("https://www.baidu.com/")){
System.out.println("测试通过");
}else {
System.out.println("测试不通过");
}
webDriver.quit();
}
通过getCurrentUrl()方法,我们就可以拿到当前页面url
之后就可以进行URL打印以及校验了
运行结果如下
2.打印百度首页title
示例
private static void method5(){
//创建驱动
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
WebDriver webDriver = new ChromeDriver(options);
//打开百度
webDriver.get("https://www.baidu.com/");
//获取当前页面title
String title = webDriver.getTitle();
System.out.println(title);
//判断title是否等于百度一下,你就知道
if (title.equals("百度一下,你就知道")){
System.out.println("测试通过");
}else {
System.out.println("测试不通过");
}
webDriver.quit();
}
通过getTitle()方法,我们就可以拿到当前页面title
之后就可以进行title打印以及校验了
运行结果如下
五、浏览器的操作
1.浏览器最大化
我们知道调用启动的浏览器不是全屏的,这样不会影响脚本的执行,但是有时候会影响我们“观看”脚本的执行。
通过代码webDriver.manage().window().maximize();
我们就可以实现浏览器最大化
2.浏览器全屏
通过代码webDriver.manage().window().fullscreen();
我们就可以实现浏览器全屏
3.设置浏览器宽高
通过代码webDriver.manage().window().setSize(new Dimension(500,500));
我们就可以将浏览器宽高都设置为500像素(500px)
4.操作浏览器前进与后退与刷新
通过代码webDriver.navigate().back();
可以实现浏览器后退的操作
通过代码webDriver.navigate().forward();
可以实现浏览器前进的操作
通过代码webDriver.navigate().refresh();
可以实现浏览器刷新的操作