Selenium自动化

一、selenium自动化知识点:

selenium自动化框架搭建/自动化怎么做?
UI自动化的话,先配置环境,比如安装jdk、maven、eclipse,再导入依赖jar包比如
testng、reportng、log4j、poi(excel读取测试案例需要用到)、还有selenium2.5这些jar包添加在pom文件中,还需要添加一些驱动比如iedriver、chomedriver 、因为我用的是selenium2版本所以firefox就不需要添加驱动了,再就是配置浏览器,比如为firefox浏览器安装一些插件,用来进行元素定位。再写测试案例把测试案例的excel文件存放在项目指定目录下。再使用seleniumAPI结合testng开发自动化脚本,开发完成需要把代码提交到svn上,再配置jenkins让脚本每天凌晨以后自动执行,并且发邮件。
大概就是这样的一个过程。
当然还有一些细节:比如创建一些包分为别类的存放文件,比如错误截图包、配置文件包、
工具类包,对了我们还需要开发一些工具类
比如log4j工具类、excel数据读取工具类这些工具类也需要放在项目中去使用,再就是常用的 selenium API 我们要封装好,用的时候调一下好了,比如 判断元素是否存在、错误截图
等等 大概就是这样.

log4j怎么去开发的?(参见接口自动化)

Log4j需要先在项目中开发 log4j.properties文件,声明记录日志的级别,日志写在哪个目录, 比如指定debug级别存放在一个目录中,error级别存放在一个目录中。

再开发工具类,工具类需要传入Class类的类对象,然后方法中先读取log4j.properties
文件,再使用getLogger返回该类的logger对象。

public static Logger getLog(Class<? extends Object> clazz){

PropertyConfigurator.configure(“res/log4j.properties”);

Logger logger = Logger.getLogger(clazz);

return logger;
}

Excel工具类怎么去开发的?

