找回密码
 立即注册
首页 业界区 业界 软件测试(三)

软件测试(三)

蔡如风 20 小时前
Web自动化测试

驱动


  • web系统的测试前提是需要打开浏览器,通过访问web服务器来对服务器界⾯进⾏⼀系列的操作。程序想要打开web浏览器就需要安装web驱动(即WebDriver),WebDriver以本地化⽅式驱动浏览器。
安装驱动管理


  • WebDriverManager是⼀个开源Java库,以完全⾃动化的⽅式对Selenium WebDriver所需的驱动程序(如chromedriver、geckodriver、msedgedriver等)进⾏管理(即下载、设置和维护),自版本5 WebDriverManager还提供了其他相关功能,如发现本地系统中安装的浏览器的能⼒,构建WebDriver对象(如ChromeDriver、FirefoxDriver、EdgeDriver等)
  1. <dependency>
  2. <groupId>io.github.bonigarcia</groupId>
  3. webdrivermanager</artifactId>
  4. <version>5.8.0</version>
  5. <scope>test</scope>
  6. </dependency>
复制代码
Selenium


  • selenium是⼀个web⾃动化测试⼯具,selenium中提供了丰富的⽅法供给使⽤者进⾏web⾃动化测试。
  • ⼀个简单的web⾃动化示例

  • 安装selenium库
  1. <dependency>
  2. <groupId>org.seleniumhq.selenium</groupId>
  3. selenium-java</artifactId>
  4. <version>4.0.0</version>
  5. </dependency>
复制代码

  • 使⽤selenium编写代码
  1. public void example_test()
  2. {
  3. //驱动程序管理的⾃动化
  4. WebDriverManager.chromedriver().setup();
  5. ChromeOptions options = new ChromeOptions();
  6. //允许访问所有链接
  7. options.addArguments("--remote-allow-origins=*");
  8. //1、打开浏览器
  9. WebDriver driver = new ChromeDriver(options);
  10. //2.输⼊百度⽹址:https://www.baidu.com
  11. driver.get("https://www.baidu.com");
  12. //3、找到输⼊框并输⼊“迪丽热巴”
  13. driver.findElement(By.xpath("//*[@id="kw"]")).sendKeys("迪丽热巴");
  14. //4、找到“百度⼀下”按钮并点击
  15. driver.findElement(By.xpath("//*[@id="su"]")).click();
  16. //5、关闭浏览器
  17. driver.quit();
  18. }
复制代码
selenium+驱动+浏览器的⼯作原理


  • 通过selenium编写的⾃动化脚本代码中在ChromeDriverService中创建⼀个服务
  • 通过创建好的服务打开webdriver,安装在本地的驱动服务IP为localhost,PORT为ChromeDriverService中创建的端⼝号,该服务地址为selenium向webdriver发送请求的服务地址。
  • 向浏览器驱动程序发送HTTP请求,浏览器驱动程序解析请求,打开浏览器,并获得sessionid,如果再次对浏览器操作需携带此id
  • 打开浏览器后,所有的selenium的操作(访问地址,查找元素等)均通过创建好的服务链接到webdriver,然后使⽤execute发送请求
  • 驱动收到请求并对请求进⾏解析,转成浏览器能够解析的脚本并发送给浏览器,浏览器通过请求的内容执⾏对应动作
  • 浏览器再把执⾏的动作结果通过浏览器驱动程序返回给测试脚本
⾃动化测试常⽤函数

元素的定位


  • web⾃动化测试的操作核心是能够找到⻚⾯对应的元素,然后才能对元素进⾏具体的操作。常见的元素定位方式⾮常多,如id,classname,tagname,xpath,cssSelector,常⽤的主要由cssSelector和xpath。
cssSelector


  • 选择器的功能:选中页面中指定的标签元素
  • 选择器的种类分为基础选择器和复合选择器,常见的元素定位⽅式可以通过id选择器和⼦类选择器来进行定位。
  • 获取“百度一下”的选择器示例:
    1.png

  • 校验是否是选择的元素,可以使用ctrl+F然后搜索刚才得到的元素
    2.png

xpath


  • XML路径语⾔,不仅可以在XML⽂件中查找信息,还可以在HTML中选取节点;xpath使⽤路径表达式来选择xml⽂档中的节点。
  • 举例:

    • 获取HTML⻚⾯所有的节点://*
    • 获取HTML⻚⾯指定的节点: //[指定节点]; 比如: //ul:获取HTML⻚⾯所有的ul节点
    • 获取⼀个节点中的直接⼦节点:/;比如://span/input,获取span节点下面的所有input节点
    • 获取⼀个节点的⽗节点:..;例如://input/..,获取input节点的⽗节点
    • 实现节点属性的匹配:[@...];例如://*[@id='kw']匹配HTML⻚⾯中id属性为kw的节点

操作测试对象


  • 点击/提交对象:click()
  1. //找到百度⼀下按钮并点击
  2. driver.findElement(By.cssSelector("#su")).click();
复制代码

  • 模拟按键输⼊:sendKeys("")
  1. driver.findElement(By.cssSelector("#kw")).sendKeys("输⼊⽂字");
复制代码

  • 清除⽂本内容:clear()
  1. driver.findElement(By.cssSelector("#kw")).sendKeys("我爱游戏");
  2. driver.findElement(By.cssSelector("#kw")).clear();
  3. driver.findElement(By.cssSelector("#kw")).sendKeys("我爱学习");
复制代码

  • 获取⽂本信息:getText()
  1. String bdtext = driver.findElement(By.xpath("//*[@id="title-content"]/span[1]")).getText();
  2. System.out.println("打印的内容是:"+bdtext);
