注意!!
此篇幅是对之前三篇文章的一部分内容补充
一、显示等待
在之前的篇幅中我们提到了隐式等待,通过webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.DAYS);
来进行隐式等待
详情可参照该系列的(二)
http://47.120.15.189/index.php/2024/04/05/软件测试知识整理-selenium篇二/
1.显示等待代码实现
private static void method9(){
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com/");
WebDriverWait wait = new WebDriverWait(webDriver,50);
wait.until(ExpectedConditions.titleIs("百度一下,你就知道"));
}
2.显示等待与隐式等待
相同点:显示等待与隐式等待都属于智能等待,当页面加载完成,或者找到我们需要定位的元素之后,则继续后续代码操作,若找不到则最多等待到设置好的最大时长
不同点:隐式等待等待的是页面上所有的元素,显示等待是一定条件的元素或者操作,也就是当设置条件满足就可以不再等待
二、浏览器操作(补充操作浏览器滚动条)
首先我们要知道浏览器滚动条的操作需要依靠JS脚本
所以document.documentElement.scrollTop=10000
该语句就是将滚动条滑到最低端的操作
那么将该语句通过Java的方式进行编写就可以完成对应操作,代码如下
private static void method10(){
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com/");
((JavascriptExecutor)webDriver).executeScript("document.documentElement.scrollTop=10000");
}
这段代码的根本逻辑就是将webDriver强制类型转换为JS类型去执行JS语句
三、截图
首先我们需要引入一个依赖
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
这里不进行Maven引入依赖的教学
然后编写以下代码
//截图操作,但未设置保存路径
private static void method11() throws IOException {
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com/");
File file = ((TakesScreenshot) webDriver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(file,new File(""));
}
通过以上方式可以进行屏幕截图,注意,这里我并没有设置图片保存路径,如需尝试截图请在FileUtils.copyFile(file,new File(""));
该代码片段""号中添加需要保存到的目录(路径要详细到某个目录下外带文件名如D:\截图.png)即可
四、浏览器关闭
这里需要提到webDriver.quit()
以及webDriver.close()
在之前篇章中一部分代码示例我应该有webDriver.quit()
的操作,简而言之,该操作相当于我们通过鼠标点击浏览器右上角的"x"号
但是webDriver.close()
与webDriver.quit()
有所不同,它会关闭代码操作的当前页面
逻辑如下
我们在操作浏览器的时候可能会进行页面跳转也就是会多出来一个标签页,如图所示
如果我们用
webDriver.close()
去关闭页面时,如下代码
private static void method12(){
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com/");
webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
webDriver.close();
}
在代码中我们定位了百度新闻的超链接并进行了跳转,然后执行关闭操作,这时,虽然页面已经跳转到百度新闻,但是对于代码而言,其操作的页面是https://www.baidu.com/
,也就是百度首页,所以它会关闭百度的首页,而不是整个浏览器
注:使用quit()会清除浏览器刚刚执行操作以后的cookie(一些记录信息,如浏览历史记录,保存的用户登录信息等),但是close()不会清除cookie,如果需要执行退出(关闭)操作,个人建议使用quit()
五、窗口切换
当我们进行了页面跳转以后我们可能对跳转页面也需要进行自动化操作,如刚刚第四点内容,跳转到百度新闻页面以后,其实我们的自动化代码仍然操作的是百度首页的页面,如果我们直接copy百度新闻页面的元素的selector,然后去按照之前的元素定位操作是会导致代码报错的,那么我们应该如何进行窗口切换操作呢?
切换示例如下
private static void method13(){
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com/");
webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
//获取浏览器所有窗口句柄
Set<String> windowHandles = webDriver.getWindowHandles();
String target_handle = "";
for (String handle:windowHandles){
target_handle = handle;
}
//输出拿到的页面窗口的最后一个句柄(标签页)
System.out.println(target_handle);
//切换操作对象
webDriver.switchTo().window(target_handle);
}
通过上述代码我们可以拿到自动化代码弹出窗口的所有句柄(标签页),拿到这个句柄集合以后我们可以通过遍历等操作获取到我们需要跳转到的标签页,通过webDriver.switchTo().window(target_handle);
这样的操作就可以进行窗口切换了,这样我们再进行新窗口的元素定位就不会报错了