Excel用的是java里边的opi jar包开发的方法,我们需要把excel中的数据读取到一个二维数组中,和testng的 dataprovider进行对接。入参定义为(sheet页的页数,从第几行开始,第几行结束,第几列开始,第几列结束) 出参的话定义为返回一个二维数组。大概就是这样。
/ 该方法通过opi技术将 excel中的内容 循环读取到一个二维数组中 /
public static Object[][] read(String path, int sheetNum, int startRow, int endRow, int startCell, int endCell) {
Object[][] datas = new Object[endRow

  • startRow
  • 1][endCell
  • startCell
  • 1];
    try {
    Workbook workbook = WorkbookFactory.create(ExcelUtil.class.getResourceAsStream(path));
    Sheet sheet = workbook.getSheetAt(sheetNum - 1);
    for (int i = startRow; i <= endRow; i++) {
    Row row = sheet.getRow(i - 1);
    for (int j = startCell; j <= endCell; j++) {
    Cell cell = row.getCell(j - 1, MissingCellPolicy.CREATE_NULL_AS_BLANK);// 获取的格子中的内容如果为null
    // 用””替换
    // 设置每一列的数据类型为字符串
    cell.setCellType(CellType.STRING);
    String value = cell.getStringCellValue();// 获取列的值
    datas[i - startRow][j - startCell] = value;
    }
    }
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    return datas;
    }
    判断元素是否存在怎么去开发?
    创建一个方法,入参为 By对象也就是元素定位对象和WebDriver对象,
    再在方法中使用 findElement方法去查找by对象,如果找到返回true,找不到返回false、
    / 判断元素是否存在, 用该函数可以判断元素是否存在 封装 /
    public static boolean IsExist(By by,WebDriver dr){
    try{
    dr.findElement(by); //如果找不到会报错,报错会被捕获并 返回 false
    return true;
    }catch(Exception e){
    return false;
    }
    }

    错误截图怎么去开发的?

    错误截图的方法的话,需要使用Calendar 对象先获取当前年月日时分秒,再把caseid和年月日十分秒拼接起来作为错误截图的文件名,保证文件名不重复,再使用getScreenshotAs
    方法把图截下来保存在一个对象中,然后用FileUtils.copyFile把截图拷贝到指定目录中。
    public static void getErrorScreenShot(WebDriver dr,String caseId){
    Calendar cal = Calendar.getInstance();
    int year = cal.get(Calendar.YEAR);
    int month = cal.get(Calendar.MONTH )+1; //Calendar 的 month 从 0 开始,也就是全年 12 个月由 0 ~ 11 进行表示。
    int day = cal.get(Calendar.DAY_OF_MONTH);//日
    int hour = cal.get(Calendar.HOUR_OF_DAY);//时
    int mi = cal.get(Calendar.MINUTE);//分
    int ss = cal.get(Calendar.SECOND);//秒
    int ms = cal.get(Calendar.MILLISECOND);//毫秒
    String str = caseId+”[“+year+”-“+month +”-“+day+”-“+hour+”-“+mi+”]”+ss+ms;
    System.out.println(str);

    // 将屏幕截图并且保存在File对象中
    File scrFile = ((TakesScreenshot) dr).getScreenshotAs(OutputType.FILE);
    // 使用写好的API 把 scrFile 拷贝到指定的test.png中
    try {
    FileUtils.copyFile(scrFile, new File(“errorimage\“+str+”.png”));
    } catch (IOException e) {
    e.printStackTrace();
    }
    }

    2、Selenium元素定位。

    总结:元素是怎么样定位的?
    元素定位这块我是在firefox上安装FireBug插件和firepath插件,用插件先定位到元素的html代码,再进行分析主要的定位
    1、我知道的有 7/8 种,比如通过 元素的id定位用 byId、元素的name属性用 ByName、元素的标签名ByTagName,还有样式名By.className(),还有根据超链接的文本文字信息定位 :By.linkText(),除了以上这些还有 使用css选择器定位用 cssSelector,还有使用xPath定位。
    2、我比较喜欢使用 cssSelector进行定位,因为不管是通过 id还有通过name还有tagName ,cssSelector都包含了,再就是实际工作中,大部分需要定位唯一的元素,cssSelector提供了多个属性定位一个元素的方法,非常的方便。Xpath也比较方便,xpath可以很方便的通过文本值或者层级关系定位,总之还是看具体的元素,选择合适的选择器。
    1、driver.findElement(By.xpath(“//*[text()=’退出’]));
    2、根据id获取元素 :dr.findElement(By.id(“keyword”));
    根据那么属性获取元素:dr.findElement(By.name(“username”));
    4、根据css选择器:属性值选择器:By.cssSelector(“input[value=’登录’]”))
    5、多个属性值选择器如:
    By.cssSelector(“label[class=’error’][for=’username’]”
    根据超链接的文本文字信息定位 :By.linkText();

    Selenium数据源你是怎么操作的?

我们会在maven项目中建个包,专门存放测试数据,测试数据写在excel中,然后使用工具类把excel中的数据读取到testng的dataprovider中。再让测试脚本使用dataprovider进行循环读取使用。
Selenium测试案例怎么写?
自动化测试案例功能测试案例不同,除了应该有测试编号,测试目的,还需要根据不同的情况写测试数据,比如登陆,我们需要提供好各个情况的测试数据,还有续期结果,预期结果的话,我们可以使用元素的文本值内容、网页的标题等等作为预期的结果。

Selenium测试案例的话
运行错误怎么去处理?
image.jpeg

1、使用log.error记录错误日志
loger.error(“测试点出现问题:”+testPoint);
2、保存屏幕截图
PublicApi.getErrorScreenShot(dr, testPoint);
3、使用assert false进行断言失败
4、打印堆栈信息e.printStackTrace();

页面元素怎么去切换?

在工作中,页面元素切换我这块涉及的主要有三种,一种是当前网页使用了frame框架,有的时候我们抓到元素后发现老是定位不到该元素,代码报错,这时候需要考虑当前网页是不是使用了frame框架,我是根据我需要定位的网页元素一步一步网上找,如果有相关的frame我们可以获取到frame然后使用
switchTo().frame 方法先切换到当前的frame,这样就可以对该frame上的元素进行操作。

还有就是有的时候,网页操作后会打开一个新的网页,我们需要进行页面的切换,使用
dr.getWindowHandles();//获取当前所有的句柄,存放在一个集合中,然后进行循环找出我们需要的窗口,并且切换到该窗口进行操作。

再就是弹出的一些javascript弹窗,我们可以使用switchTo().alert()切换到弹窗,然后进行操作。
我碰到的元素切换这一块大概就这些情况。
image.jpeg

image.jpeg

image.jpeg

下拉菜单怎么去操作?

下拉菜单得先定位到下拉菜单,然后获取下拉菜单的select对象。如果想选择某个选项的话,可以使用下标进行选择、或者文本值进行选择。
如果想随机进行选择,可以使用java提供的 Random对象随机一个下标出来,进行选择。
滚动条怎么去操作?
Selenium是可以使用javascript代码进行元素操作的,我们可以先获取javascript操作对象,再使用 window.scrollBy(0,2800)进行滚动条操作。
image.jpeg

怎么样模拟键盘操作?

键盘操作的话需要先获取到Action操作对象,再使用该对象调用sendkeys
进行操作,进行一连串的sendkeys操作后,在使用.perform()方法执行就好了。
image.jpeg

元素等待怎么有哪些?

有sleept 可以直接定义睡眠多少秒
有显式等待,可以定义网页上等待一个元素。比如有的网页刷新比较慢,我们可以使用显式等待等待该元素刷新出来。
还有隐式等待,他是针对于驱动对象设置的,可以设置该驱动对象驱动的所有的元素进行等待。
操作时间控件 和 通过js进行操作页面?
有的时候需要进行时间控件选择时间,最方便的办法是获取javascript操作对象,然后使用javascript定位到时间控件选择后的文本对象,再使用javascript更改value值。这样是最方便的。

测试登录时使用 tab和enter键进行登录
image.jpeg

附件:
常用API:
操作浏览器API
浏览器操作
image.jpeg

打开浏览器 driver.get()/driver.navigate().to(“http://localhost:8848/wemall/user/login.htm“);
获取标题 driver.getTitle()
获取当前URL地址:driver.getCurrentUrl()
刷新网页:driver.navigate().refresh();
网页回退:dr.navigate().back();
网页回退:dr.navigate().forward()
获取网页源代码:dr.getPageSource();
常见控件操作
image.jpeg

WebElement.sendKeys(“”) 输入内容
WebElement.click() 单击操作
WebElement.clear() 清除操作
WebElement.getText() 获取文本值
WebElement.getCssValue(“color”);//获取CSS的样式值
WebElement.getAttribute(“属性的KEY”)//获取标签的属性值,注意获取文本框输入 的文本值 用 getAttrivutte(“value”)

双击操作:

WebElement ipt = dr.findElement(By.id(“it”)); //获取元素对象
Actions builder = new Actions(dr);//获取 操作对象
builder.doubleClick(ipt).build().perform();//使用操作对象操作元素对象

悬停操作:

<1:获取对象WebElement wb1 = dr.findElement(By.xpath(“//a[contains(@onclick, ‘iphone5s’)]”));
<2: 获取元素的操作对象 Actions ac = new Actions(dr);
<3:ac.moveToElement(wb1).perform();//悬停操作

下拉菜单操作:

<`1:选择>
1、获取要操作的Select 对象
Select selectList = new Select(WebElement);
2、根据选项的文字定位元素:selectList.selectByVisibleText(“”);
3、根据元素value值定位元素:selectList.selectByValue(“”);
4、根据元素下标定位元素.selectByIndex( int index);
<2:获取当前被选择元素的文本值>

Select.selectList.getFirstSelectedOption().getText();

redio操作:
1、 选择 : redio.click();
2、 判断是否被选择:redio.isSelected()

操作滚动条:

1、调用executeScript进行执行javascript语句。
2、”window.scrollBy(0,3300)”) 代表往右拉0个像素,往下拉3300个像素
模拟 鼠标键盘操作:
image.jpeg

image.jpeg

怎么样判断是否跳转成功

image.jpeg

方法1:根据获取跳转后的网页源代码:查看他是否包含某些文本
String pageSource = dr.getPageSource();//获取网页源代码
Assert.assertTrue(pageSource.contains(“您好,欢迎来到wemall”));//判断是否包含特定的内容

方法2: 判断跳转后的某些元素是否存在

三种等待方式
image.jpeg

1、使用javaAPI进行等待:Thread.sleep(3000);
2、隐式等待:
dr.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
image.jpeg

3、显式等待:
1、获取wait对象WebDriverWait wait= new WebDriverWait(dr,10);
2、 调用wait.until方法进行等待特定的元素
image.jpeg

常见的问题解决

image.jpeg

1、 通过WebDriver打开的新窗口加载速度缓慢的问题,可以把当前本机的firefox配置获取并设置到 webDriver打开的firefox中。可以提高打开效率
image.jpeg

子主题 1
image.jpeg