网站开发要用到的工具,公司网站开发创业,wordpress页面怎么编辑器,网站服务费怎么做分录文章目录 自动化测试单元测试#xff1a;单元测试#xff1a;UI自动化 selenium工具定义特点#xff1a;原理#xff1a;seleniumjava环境搭建SeleniumAPI获取测试结果#xff1a;添加等待浏览器操作键盘事件鼠标事件多层框架/窗口定位下拉框处理弹窗处理上传文件操作关闭… 文章目录 自动化测试单元测试单元测试UI自动化 selenium工具定义特点原理seleniumjava环境搭建SeleniumAPI获取测试结果添加等待浏览器操作键盘事件鼠标事件多层框架/窗口定位下拉框处理弹窗处理上传文件操作关闭浏览器窗口的切换截图 自动化测试
自动化测试指软件测试的自动化在预设状态下运行应用程序或者系统预设条件包括正常和异常最后评估运行结果。将人为驱动的测试行为转化为机器代码执行的过程。简单而言其实就是降低重复性的工作大部分是Python
自动化测试的具体实现应该是包含下面七个过程的。
分析总体把握系统逻辑分析出系统的核心体系架构。设计设计测试用例测试用例要足够明确和清晰覆盖面广而精实现实现脚本有两个要求一是断言二是合理的运用参数化。执行执行脚本远远没有我们想象中那么简单。脚本执行过程中的异常需要我们仔细的去分析原因。总结测试结果的分析和测试过程的总结是自动化测试的关键。维护自动化测试脚本的维护是一个难以解决但又必须要解决的问题。分析在自动化测试过程中深刻的分析自动化用例的覆盖风险和脚本维护的成本。 自动化的分类单元测试接口测试UI自动化测试
单元测试
最大的投入应该在单元测试上单元测试运行的频率也更加高。
单元测试
接口测试就是API测试相对于UI自动化API自动化更加容易实现执行起来也更稳定。 接口自动化的有以下特点
可在产品前期接口完成后介入用例维护量小适合接口变动较小界面变动频繁的项目
常见的接口自动化测试工具有RobotFrameworkJMeterSoapUITestNGHttpClientPostman等。
UI自动化
虽然测试金字塔告诉我们尽量多做API层的自动化测试但是UI层的自动化测试更加贴近用户的需求和软件系统的实际业务。并且有时候我们不得不进行UI层的测试。 UI自动化的特点
用例维护量大页面相关性强必须后期项目页面开发完成后介入UI测试适合与界面变动较小的项目
UI层的测试框架比较多比如Windows客户端测试的AutoITweb测试的selenium以及TestPlanteggPlantRobot frameworkQTP等
selenium工具
定义
selenium是用来做web自动化测试框架。
特点
兼容各种浏览器支持各种平台支持各种语言小巧对于不同的语言它只是一个包而已而QTP 需要下载安装1个多G 的程序有丰富的API支持分布式测试用例的执行可以把测试用例分布到不同的测试机器执行相当于分 发机的功能。
原理 自动化脚本通过编写代码 webDriver需要我们去下载 浏览器edge浏览器Chrome浏览器
seleniumjava环境搭建
浏览器这里用Chrome浏览器官网下载注意自己浏览器的版本在浏览器关于里查看下载与之对应的浏览器驱动webDirver官网下载将压缩包解压后驱动放入java安装的jdk中 打开idea创建项目导入依赖pom dependencygroupIdorg.seleniumhq.selenium/groupIdartifactIdselenium-java/artifactIdversion3.141.59/version/dependency创建测试化代码
public class Main {public static void main(String[] args) {ChromeOptions optionsnew ChromeOptions();//允许所有的请求options.addArguments(--remote--allow-origin*);WebDriver webDrivernew ChromeDriver(options);//打开一个网页webDriver.get(https://www.baidu.com);}
}运行代码 此时环境就配好了
SeleniumAPI
webdriver 提供了一系列的对象定位方法常用的有以下几种
idnameclass namelink textpartiallink texttag namexpathcss selector
这里的重点是cssxpath public class Main {public static void main(String[] args) {ChromeOptions optionsnew ChromeOptions();options.addArguments(--remote--allow-origin*);WebDriver webDrivernew ChromeDriver(options);webDriver.get(https://www.baidu.com);//找到百度搜索框// WebElement element webDriver.findElement(By.cssSelector(.s_ipt));WebElement elementwebDriver.findElement(By.xpath(//*[id\kw\]));//输入一个软件测试element.sendKeys(软件测试);}
}定位元素findElementcss
css选择语法 id选择器#id 类选择.class 标签选择器标签名 后代选择器父级选择器子级选择器 xPath 绝对路径从根目录出发寻找 相对路径常用
1. 相对路径索引//from/span[2]/input
2. 相对路径属性//input[classs_ipt]
3. 相对路径通配符//*[*s_ipt]
4. 相对路径文本匹配//a[text()新闻]获取测试结果
public class Main {public static void main(String[] args) throws InterruptedException {int flag0;ChromeOptions optionsnew ChromeOptions();options.addArguments(--remote--allow-origin*);WebDriver webDrivernew ChromeDriver(options);webDriver.get(https://www.baidu.com);//找到百度搜索框// WebElement element webDriver.findElement(By.cssSelector(.s_ipt));WebElement elementwebDriver.findElement(By.xpath(//*[id\kw\]));//输入一个软件测试element.sendKeys(软件测试);//点击一下百度按钮webDriver.findElement(By.cssSelector(#su)).click();sleep(3000);//校验//找到搜索结果ListWebElement elements webDriver.findElements(By.cssSelector(a em));for (int i0;ielements.size();i){if (!elements.get(i).getText().equals(测试)){flag1;System.out.println(测试通过);break;}}if (flag0){System.out.println(测试不通过);}}
}webdriver 中比较常用的操作对象的方法有下面几个
click 点击对象sendKeys 在对象上模拟按键输入clear 清除对象输入的文本内容submit 提交必须from标签中不然会报错text 用于获取元素的文本信息getAttribute 获取控件中的属性值 private static void test02() {ChromeOptions optionsnew ChromeOptions();options.addArguments(--remote--allow-origin*);WebDriver webDrivernew ChromeDriver(options);webDriver.get(https://www.baidu.com);String button_valuewebDriver.findElement(By.cssSelector(#su)).getAttribute(value);if (button_value.equals(百度一下)){System.out.println(测试通过);}else {System.out.println(button_value);System.out.println(测试不通过);}}添加等待
sleep休眠添加休眠非常简单我们需要引入time 包就可以在脚本中自由的添加休眠时间了这里的休眠指固定休眠
隐式等待通过添加implicitlyWait() 方法就可以方便的实现智能等待implicitlyWait(30)的用法比time.sleep()更智能后者只能选择一个固定的时间的等待前者可以在一个时间范围内智能的等待
private static void test02() {ChromeOptions optionsnew ChromeOptions();options.addArguments(--remote--allow-origin*);WebDriver webDrivernew ChromeDriver(options);webDriver.get(https://www.baidu.com);String button_valuewebDriver.findElement(By.cssSelector(#su)).getAttribute(value);//隐式等待webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.DAYS);if (button_value.equals(百度一下)){System.out.println(测试通过);}else {System.out.println(button_value);System.out.println(测试不通过);}}隐式地等待并非一个固定的等待时间当脚本执行到某个元素定位时如果元素可以定位则继续执行如果元素定位不到则它以轮询的方式不断的判断元素是否被定位到。直到超出设置的时长。
显示等待 private static void test02() {ChromeOptions optionsnew ChromeOptions();options.addArguments(--remote--allow-origin*);WebDriver webDrivernew ChromeDriver(options);webDriver.get(https://www.baidu.com);String button_valuewebDriver.findElement(By.cssSelector(#su)).getAttribute(value);
// webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.DAYS);WebDriverWait wait new WebDriverWait(webDriver,3000);wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector(#help a:nth-child(1))));}隐式等待和显示等待区别 显示等待可以针对某一个地方进行等待 隐式等待对全局进行等待
浏览器操作
浏览器前进浏览器退后 private static void test03() {ChromeOptions optionsnew ChromeOptions();options.addArguments(--remote--allow-origin*);WebDriver webDrivernew ChromeDriver(options);webDriver.get(https://www.baidu.com);webDriver.findElement(By.cssSelector(#kw)).sendKeys(521);webDriver.findElement(By.cssSelector(#su)).click();//浏览器后退webDriver.navigate().back();//浏览器前进webDriver.navigate().forward();//浏览器刷新webDriver.navigate().refresh();}浏览器滚动条 #将浏览器滚动条滑到最顶端 document.documentElement.scrollTop0 #将浏览器滚动条滑到最底端 document.documentElement.scrollTop10000 #将浏览器滚动条滑到最底端 示例 ((JavascriptExecutor)webDriver).executeScript(“document.documentElement.scrollTop10000”); 其中executeScript(script, *args)在当前窗口/框架同步执行javaScript private static void test03() {ChromeOptions optionsnew ChromeOptions();options.addArguments(--remote--allow-origin*);WebDriver webDrivernew ChromeDriver(options);webDriver.get(https://www.baidu.com);webDriver.findElement(By.cssSelector(#kw)).sendKeys(521);webDriver.findElement(By.cssSelector(#su)).click();//浏览器后退webDriver.navigate().back();//浏览器前进webDriver.navigate().forward();//浏览器刷新webDriver.navigate().refresh();//滑动((JavascriptExecutor)webDriver).executeScript(document.documentElement.scrollTop10000);}设置浏览器宽、高
webDriver.manage().window().setSize(new Dimension(1000,1000));浏览器最大化 webDriver.manage().window().maximize();浏览器全屏
webDriver.manage().window().fullscreen();键盘事件 要使用键盘按键必须引入keys 包 通过send_keys()调用按键 sendkeys(Keys.TAB) # TAB sendkeys(Keys.ENTER) # 回车 sendkeys(Keys.SPACE) #空格键 sendkeys(Keys.ESCAPE) #回退键Esc 键盘组合键用法 sendkeys(Keys.CONTROL,‘a’) #全选CtrlA sendkeys(Keys.CONTROL,‘c’) #复制CtrlC sendkeys(Keys.CONTROL,‘x’) #剪贴CtrlX sendkeys(Keys.CONTROL,‘v’) #粘贴CtrlV webDriver.findElement(By.cssSelector(#kw)).sendKeys(Keys.CONTROL,A);鼠标事件 Actions(driver) 生成用户的行为。所有的行动都存储在actionchains 对象。通过perform()存储的行为。 move_to_element(element) 移动鼠标到一个元素中menu 上面已经定义了他所指向的哪一个元素 perform() 执行所有存储的行为: Actions类 contextClick() 右击doubleClick() 双击dragAndDrop() 拖动moveToElement() 移动 private static void test05() throws InterruptedException {ChromeOptions optionsnew ChromeOptions();options.addArguments(--remote--allow-origin*);WebDriver webDrivernew ChromeDriver(options);webDriver.get(https://www.baidu.com);WebElement webElementwebDriver.findElement(By.cssSelector(#kw));Actions actionsnew Actions(webDriver);sleep(3000);actions.moveToElement(webElement).contextClick().perform();}多层框架/窗口定位
获取框架 对于一个web 应用经常会出现框架frame 或窗口window的应用这也就给我们的定位带来了一定的困难。 通过frame的id或者name或者frame自带的其它属性来定位框架这里switchTo.frame()把当前定位的主体切换了frame里。
窗口定位 有可能嵌套的不是框架而是窗口还有真对窗口的方法switchTo.window用法与switchTo.frame 相同。
下拉框处理
下拉框是我们最常见的一种页面元素对于一般的元素我们只需要一次就定位但下拉框里的内容需要进行两次定位先定位到下拉框对下拉框进行操作后再定位到下拉框内里的选项。 private static void test06() {WebDriver webDrivernew ChromeDriver();webDriver.get(https://www.baidu.com);WebElement webElementwebDriver.findElement(By.cssSelector(#ShippingMethod));Select selectnew Select(webElement);//通过下标选择select.selectByIndex(3);select.selectByValue(12.5);}弹窗处理
alert、confirm、prompt 的处理
text 返回alert/confirm/prompt 中的文字信息accept 点击确认按钮dismiss 点击取消按钮如果有的话send_keys 输入值如果alert 没有对话框就不能用了不然会报错 private static void test07() throws InterruptedException {WebDriver webDrivernew ChromeDriver();webDriver.get(https://www.baidu.com);webDriver.findElement(By.cssSelector(button)).click();sleep(3000);//alert弹窗取消webDriver.switchTo().alert().dismiss();//点击按钮webDriver.findElement(By.cssSelector(button)).click();//在alert弹窗内输入值webDriver.switchTo().alert().sendKeys(123456);//alert弹窗确认webDriver.switchTo().alert().accept();}上传文件操作
上传过程一般要打开一个本地窗口从窗口选择本地文件添加。所以一般会卡在如何操作本地窗口添加上传文件。
在selenium webdriver 没我们想的那么复杂只要定位上传按钮通过sendKeys 添加本地文件路径就可以了。绝对路径和相对路径都可以关键是上传的文件存在。
private static void test08() {WebDriver webDrivernew ChromeDriver();webDriver.get(https://www.baidu.com);webDriver.findElement(By.cssSelector(input)).sendKeys(本地文件目录);}关闭浏览器
浏览器的quit和close之间的区别
quit关闭了整个浏览器close关闭当前的页面。quit清空了浏览器的缓存close不会清空缓存。 private static void test09() {WebDriver webDrivernew ChromeDriver();webDriver.get(https://www.baidu.com);webDriver.findElement(By.cssSelector(#help a:nth-child(1)));//关闭webDriver.quit();webDriver.close();}窗口的切换
getWindowHandle 方法获取当前 private static void test11() throws InterruptedException {WebDriver webDrivernew ChromeDriver();webDriver.get(https://www.baidu.com);webDriver.findElement(By.cssSelector(#help a:nth-child(1))).click();sleep(3000);//通过这个方法getWindowHandle获取当前的窗口句柄//通过这个方法getWindowHandles获取所有的窗口句柄SetString handles webDriver.getWindowHandles();String target_handle;for ( String handle:handles){target_handlehandle;}webDriver.switchTo().window(target_handle);sleep(3000);webDriver.findElement(By.cssSelector(#ww)).sendKeys(新闻联播);webDriver.findElement(By.cssSelector(#s_btn_wr)).click();}截图
导入依赖进入Maven仓库
!-- https://mvnrepository.com/artifact/commons-io/commons-io --
dependencygroupIdcommons-io/groupIdartifactIdcommons-io/artifactIdversion2.11.0/version
/dependency private static void test12() throws InterruptedException, IOException {WebDriver webDrivernew ChromeDriver();webDriver.get(https://www.baidu.com);webDriver.findElement(By.cssSelector(#kw)).sendKeys(测试);webDriver.findElement(By.cssSelector(#su)).click();sleep(3000);File file((TakesScreenshot)(webDriver)).getScreenshotAs(OutputType.FILE);FileUtils.copyFile(file,new File(D://20231022.png));}需要向上转型TakesScreenshot然后调用getScreenshotAs方法