复制代码

  • 获取当前⻚⾯标题:getTitle()
  • 获取当前⻚⾯URL:getCurrentUrl()
窗口操作


  • 当我们⼿⼯测试的时候,我们可以通过眼睛来判断当前的窗⼝是什么,但对于程序来说它是不知道当前最新的窗⼝应该是哪⼀个。对于程序来说它怎么来识别每⼀个窗⼝呢?每个浏览器窗⼝都有⼀个唯⼀的属性句柄(handle)来表⽰,我们就可以通过句柄来切换
切换窗⼝:


  • 获取当前⻚⾯句柄:driver.getWindowHandle();
  • 获取所有⻚⾯句柄:driver.getWindowHandles()
  • 切换当前句柄为最新⻚⾯:
  1. String curWindow = driver.getWindowHandle();
  2. Set<String> allWindow = driver.getWindowHandles();
  3. for( String w : allWindow){
  4. if(w!=curWindow){
  5. driver.switchTo().window(w);
  6. }
  7. }
复制代码
窗⼝设置大小


  • 窗⼝的大小
  1. //窗⼝最⼤化
  2. driver.manage().window().maximize();
  3. //窗⼝最⼩化
  4. driver.manage().window().minimize();
  5. //全屏窗⼝
  6. driver.manage().window().fullscreen();
  7. //⼿动设置窗⼝⼤⼩
  8. driver.manage().window().setSize(new Dimension(1024, 768));
复制代码
窗⼝切换
  1. //获取所有句柄 //获取当前停留⻚⾯句柄 String curWindow = driver.getWindowHandle();
  2. Set<String> allWindow = driver.getWindowHandles();
  3. for( String w : allWindow){
  4. if(w!=curWindow){
  5. driver.switchTo().window(w);
  6. }
  7. }
复制代码
屏幕截图


  • 导包
  1. <dependency>
  2. <groupId>commons-io</groupId>
  3. commons-io</artifactId>
  4. <version>2.6</version>
  5. </dependency>
复制代码
  1. File file = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
  2. FileUtils.copyFile(file,new File(filename));
复制代码

  • 代码示例:
  1. //简单版本
  2. File srcfile = driver.getScreenshotAs(OutputType.FILE);
  3. FileUtils.copyFile(srcfile,new File("my.png"));
  4. //⾼阶版本
  5. List<String> times = getTime();
  6. String filename ="./src/test/autotest-"+times.get(0)+"/"+str+"-
  7. "+times.get(1)+".png";
  8. File srcfile = driver.getScreenshotAs(OutputType.FILE);
  9. //把屏幕截图放到指定的路径下
  10. FileUtils.copyFile(srcfile,new File(filename));
复制代码
关闭窗⼝
  1. driver.close();
复制代码

  • 一旦窗口关闭,则需要重新对driver进行定义
等待


  • 通常代码执⾏的速度⽐⻚⾯渲染的速度要快,需要避免因为渲染过慢出现的自动化误报的问题,可以使⽤selenium中提供的三种等待⽅法。
强制等待
  1. Thread.sleep()
复制代码

  • 优点:使⽤简单,调试的时候⽐较有效
  • 缺点:影响运⾏效率,浪费⼤量的时间
隐式等待


  • 隐式等待是⼀种智能等待,他可以规定在查找元素时,在指定时间内不断查找元素。如果找到则代码继续执行,直到超时没找到元素才会报错。
  • implicitlyWait() 参数:Duration类中提供的毫秒、秒、分钟等方法。
  • 隐式等待作⽤域是整个脚本的所有元素。即只要driver对象没有被释放掉(driver.quit()),隐式等待就⼀直生效。
  1. //隐式等待1000毫秒
  2. driver.manage().timeouts().implicitlyWait(Duration.ofMillis(1000));
  3. //隐式等待5秒
  4. driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
复制代码

  • 优点:智能等待,作⽤于全局
显示等待


  • 显⽰等待也是⼀种智能等待,在指定超时时间范围内只要满⾜操作的条件就会继续执⾏后续代码
  1. WebDriverWait foo = new WebDriverWait(driver, Duration.ofSeconds(3))
  2. foo.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#id")));
复制代码

  • 优点:显⽰等待是智能等待,可以⾃定义显⽰等待的条件,操作灵活
  • 缺点:写法复杂
浏览器导航


  • 打开⽹站:
  1. // 更⻓的⽅法
  2. driver.navigate().to("https://selenium.dev");
  3. // 简洁的⽅法
  4. driver.get("https://selenium.dev");
复制代码

  • 浏览器的前进、后退、刷新
  1. driver.navigate().back();
  2. driver.navigate().forward();
  3. driver.navigate().refresh();
复制代码
弹窗


  • 弹窗是在⻚⾯是找不到任何元素的,对于这种情况需要使⽤selenium提供的Alert接⼝。
    3.png

  1. Alert alert = driver.switchTo.alert();
  2. //确认
  3. alert.accept()
  4. //取消
  5. alert.dismiss()
复制代码

  • 提示弹窗
    4.png

  1. Alert alert = driver.switchTo.alert();
  2. alert.sendKeys("hello");
  3. alert.accept();
  4. alert.dismiss();
复制代码
文件上传


  • 点击文件上传的场景下会弹窗系统窗⼝,进行⽂件的选择。selenium⽆法识别⾮web的控件,上传⽂件窗⼝为系统⾃带,无法识别窗⼝元素但是可以使⽤sendkeys来上传指定路径的⽂件,达到的效果是⼀样的。
  1. WebElement element = driver.findElement(By.cssSelector("body > div > div > input[type=file]"));
  2. element.sendKeys("D:\\selenium2html\\upload.html");
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册