快乐学习
前程无忧、中华英才非你莫属!

Selenium -Java项目实战总结和浓缩

 
一、软件测试的分类
 
单元测试对程序中的单个子程序测试的过程
 
集成测试通过单元模块组装成系统或子系统,再进行测试,重点是检查模块之间的接口是否正确。
 
系统测试针对整个产品系统进行的测试,验证系统是否满足了需求规格的定义。
 
验收测试确保软件准备就绪,向软件购买方展示该软件系统是否满足其用户的需求。
 
黑盒测试关心软件的输入数据和输出结果,不考虑内部逻辑结构,主要针对软件界面和软件功能进行测试。
 
白盒测试研究里面的源代码和程序执行结果,检验程序中的每条通路是否都能按预定要求正确工作,是否按照设计规格说明书的规定正常执行。
 
灰盒测试灰盒测试关注输出对于输入的正确性,同时也关注内部表现,但这种关注不象白盒那样详细、完整,只是通过一些表征性的现象、事件、标志来判断内部的运行状态。
 
功能测试检查实际的功能是否符合用户的需求
 
性能测试:通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。
 
时间性能:一个软件的响应时间,登陆所需的时间,一个交易所需要的时间。
 
空间性能: 软件运行时所消耗的系统资源,例如:CPU,内存,网络,带宽等资源。
 
手工测试:一个一个的去执行测试用例,通过键盘和鼠标模拟的输入一些参数,查看返回结果是否符合预期结果。
 
自动化测试:自动化测试是把以人为驱动的测试行为转换成机器执行的一种过程,在设计用例通过评审之后,由测试人员,根据测试用例描述的过程,一步一步执行测试。
                        得到实际结果与期望结果的比较。在此过程中,可以省时间和人力。
 
 
自动化测试又分为:功能测试与性能自动化测试。
 
 
冒烟:是指对一个新版本进行系统大规模的测试之前 ,验证一下软件的基本功能是否实现,是否具备可测试性。
 
随机测试:输入所有的测试数据都是随机生成的,目的是模拟用户的真实操作,发现一些边缘性的错误。
 
 
探索性测试:碰到问题,及时改变测试策略。是一种测试的思维技术,抛弃复杂的测试计划和测试用例过程。
 
安全测试:在产品开发基本完成到发布阶段,对产品进行检验它是否符合安全需求定义。

二、分层的自动化测试
 
1、ui测试  2、集成、接口 3、单元测试
 
 
 
 
 
单元测试:例如java里面的junit 和testng针对某个方法的测试。
集成、接口测试:例如Web Service技术对外提供的一个公共接口,需要通过Jmeter等工具进行测试,
ui自动化测试:例如我们不断重复的对一个表单提交,结果查询等功能进行测试,我们可以通过相应的自动化测试工具来模拟这些操作。从而解放重复的劳动。
UI层的自动化测试工具非常多,比较主流的QTP,RobotFrameWork,Selenium等。
什么样的项目适合自动化测试?
1、需求明确不会经常变动
2、每日项目 构建后的测试验证
3、比较频繁的回归测试
4、软件系统界面稳定,变动少
5、需要在多平台上运行相同的测试案例,组合遍历型的测试、大量的重复任务。
6、软件维护周期长
7、项目进度压力不太大,版本更新不是很频繁;
8、被测软件系统开发的比较规范,

三、Selenium 工具介绍
 
 
 
1、Selenium IDE 是嵌入到 Firefox 浏览器中的一个插件,实现简单的浏览器操作的录制与回放功能。
 
 
2、Selenium Grid 是一种自动化的测试辅助工具,Grid 通过利用现有的计算机基础设施,能加功能测试。利用 Grid,可以很方便地同时在多台机器上和异构环境中并行运行多个测试
 
3、Selenium RC 是 Selenium 家族的核心工具,Selenium RC 支持多种不同的语言编写自动化测试脚本,通过 Selenium RC 的服务器作为代理服务器去访问应用从而达到测试的目的
前端调试工具
1、FireBug 是 FireFox 浏览器下的一套开发类插件,相信很多同学对这款前端工具并不陌生。它集 HTML查看和编辑、Javascript 控制台、网络状况监视器、cookie 查看于一体,是开发 JavaScript、CSS、HTML和 Ajax 的得力助手。
 
