最近使用selenium框架实现业务前端的UI自动化,在使用selenium时,有一些心得想要和大家分享一下。
Selenium是一款用于web应用程序测试的工具,常用来实现稳定业务的UI自动化。这里,不想对其发展历史做介绍,也不想用官方语言去描述。简单的一句话总结其运行的基本原理:适配于对应浏览器的webdriver驱动解析自动化执行脚本,按其规定的方式操作浏览器。
到这里,我们也大致了解selenium是干什么用的,那么接下来直接切入主题,和大家分享我在做UI自动化的时候总结出的一些小知识点,我想这些小知识点对于想要快速入门selenium的同学或者初级使用者多少有点帮助。
1.如何搭建环境?
使用selenium的环境具体需要:jdk+浏览器驱动+浏览器。由于本业务选择使用java语言实现ui自动化,因此需要用到jdk。目前selenium支持的主流的浏览器有chrome,ie,firefox等,需要注意的是,下载好浏览器之后,必须下载适应版本的浏览器驱动方可操作浏览器。
2.哪些方式用来定位元素?
目前最常用定位元素有以下7种方式:
2.1>根据元素的name属性进行定位
webDriver.findElement(By.name("phrase"));
2.2>根据文本链接进行定位
webDriver.findElement(By.linkText("发表"));
2.3>根据元素的id属性进行定位
webDriver.findElement(By.id("title"));
2.4>根据元素的class属性进行定位
webDriver.findElement(By.className("note-editable"));
2.5>根据css定位元素,css属性定位能够灵活地选择控件的任意属性。
webDriver.findElement(By.cssSelector("li:nth-child(2)")).click();
2.6>根据元素的标签名进行定位
webDriver.findElement(By.tagName("phrase"));
2.7>根据xpath的绝对路径或者相对路径进行定位,这种定位方式最精准,最可靠。
webdriver.findElement(By.xpath("//img[@alt='div1-img1']"));
3.如何控制时间并有效的定位元素?
使用selenium最常见的问题就是找不到元素,而找不到元素的绝大部分原因就是在一定时间内,元素没有加载出来导致。因此,控制好时间对于有效的定位元素很有帮助。selenium中常见的时间控制手段有三种:
3.1>使用线程控制,如:Thread.sleep(ms)。该种控制方式效果好,但是不够灵活,即使元素已经定位到,也需要耗完指定的时间。
3.2>隐式等待控制,如:webDriver.manage().timeouts.implicitlyWait(10,TimeUnit.SECONDS)。隐式等待也叫全局等待,webDriver实例的所有findElement都会有该设定时长的等待,作用域大,但灵活性不够。
3.3>显示等待控制,如:
WebDriverWait wait=new WebDriverWait(driver, 10);
WebElement wl = wait.until(new ExpectedCondition
@Override
public WebElement apply(WebDriver d) {
return d.findElement(By.cssSelector(".red_box"));
}
});
显示等待作用于单个元素上,明确的要等到某个元素的出现,除非在规定的时间之内没找到,那么就抛出异常。显然,该方式使用更加灵活,而且显示等待只需找到元素即可运行程序的下一步,比之线程,能够节省时间。
4.如何确定元素是否存在?
一般有两种手段:
4.1>使用try catch捕获元素定位不到抛出的异常。可见下图:
4.2>使用selenium api自带函数。见下图:
5.如何切换窗口?
ui自动化操作常涉及页面跳转等操作,很多时候会打开新的窗口,这时,webdriver实例会发生改变,如果想继续准确定位元素,这就需要切换窗口。切换可以通过switchTo()函数来控制,可见如下实例(适用于只有两个窗口的其他窗口切换):
6.如何使用无页面模式?
由于本项目ui自动化需要部署到centos服务器上,所以需要使用无页面模式。目前,有chrome,firefox两种浏览器支持无页面模式,那么,如何使用无页面模式了?其实,只需要在生成webdriver实例时,指定无页面模式属性即可。chromeOptions.addArguments("headless");//无界面参数
7.如何滑动页面?
有时,为了使得需要点击的元素出现在视图内,通常需要滑动页面,而在selenium中可以通过控制执行脚本来实现。((JavascriptExecutor) webDriver).executeScript("window.scrollBy(0, 7000)");
8.如何实现无验证码登陆?
通过模式识别等方案去实现验证码获取进而登录网站的方式不够成熟可靠。目前较为可靠的一种方式,利用已登录网站的cookie来替代无验证码登录,具体实现方式可参考下图:
9.如何截取全图?
有时,需要将运行中的图片截出来,用以直观的定位业务的问题,可以使用如下方式:
10.如何关闭窗口?
使用完webdriver后,需要关闭窗口。关于关闭窗口,有两种形式:
10.1> webdriver.close():用来关闭当前窗口。
10.2> webdriver.quit():用来退出驱动并关闭所有关联的窗口。
11.如何实现页面刷新?
对于页面刷新操作不妨使用下面几种方法:
webdriver.navigate().refresh();
webdriver.get(driver.getCurrentUrl());
webdriver.navigate().to(driver.getCurrentUrl());
webdriver.executeScript("history.go(0)");