2、FirePath 是 FireBug 插件扩展的一个开发工具,用来编辑、检查和生成的 XPath 1.0 表达式、CSS 3选择器以及 jQuery 选择器。可以快速度的帮助我们通过 xPath 和 CSS 来定位页面上的元素。

 
四、测试环境搭建
 
1、安装Selenium
 
     下载地址:http://docs.seleniumhq.org/downloa
 
      安装java 1.8、 下载idea
       安装selenium:因为之前做的自动化测试是移动端的用的appium,里面继承了Selenium的环境。所以我们的Selenium 的环境就有了。
 
2、编写第一个自动化脚本
WebDriver driver = new FirefoxDriver();
driver.get("http://www.baidu.com/");
WebElement txtbox=driver.findElement(By.id("kw"));
txtbox.sendKeys("selenium java");
WebElement btn=driver.findElement(By.id("su"));
btn.click();
driver.close();
 
不同的浏览器需要new不同的浏览器Driver,这个第一个脚本是火狐浏览器的driver叫FirefoxDriver,谷歌浏览器的ChromeDriver 和  IE的驱动器 InternetExplorerDriver。
 

五、Selenium  WebDriver  API
WebDriver 提供了八种元素定位方法
id
 name
 class name
 tag name
 link text
 partial link text
 xpath
 css selector
 
需要定位的html元素
 
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">
 
<a class="mnav" name="tjtrhao123" href="http://www.hao123.com">hao123</a>
 
<a class="mnav" name="tjlang" href="#">一个很长很长的文本链接</a>
具体针对html元素定位的方法
findElement(By.id("kw")
findElement(By.name("wd"))
findElement(By.className("s_ipt"))
findElement(By.tagName("input"))
findElement(By.linkText("hao123"))
findElement(By.partialLinkText("一个很长的"))
findElement(By.partialLinkText("文本链接"))
xpath绝对路径:
findElement(By.xpath("/html/body/div/div[2]/div/div/div/from/span/input"))
 
利用元素属性定位:
findElement(By.xpath("//input[@id='kw']")
 
css selector
通过 class 属性定
findElement(By.cssSelector(".s_ipt")
 
通过id属性定位:
findElement(By.cssSelector("#kw")

六、WebDriver 常用API 实战代码
@BeforeClass
public void setup() {
    File file = new File(System.getProperty("user.dir") + "\apk\chromedriver.exe");
    String filePath = file.getAbsolutePath();
    System.setProperty("webdriver.chrome.driver", filePath);
}
@Test //控制浏览器大小
public void one() {
    System.out.println("seting brwoser");
    WebDriver driver = new ChromeDriver();
    driver.manage().window().setSize(new Dimension(480, 800));
    driver.get("https://www.ztloo.com");
    driver.quit();
}
@Test //浏览器后退和前进
public void two() {
    WebDriver driver = new ChromeDriver();
    String firstUrl = "https://www.ztloo.com";
    System.out.printf("now accesss %s n", firstUrl);
    driver.get(firstUrl);
    System.out.printf("now accesss %s n", secondUrl);
    driver.get(secondUrl);
    System.out.printf("now back to %s n", firstUrl);
    driver.navigate().back();
    System.out.printf("forward to %s n", secondUrl);
    driver.navigate().forward();
    driver.quit();
}
@Test //登陆
public void three() {
    WebDriver driver = new ChromeDriver();
    driver.findElement(By.xpath("//*[@id="user_login"]")).sendKeys("testBoy");
    driver.findElement(By.xpath("//*[@id="user_pass"]")).sendKeys("ityige66");
    driver.findElement(By.xpath("//*[@id="wp-submit"]")).click();
    String username = driver.findElement(By.xpath("//*[@id="first_name"]")).getText();
    if (username.contains("IT一哥")) {
        System.out.println("登陆成功");
    } else {
        System.out.println("登陆失败");
      }
}
@Test //鼠标悬停
public void fore() {
    WebDriver driver = new ChromeDriver();
    driver.get("http://www.baidu.com");
    Actions action = new Actions(driver);
    action.clickAndHold(driver.findElement(By.linkText("设置"))).perform();
}
@Test //键盘操作
public void five() throws InterruptedException {
    WebDriver driver = new ChromeDriver();
    driver.get("http://www.baidu.com");
    WebElement input = driver.findElement(By.id("kw"));
    //输入框输入内容
    input.sendKeys("seleniumm");
    Thread.sleep(3000);
    //删除多输入的一个 m
    input.sendKeys(Keys.BACK_SPACE);
    Thread.sleep(3000);
    //输入空格键+“教程”
    input.sendKeys(Keys.SPACE);
    input.sendKeys("教程");
    Thread.sleep(3000);
    //ctrl+a 全选输入框内容
    input.sendKeys(Keys.CONTROL, "a");
    Thread.sleep(3000);
    //ctrl+x 剪切输入框内容
    input.sendKeys(Keys.CONTROL, "x");
    Thread.sleep(3000);
     //ctrl+v 粘贴内容到输入框
    input.sendKeys(Keys.CONTROL, "v");
    Thread.sleep(3000);
    //通过回车键盘来代替点击操作
    input.sendKeys(Keys.ENTER);
    driver.quit();
}
@Test //获取验证信息
public void six() {
    WebDriver driver = new ChromeDriver();
    driver.get("https://www.ztloo.com");
    System.out.println("Before login================");
    //获取当前的 title 和 url
    System.out.printf("title of current page is %sn", driver.getTitle());
    System.out.printf("url of current page is %sn", driver.getCurrentUrl());
}
@Test // 元素等待技术
public void seven() {
    WebDriver driver = new ChromeDriver();
    //页面加载超时时间设置为 5s
    driver.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS);
    driver.get("http://www.baidu.com/");
    //定位对象时给 10s 的时间, 如果 10s 内还定位不到则抛出异常
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    driver.findElement(By.id("kw")).sendKeys("selenium");
    //异步脚本的超时时间设置成 3s
    driver.manage().timeouts().setScriptTimeout(3, TimeUnit.SECONDS);
    driver.quit();
}
@Test //定位一组元素
public void nine() throws InterruptedException {
    WebDriver driver = new ChromeDriver();
    File file = new File(System.getProperty("user.dir") + "\apk\chekbox.html");
    String filePath = file.getAbsolutePath();
    driver.get(filePath);
    List<WebElement> inputs = driver.findElements(By.tagName("input"));
    for (WebElement checkbox : inputs) {
        String type = new String(checkbox.getAttribute("type"));
        if (type.equals("checkbox")) {
            checkbox.click();
        Thread.sleep(2000);
    }
    }
}
@Test //iframe 切换和操作跟webview的原理是一样的。
public void iframeTest() throws InterruptedException {
    WebDriver driver = new ChromeDriver();
    File file = new File(System.getProperty("user.dir") + "\apk\iframe.html");
    String filePath = file.getAbsolutePath();
    driver.get(filePath);
    //切换到 iframe(id = "if")
    driver.switchTo().frame("if");
    driver.findElement(By.id("kw")).sendKeys("webdriver");
    driver.findElement(By.id("su")).click();
    Thread.sleep(5000);
    driver.quit();
}
@Test //多窗口处理
public void windowscut() throws InterruptedException {
    WebDriver driver = new ChromeDriver();
    driver.get("https://www.baidu.com");
    //获得当前窗口句柄
    String sreach_handle = driver.getWindowHandle();
    //打开百度注册窗口
    System.out.println(sreach_handle);
    driver.findElement(By.linkText("登录")).click();
    Thread.sleep(3000);
    driver.findElement(By.linkText("立即注册")).click();
    //获得所有窗口句柄
    Set<String> handles = driver.getWindowHandles();
    //判断是否为注册窗口,并操作注册窗口上的元素
    for (String handle : handles) {
        if (handle.equals(sreach_handle) == false) {
        //切换到注册页面
        driver.switchTo().window(handle);
        System.out.println("now register window!");
    Thread.sleep(2000);
    driver.findElement(By.xpath("//*[@id="TANGRAM__PSP_3__userName"]")).sendKeys("zhangsan");
    Thread.sleep(2000);
    //关闭当前窗口
    driver.close();
}
}
    //判断是否为百度首页,并操作首页上的元素
    for (String handle : handles) {
        if (handle.equals(sreach_handle)) {
        //切换到注册页面
        driver.switchTo().window(handle);
        Thread.sleep(2000);
        driver.findElement(By.className("close-btn")).click();
        System.out.println("now baidu sreach page!");
        driver.findElement(By.id("kw")).sendKeys("webdriver");
        driver.findElement(By.id("su")).click();
        Thread.sleep(2000);
         }
    }
    driver.quit();
 }
@Test  // 处理触发式弹窗。
public void alertTest() throws InterruptedException {
    WebDriver driver = new ChromeDriver();
    driver.get("https://www.baidu.com");
    //鼠标悬停相“设置”链接
    Actions action = new Actions(driver);
    action.clickAndHold(driver.findElement(By.linkText("设置"))).perform();
    //打开搜索设置
    driver.findElement(By.className("setpref")).click();
    //保存设置,为了防止过快报错,休息2秒
    Thread.sleep(2000);
    driver.findElement(By.xpath("//*[@id="gxszButton"]/a[1]")).click();
    //接收弹窗。accept() 点击确认按钮。dismiss() 点击取消按钮,如果有的话
    driver.switchTo().alert().accept();
    driver.quit();
}
@Test  //上传文件
public void uploadTest() {
    WebDriver driver = new ChromeDriver();
    File file = new File(System.getProperty("user.dir") + "\apk\upload.html");
    String filePath = file.getAbsolutePath();
    driver.get(filePath);//定位上传按钮,添加本地文件
    driver.findElement(By.name("file")).sendKeys(filePath);
    driver.quit();
}
@Test //下载测试。
public void downLoad(){    
     FirefoxProfile firefoxProfile = new FirefoxProfile();
    firefoxProfile.setPreference("browser.download.folderList",2);
    firefoxProfile.setPreference("browser.download.manager.showWhenStarting", false);
    firefoxProfile.setPreference("browser.download.dir","c:\autotestAppium\apk");
    firefoxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk","application/octet-stream");
    FirefoxOptions options = new FirefoxOptions();
    options.setProfile(firefoxProfile);
    WebDriver driver = new FirefoxDriver(options);
    driver.findElement(By.xpath("//div[@id='download-button']/a")).click();
}
 
获得cookie
@Test 
public void cookieTest(){
WebDriver driver = new ChromeDriver();
driver.get("http://www.youdao.com");
//获得 cookie
Set<Cookie> coo = driver.manage().getCookies();
//打印 cookie
System.out.println(coo);
driver.quit();
}
 
WebDriver 操作 cookie 的方法有:
 
getCookies() 获得所有 cookie 信息
 
addCookie(cookie_dict) 添加 cookie,必须有 name 和 value 值
 
deleteAllCookies() 删除所有 cookie 信息
deleteCookieNamed(String name)。删除 name 这个 cookie
getCookieNamed(String name)。返回特定 name 的 cookie 值

调用JavaScript
WebDiver 不能操作本地 Windows 控件,但对于浏览器上的控件也不是都可以操作的。比哪浏览器上的滚动条,虽然 WebDriver 提供操作浏览器的前进和后退按钮,但对于滚动条并没有提供相应用的方法。
那么在这种情况下就可以借助 JavaScript 方法来控制浏览器滚动条。WebDriver 提供了 executeScript()方法来执行 JavaScript 代码
 
一般用到操作滚动条的会两个场景:
 注册时的法律条文的阅读,判断用户是否阅读完成的标准是:滚动条是否拉到最下方。
 要操作的页面元素不在视觉范围,无法进行操作,需要拖动滚动条
@Test
public void scroll() throws InterruptedException {
    WebDriver driver = new ChromeDriver();
    driver.get("http://www.baidu.com");
    driver.findElement(By.id("kw")).sendKeys("webdriver api");
    driver.findElement(By.id("su")).click();
    //将页面滚动条拖到底部
    ((JavascriptExecutor)driver).executeScript("document.documentElement.scrollTop=10000");
    Thread.sleep(3000);
    //#将页面滚动条拖到顶部
    ((JavascriptExecutor)driver).executeScript("document.documentElement.scrollTop=0");
    Thread.sleep(3000);
    System.out.println("end");
    driver.quit();
}
处理HTML5
@Test
public void testHtml5() throws InterruptedException {
    WebDriver driver = new ChromeDriver();
    driver.get("http://videojs.com/");
    WebElement video = driver.findElement(By.id("preview-player_html5_api"));
    JavascriptExecutor jse = (JavascriptExecutor)driver;
    //获得视屏的 URL
    jse.executeScript("return arguments[0].currentSrc;",video);
    //播放视屏,播放 15 秒钟
    jse.executeScript("return arguments[0].play()", video);
    Thread.sleep(15000);
    //暂停视屏
    jse.executeScript("arguments[0].pause()", video);
    driver.quit()
}
 
JavaScript 函数有个内置的对象 arguments 对象。argument 对象包含了函数调用的参数数组。
[0]表示取对象的第 1 个值。
currentSrc 熟悉返回当前音频/视频的 URL。如果未设置音频/视频,则返回空字符串。
 
load()、play()、pause() 等等控制着视频的加载,播放和暂停。

处理截图
@Test
public void jietu(){
    WebDriver driver = new ChromeDriver();
    driver.get("http://www.baidu.com");
    try {
        File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
        FileUtils.copyFile(srcFile,new File("d:\screenshot.png"));
    } catch (Exception e) {
        e.printStackTrace();
    }
    driver.quit();
}
 
在本例中用到了 Java 的异常处理,打开百度首页,执行 getScreenshotAs()对当前窗口进行截图,这里需要指定图片的保存路径及文件名,并且关闭当前驱动。
 
脚本运行完成打开 D 盘就可以找到 screenshot.png 图片文件了。
 
selenium 验证码处理
 
去掉验证码
这是最简单的方法,对于开发人员来说,只是把验证码的相关代码注释掉即可,如果是在测试环境,这样做可省去了测试人员不少麻烦,如果自动化脚本是要在正式环境跑,这样就给系统带来了一定的风险。
设置万能码
去掉验证码的主要是安全问题,为了应对在线系统的安全性威胁,可以在修改程序时不取消验证码,而是程序中留一个“后门”---设置一个“万能验证码”,只要用户输入这个“万能验证码”,程序就认为
验证通过,否则按照原先的验证方式进行验证。
 
验证码识别技术
 
例如可以通过 Python-tesseract 来识别图片验证码,Python-tesseract 是光学字符识别 Tesseract OCR 引擎的 Python 封装类。能够读取任何常规的图片文件(JPG, GIF ,PNG , TIFF 等)。
不过,目前市面上的验证码形式繁多,目前任何一种验证码识别技术,识别率都不是100%、
 
记录 cookie
 
通过向浏览器中添加 cookie 可以绕过登录的验证码,这是比较有意思的一种解决方案。
比如我们在第一次登录某网站可以勾选“记住密码”的选项,当下次再访问该网站时自动就处于登录状态了,这样其实也可以绕过验证码问题。
 
那么这个“记住密码”的功能其实就记在了浏览器的 cookie 中。前面已经学了通过
WebDriver 来操作浏览器的 Cookie,可以通过 add_cookie()方法将用户名密码写入浏览器 cookie ,再次访
问网站时服务器直接读取浏览器 Cookie 登录。
 
WebDriver 原理: WebDriver 是按照客户端--服务端的经典设计模式设计的。

七、图形化自动化语言SIKULI
7.1、什么是 Sikuli?  读音:西  库 丽
      它是一个图像识别,和控制GUI组件的一个图像处理的自动化ui自动化测试辅助技术库,它是一个麻省理工学院的一个研究项目。
7.2、安装教程:
2、jdk必备条件,
3、点击安装包:“ Sikuli X-1.0rc3(R905)-win32.exe”
4、在下载页面找到“Sikuli X R930 ” 连接,把这个 zip 类型的文件下载下来
5、sikuli-r930-win32.zip 解压,然后得到一个 SIKULI-IDE 的目录,把
SIKULI-IDE 目录下的所有文件替换 Sikuli X 下的所有文件。
7.3 优缺点
 
优点:
 
1、体积小,容易上手、对各种程序同样适用,一次编码处处运行。
2、可以不经过api编译,自动化搜索到任何屏幕上看到的东西
缺点:
1、图片的分辨率,色彩,尺寸,这些对程序有影响,,如果有两个相同的,无法区分具体时哪一个
2、sikuli 正处于开发阶段,有很多bug。
3、截图的话,会占用大量的磁盘空间
4、相似度调整,需要手动一个一个调整,工作量大。
5、测试报告的生成比较挫。
sikuli-script.jar 包
 
 
sikuli 也有个相对应的IDE,它可以完成一些常见的操作,单击、右击、移动到、拖动鼠标等操作。
下载 sikuli IDE 包:https://launchpad.net/sikuli/+downlo

 
 
八、Selenium数据驱动
 
 
数据驱动就是把输入的数据进行参数化,让其产生各种各样的结果,来验证功能的准确性和容错性。
 
通过读取的是数组、字典,又或者是 excel/csv、txt 文件。我们实现了数据与脚本的分离,换
句话说,我们实现了参数化。

九、关键字驱动
 
理解了数据驱动,无非是把“数据”换成“关键字”,通过关键字的改变引起测试结果的改变。
 
目前市面上已经存在了以关键字驱动的测试工具,QTP,RobotFrameWork工具为主。他们的原理也就是,封装了Selenium底层的代码。呈献给用户是excel表格的形式,来避免测试人员,对写代码的恐慌,从而降低脚本编写难度。
 
我们可以把Selenium ide 也可以看做是关键字驱动的自动化工具。这种关键字驱动的工具的缺点就是,不能实现selenium新版本的的新功能,如果由个性化需求,实现起来困难,工具报错基本上是无解。
数据驱动实例
把直接传到sendkeys里面方法里面的字符串文本,已变量的形式独立出来。
WebDriver driver = new ChromeDriver();
String username ="testBoy";
String password ="ityige666";
driver.findElement(By.xpath("//*[@id="user_login"]")).sendKeys(username);
driver.findElement(By.xpath("//*[@id="user_pass"]")).sendKeys(password);
读取文件实例
public static void baiduTest(String testdata) throws InterruptedException{
    File file = new File(System.getProperty("user.dir") + "\apk\chromedriver.exe");
    String filePath = file.getAbsolutePath();
    System.setProperty("webdriver.chrome.driver", filePath);
    WebDriver driver = new ChromeDriver();
    driver.get("http://www.baidu.com");
    driver.findElement(By.id("kw")).sendKeys(testdata);
    driver.findElement(By.id("su")).click();
    Thread.sleep(2000);
    driver.close();
}
public static void readTxtFile(String filePath){
    try {
       String encoding="GBK";
    File file=new File(filePath);
    if(file.isFile() && file.exists()){ //判断文件是否存在
        InputStreamReader read = new InputStreamReader(
        new FileInputStream(file),encoding);//考虑到编码格式
        BufferedReader bufferedReader = new BufferedReader(read);
        String lineTxt = null;
    while((lineTxt = bufferedReader.readLine()) != null){
        System.out.println(lineTxt);
        baiduTest(lineTxt); //调用 baiduTest 方法
    }
    read.close();
    }else{
        System.out.println("找不到指定的文件");
    }
    } catch (Exception e) {
        System.out.println("读取文件内容出错");
    e.printStackTrace();
    }
    }
public static void main(String[] args) {
    String filePath = "c:\autotestAppium\apk\baiduData.txt"; //指定测试文件的目录
    readTxtFile(filePath);
}
 
读取csv文件
for(int row=0;row<csvList.size();row++){
String cell = csvList.get(row)[1]; //取得第 row 行第 1 列的数据
System.out.println(cell);
}
public static void readCsvFile(String filePath) throws IOException {
    ArrayList<String[]> csvList = new ArrayList<String[]>(); //用来保存数据
    //一般用这编码读就可以了
    CsvReader reader = new CsvReader(filePath,',', Charset.forName("SJIS"));
    reader.readHeaders(); // 跳过表头 如果需要表头的话,不要写这句。
    while(reader.readRecord()){ //逐行读入除表头的数据
        csvList.add(reader.getValues());
    }
    reader.close();
    for(int row=0;row<csvList.size();row++){
        System.out.println(csvList.get(row)[0]); //name
        System.out.println(csvList.get(row)[1]); //email
        System.out.println(csvList.get(row)[2]); //age
        System.out.println(csvList.get(row)[3]); //sex
        System.out.println("------------"); //分割线
    }
}
public static void main(String[] args) throws IOException {
    String filePath = "c:\autotestAppium\apk\hello.csv"; //指定测试文件的目录
    // readTxtFile(filePath);
    readCsvFile(filePath);
}

十、TestNG详解
事实上,是 TestNG 在 Java 编程中率先实现了利用注释进行测试,这使它成为 JUnit 的有力竞争对
手。JUnit 4.0 发布时才实现的注释
testng.xml 文件
具体教程

 
十一、自动化测试项目实战
自动化测试用例选型注意事项:
1、 不是所有的手工用例都要转为自动化测试用例。
 
2、 考虑到脚本开发的成本,不要选择流程太复杂的用例。如果有必要,可以考虑把流程拆分多个
用例来实现脚本。
 
3、 选择的用例最好可以构建成场景。例如一个功能模块,分 n 个用例,这 n 个用例使用同一个场
景。这样的好处在于方便构建关键字测试模型。
 
4、 选择的用例可以带有目的性,例如这部分用例是用例做冒烟测试,那部分是回归测试等,当然,
会存在重叠的关系。如果当前用例不能满足需求,那么唯有修改用例来适应脚本和需求。
 
5、 选取的用例可以是你认为是重复执行,很繁琐的部分,例如字段验证,提示信息验证这类。这
部分适用回归测试。
 
6、 选取的用例可以是主体流程,这部分适用冒烟测试。
 
7、 自动化测试也可以用来做配置检查,数据库检查。这些可能超越了手工用例,但是也算用例拓
展的一部分。项目负责人可以有选择地增加。
 
8、 如果平时在手工测试时,需要构造一些复杂数据,或重复一些简单机械式动作,告诉自动化脚
本,让他来帮你。或许你的效率因此又提高了
自动化测试的类型:
1、测试链接    2、功能测试     3、测试动态元素    4、Ajax 的测试
什么是动态元素?
例如,有些 Web 服务器可能在一个页面实例
上命名所显示的文件为 doc3861,并在其他页面实例上显示为 doc6148,
Ajax 是一种支持动态改变用户界面元素的技术。检查局部刷新的数据正确性等。
同乐学堂登陆案例实战
将测试用例分为动作、数据和验证点几个部分,动作用于描述要如何操作;数据是这一步操作所用到
的数据,验证点是这一步操作完成需要验证的信息。这种形式的自动化测试用例看上去更像关键字驱动的
脚本。优点是可以清晰的根据用例来实现自化测试脚本。
同乐学堂项目登陆实战:
@Test //登陆
public void three() {
    WebDriver driver = new ChromeDriver();
    driver.findElement(By.xpath("//*[@id="user_login"]")).sendKeys("testBoy");
    driver.findElement(By.xpath("//*[@id="user_pass"]")).sendKeys("ityige66");
    if (driver.getPageSource().contains("证明您的身份")) {
        String yzm = driver.findElement(By.xpath("//*[@id="loginform"]/div")).getText()
        System.out.println(yzm);
}
    driver.findElement(By.xpath("//*[@id="wp-submit"]")).click();
    String username = driver.findElement(By.xpath("//*[@id="first_name"]")).getText();
    if (username.contains("IT一哥")) {
        System.out.println("登陆成功");
    } else {
        System.out.println("登陆失败");
}
}
Selenium Grid 工作原理
Selenium Grid 是用于设计帮助我们进行分布式测试的工具,其整个结构是由一个 hub 节点和若干个
代理节点组成。
Selenium WebDriver 支持的所有驱动
PhantomJS 是一个拥有 JavaScript API 的无界面 WebKit。正如你所知道的,这个无界面的浏览器,一般用于爬虫等领域。
 
PhantomJS 支持 Windwos、MAC、Linux 等平台,我们可以根据
自己的环境选择相应的版本进行下载。
WebDriver driver = new PhantomJSDriver();
其他操作不变。
Page Object 设计模式
它是一种页面对象设计模式,
它的优点:
1、减少了代码的重复  2、让测试更具可读性。  3、提高了测试的可维护性用来应对各种变化的功能需求。
pageobject 实战案例
页面对象
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
public class ZtlooLogin {
private static WebElement element = null;
public static WebElement login_UserName(WebDriver driver){
element = driver.findElement(By.xpath("//*[@id="user_login"]"));
return element;
}
public static WebElement login_Password(WebDriver driver){
element = driver.findElement(By.xpath("//*[@id="user_pass"]"));
return element;
}
public static WebElement login_Button(WebDriver driver){
element = driver.findElement(By.xpath("//*[@id="wp-submit"]"));
return element;
}
}
实际操作类
public class ZtloologinAction {
private static WebDriver driver = null;
public static void Login(WebDriver driver,String username,String password){
ZtlooLogin.login_UserName(driver).sendKeys(username);
ZtlooLogin.login_Password(driver).sendKeys(password);
ZtlooLogin.login_Button(driver).click();
}
public static void main(String[] args) throws InterruptedException {
File file = new File(System.getProperty("user.dir") + "\apk\chromedriver.exe");
String filePath = file.getAbsolutePath();
System.setProperty("webdriver.chrome.driver", filePath);
driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
Login(driver,"testBoy","ityige66");
Thread.sleep(5000);
driver.quit();
System.out.println("test case run end!");
}
}
Git项目管理
1、git是什么?
    Git 是一个开源的分布式版本控制系统,用以有效、高速的处理从很小到非常大的项目版本管理。
2、为什么要使用版本控制系统?
    为了防止一些app,web系统在开发的新版本功能时候,出现严重bug,可以进行回滚到上个版本。
3、git环境配置
4、git常用命令
git clone  克隆远程仓库里的项目到本地。
git pull  从其他版本库的代码更新到本地
git commit :提交当前工作空间的修改内容。
git push :将本地的代码更新到    远程版本库当中。
git revert:还原一个版本的修改,执行一个版本号。
git branch:对分支的增、删、查等操作,例如'git branch new_branch'会从当前的工作版本创建一个叫做new_branch的新分支
git checkout:Git的checkout有两个作用,其一是在不同的branch之间进行切换,例如'git checkout new_branch'就会切换到new_branch的分支上去;另一个功能是还原代码的作用。
 
 
 
持续集成
 
 
持续集成是一种软件开发实践,即团队开发成员经常
集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通
过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽快地发现集成错误。许多团队发现这个
过程可以大大减少集成的问题,让团队能够更快的开发内聚的软件。
 
 
持续集成
 
持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。
价值:
1、减少风险
2、减少重复过程
3、任何时间、任何地点生成可部署的软件
4、增强项目的可见性
5、建立团队对开发产品的信心
 
 
声明如下此篇文章属于作者的读书笔记,书籍来源于虫师的Selenium2  java实战项目书籍。
 

打赏
赞(0) 打赏
未经允许不得转载:同乐学堂 » Selenium -Java项目实战总结和浓缩

特别的技术,给特别的你!

联系QQ:1071235258QQ群:710045715

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏

error: Sorry,暂时内容不可复制!