




已阅读5页,还剩75页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
AutomationTestTraining,刘万红2015-08-15,课程安排,目标一,本次培训目标:了解Selenium基本框架结构具备自动化测试思想会搭建自动化测试环境了解selenium常用API了解自动化测试开展过程中的注意事项,目标二,能够在原有框架基础上进行二次开发(框架升级维护和使用)具备安全性测试思想了解常见安全性问题类型原理会使用APPScan进行代码扫描并提交分析报告测试管理流程Q/A,大纲一,自动化测试行业现状自动化测试投入产出分析什么时候开展自动化测试自动化测试最新的发展技术自动化测试工具比较自动化测试环境搭建Selenium框架介绍Xpath基础介绍,大纲二,小工具介绍Firebug/xpather/iedeveloperSelenium常用API现有框架详细解析自动化测试开展过程中的注意事项实战-搭建本公司自动化测试框架安全性测试介绍APPScan使用介绍测试管理流程,测试流程,发布流程:FAT-UAT-点火堡垒测试(smoking)-Baking(灰度)-Rolling(Prod),质量报告,SecurityTestTraining,2014重大安全事故,2014年2月比特币交易站受攻击破产2014年4月中国快递1400万信息泄露2014年5月22日,eBay要求近1.28亿活跃用户全部重新设置2014年9月,大约有500万谷歌的账户和密码的数据库被泄露密2014年12月25日,乌云漏洞报告平台报告称,大量12306用户数据在互联网疯传,内容包括用户帐号、明文密码、身份证号码、手机号码和电子邮箱等码,安全测试,测试经理以及领导对安全测试要足够重视安全测试也要有测试计划安全测试是一个体系,需要从需求/设计/开发规范/编码到测试一起努力。从测试的角度,必须有部分手工安全性验证的case,有必要在发布之前建立安全checklist代码扫描只是安全测试的一部分工作开发团队要有专人解决安全性问题,安全测试case分层,从测试工程师角度去设计Testcase:应用程序安全测试(密码/权限划分/超时/代码扫描)操作系统安全测试(帐号/文件服务/日志)数据库安全测试(账户/口令/IP限制/定期备份/演练方案)服务器安全测试(日志/补丁/身份验证/超时设置/跳板机)网络环境安全测试(防火墙/网段/异地备份),安全性测试,常见安全问题类型CSRF(Cross-siterequestforgery),跨站请求伪造XSS又叫CSS(CrossSiteScript),跨站脚本攻击SQLInjection(SQL注入)传输中与存储时的密码没有加密,不安全的通信目录遍历缓冲区溢出,CSRF,跨站请求伪造(英语:Cross-siterequestforgery),也被称为one-clickattack或者sessionriding,通常缩写为CSRF或者XSRF,是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。跟跨网站脚本(XSS)相比,XSS利用的是用户对指定网站的信任,CSRF利用的是网站对用户网页浏览器的信任敏感页面要采用https访问不要选择记住密码,XSS,XSS又叫CSS(CrossSiteScript),跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意脚本代码,当用户浏览该页之时,嵌入其中Web里面的脚本代码会被执行,从而达到恶意攻击用户的特殊目的。最常见就是钓鱼网站(在有漏洞的正规网站上嵌入登陆框套取账户和密码)测试方法:在输入框中输入下列字符,可直接输入脚本来看HTML标签:转义字符:”.在输入或输出时对其进行字符过滤或转义处理,SQLInjection,SQL注入是描述一个利用写入特殊SQL程序码攻击应用程序的动作,用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据.只要是带有参数的动态网页且此网页访问了数据库,那么就有可能存在SQL注入例:一个验证用户登陆的页面,如果使用的sql语句为:Select*fromtableAwhereusername+username+andpassword.则在Sql语句后面输入or11就可以不输入任何password进行攻击SELECTcount(*)FROMusersWHEREusername=aora=aANDpassword=aora=a解决方案:1、转义敏感字符及字符串,SQL的敏感字符包括:”Union”,”cmd”,”+”,”/”,”.”,”;”,”,”-”,”%”,”0 x”,”patch-Cannotfindthefile.Searchthefile?-是-(AppScan安装目录下)选中engine_control.dll-OK第二步:打开keygen.exe-在第一个框TeamEDGE输入随便输入如:keygen-Generate-当前目录生成license.lic第三步:将自动生成的license.lic复制到APPSCAN的安装目录下。第四步:打开APPSCAN程序,单击帮助-许可证-装入旧格式(.lic)许可证,APPScan扫描原理一,APPScan扫描原理二,执行扫描的原理,APPScan工作流程,APPScan工作流程,界面介绍,实例1,实例2,实例3,实例4,实例5,在执行Web安全扫描任务的过程中,您可以随时查看已经检测出的Web安全问题。扫描专家评估完成后,会显示所建议的配置更改核实表。这里要注意的是:如果存在用户输入的APPSCAN无法执行的更改,那么它们的复选框会显示成灰色且为未选中状态,如果要修改这些更改,单击更改的链接,实例6,实例7,实例8,AutomationTestTraining,自动化测试项目要素,投入产出迭代速度工具选择环境搭建,代码管理开发周期难点解决后期维护,自动化测试工作开展,如何在项目中快速开展自动化测试?团队(知识结构,性格,职业发展)Troubleshooter,Teamlead流程(目标,代码,环境)为什么目标很重要?技术(语言,框架,工具)如何选择?,自动化测试工具,Watij/Selenium/WebdirverQTP/Winrunner/AutorunnerRobotiumAppiumLoadrunner,UI自动化API自动化Mobile自动化分层自动化概念:,UI自动化测试工具比较,Watij:开源,只支持IE浏览器,对象识别完全开发,只自持B/S结构,上手需要一定代码基础QTP:商用,单机license5000美金,Vbscript语言,可以录制,支持IE和firefox,上手容易,支持CS结构。但是对象识别不透明,脚本复用性差Webdirver:开源,支持IE/Firefox/Chrome浏览器,对象识别完全开发,只支持B/S结构,需要一定代码基础,Selenium自学的迷惑,selenium的projects包含如下几个方面:1.SeleniumIDE、2.SeleniumRemoteControl、3.SeleniumGrid、4.SeleniumWebDriver1.SeleniumIDE作为Firefox上的一个插件,提供录制功能,个人观点,如果能手写代码,就不要用这个东西。2.SeleniumRemoteControl是一个客户端/服务器系统,可以在本地或在其他电脑上控制Web浏览器,使用几乎任何编程语言和测试框架。3.SeleniumGrid可以远程的控制到并在多个服务器上同时运行测试4.SeleniumWebDriver可以在本地或远程计算机上的驱动浏览器,初识Webdriver,自动化测试思想,Case层:Case层是一个个完整的测试案例,是自动化测试中最小的执行单元;Flow层:Flow层是对测试所执行的操作的抽象,每一个测试案例都是由一系列的测试操作组合而成,Flow层为Case层提供了可组合的操作集;Page层:Page层是对系统中页面的抽象,Flow层是一系列对于页面或者页面上数据的操作的组合。Page层为Flow层提供了可操作的页面集合;Data层:Data层是对页面上可操作的数据的抽象,为Flow层提供了页面上可操作数据的集合;Element层:Element是页面上的IE控件的抽象,每一个Page都是由这些IE空间组合而成,Element层为Page层提供了IE控件的集合;XML文件:XML文件的作用是为Data层提供测试所需数据;,框架介绍一,框架介绍二,框架介绍三,Resultcheck,CaseExecute,脚本运行,脚本运行单个测试脚本执行:单个执行的时候使用了Junit执行,因此在创建时候需要添加Test标签,运行时选择Outline中的相应方法点击右键选择RunAsJunit;多脚本执行:在执行多个测试脚本的时候框架通过Ant触发TestDriver运行,要运行的Case集合配置与TestCaseList.xml文件中,TestCaseList.xml文件内容如下所示:NBUTest_001其中:指定了Fail的Case的执行次数,即Fail的case否则重新执行;指定了每个case的执行时间,如果Case执行超过这个时间将会终止该Case的执行;指定了运行的Case集合,如果testAll属性的值是Y则执行该Class下的标有Test标签的方法,如果是N则执行NBUTest_001中标识的方法。,TestNG配置批量执行case,1.安装TestNGeclipseplugin:Eclipse:Help-SoftwareUpdates-FindandInstall-Searchfornewfeaturestoinstall按NewRemoteSiteName:TestNGURL:然后安装即可2.接入,只需要导入importorg.testng.annotations.Test的Test,然后添加TestNG对应xml配置格式如下或者3.在xml右侧菜单运行选择runastestng就能运行对应的testsuite,如果需要不同的suite,只需要添加并配置xml。,环境搭建,测试环境的搭建代码管理开发平台Selenium2+Junit4+SVN+EclipseSelenium2+TestNG+SVN+Eclipse,seleniumJava环境搭建,安装jdk并配置环境变量jdk安装jdk需要1.6版本及以上的,安装目录为默认路径。jdk下载地址:环境变量配置CLASSPATH=.;%JAVA_HOME%libdt.jar;%JAVA_HOME%libtools.jarJAVA_HOME=C:ProgramFilesJavajdk1.6.0_10PATH=%JAVA_HOME%bin具体的操作步骤如下:,Webdriver对浏览器的支持,2.1HtmlUnitDriver优点:HtmlUnitDriver不会实际打开浏览器,运行速度很快。对于用FireFox等浏览器来做测试的自动化测试用例,运行速度通常很慢,HtmlUnitDriver无疑是可以很好地解决这个问题。缺点:它对JavaScript的支持不够好,当页面上有复杂JavaScript时,经常会捕获不到页面元素。使用:WebDriverdriver=newHtmlUnitDriver();2.2FireFoxDriver优点:FireFoxDirver对页面的自动化测试支持得比较好,很直观地模拟页面的操作,对JavaScript的支持也非常完善,基本上页面上做的所有操作FireFoxDriver都可以模拟。缺点:启动很慢,运行也比较慢,不过,启动之后Webdriver的操作速度虽然不快但还是可以接受的。使用:WebDriverdriver=newFirefoxDriver();2.3InternetExplorerDriver优点:直观地模拟用户的实际操作,对JavaScript提供完善的支持。缺点:是所有浏览器中运行速度最慢的,并且只能在Windows下运行,对CSS以及XPATH的支持也不够好。使用:WebDriverdriver=newInternetExplorerDriver();,对浏览器的简单操作一,A.firefox/打开默认路径的firefox(路径指的是firefox的安装路径)WebDriverdiver=newFirefoxDriver();/打开指定路径的firefox,方法1System.setProperty(webdriver.firefox.bin,D:ProgramFilesMozillaFirefoxfirefox.exe);WebDriverdr=newFirefoxDriver();/打开指定路径的firefox,方法2FilepathToFirefoxBinary=newFile(D:ProgramFilesMozillaFirefoxfirefox.exe);FirefoxBinaryfirefoxbin=newFirefoxBinary(pathToFirefoxBinary);WebDriverdriver1=newFirefoxDriver(firefoxbin,null);B.ie/打开ieWebDriverie_driver=newInternetExplorerDriver();,C.chrome因为ChromeDriver是Chromium项目自己支持和维护的,所以你必需另外下载chromedriver.exe,放在目录下C:WINDOWSsystem32下载地址:/打开chromeWebDriverdriver=newChromeDriver();另一种启动chrome的方法wiki介绍:/打开chromeSystem.setProperty(webdriver.chrome.driver,D:chromedriver.exe);System.setProperty(webdriver.chrome.bin,C:DocumentsandSettingsfyLocalSettings+ApplicationDataGoogleChromeApplicationchrome.exe);,对浏览器的简单操作二,最大化浏览器WebDriverdriver=newFirefoxDriver();driver.manage().window().maximize();Stringtitle=driver.getTitle();/得到当前页面urlStringcurrentUrl=driver.getCurrentUrl();getWindowHandle()返回当前的浏览器的窗口句柄getWindowHandles()返回当前的浏览器的所有窗口句柄getPageSource()返回当前页面的源码/Strings=driver.getPageSource();s=s.substring(s.indexOf(),s.indexOf();/System.out.println(当前页面的源码:+s);,3.2打开测试页面driver.get();driver.navigate().to(P.S.navigate方法会产生1个Navigator对象,其封装了与导航相关的一些方法,比如前进后退等3.3关闭浏览器测试完成后,需要关闭浏览器/Closethebrowserdriver.quit();3.4返回当前页面的url和title有时候我们需要返回当前页面的url或者title做一些验证性的操作等。代码如下:/得到titleStringtitle=driver.getTitle();/得到当前页面urlStringcurrentUrl=driver.getCurrentUrl();/输出title和currenturlSystem.out.println(title+n+currentUrl);,如何找到页面元素一,Webdriver的findElement方法可以用来找到页面的某个元素,最常用的方法是用id和name查找。几种比较常用的方法。4.1.1ByID假设页面写成这样:那么可以这样找到页面的元素:通过id查找:WebElementelement=driver.findElement(By.id(passwd-id);4.1.2ByName或通过name查找:WebElementelement=driver.findElement(B(passwd);4.1.3ByXPATH或通过xpath查找:WebElementelement=driver.findElement(By.xpath(/inputid=passwd-id);,4.1.4ByClassName假设页面写成这样:CheddarGouda可以通过这样查找页面元素:Listcheeses=driver.findElements(By.className(cheese);4.1.5ByLinkText假设页面元素写成这样:cheese那么可以通过这样查找:WebElementcheese=driver.findElement(By.linkText(cheese);,如何找到页面元素二,By.cssSelectorWebElementelement=driver.findElement(By.cssSelector(.input_class);By.partialLinkText:/这个方法就是模糊查询WebDriverdriver=newFirefoxDriver();driver.get(WebElementelement=driver.findElement(By.partialLinkText(hao);By.tagName:WebDriverdriver=newFirefoxDriver();driver.get(Stringtest=driver.findElement(By.tagName(form).getAttribute(name);System.out.println(test);,如何对页面元素进行操作一,输入框(textfieldortextarea)找到输入框元素:WebElementelement=driver.findElement(By.id(passwd-id);在输入框中输入内容:element.sendKeys(“test”);将输入框清空:element.clear();获取输入框的文本内容:element.getText();,下拉选择框(Select)找到下拉选择框的元素:Selectselect=newSelect(driver.findElement(By.id(select);选择对应的选择项:select.selectByVisibleText(“mediaAgencyA”);或select.selectByValue(“MA_ID_001”);不选择对应的选择项:select.deselectAll();select.deselectByValue(“MA_ID_001”);select.deselectByVisibleText(“mediaAgencyA”);或者获取选择项的值:select.getAllSelectedOptions();select.getFirstSelectedOption();,如何对页面元素进行操作二,单选项(RadioButton)找到单选框元素:WebElementbookMode=driver.findElement(By.id(BookMode);选择某个单选项:bookMode.click();清空某个单选项:bookMode.clear();判断某个单选项是否已经被选择:bookMode.isSelected();,多选项(checkbox)多选项的操作和单选的差不多:WebElementcheckbox=driver.findElement(By.id(myCheckbox.);checkbox.click();checkbox.clear();checkbox.isSelected();checkbox.isEnabled();按钮(button)找到按钮元素:WebElementsaveButton=driver.findElement(By.id(save);点击按钮:saveButton.click();判断按钮是否enable:saveButton.isEnabled();,如何对页面元素进行操作三,左右选择框也就是左边是可供选择项,选择后移动到右边的框中,反之亦然。例如:Selectlang=newSelect(driver.findElement(By.id(languages);lang.selectByVisibleText(“English”);WebElementaddLanguage=driver.findElement(By.id(addButton);addLanguage.click();弹出对话框(Popupdialogs)Alertalert=driver.switchTo().alert();alert.accept();alert.dismiss();alert.getText();,表单(Form)Form中的元素的操作和其它的元素操作一样,对元素操作完成后对表单的提交可以:WebElementapprove=driver.findElement(By.id(approve);approve.click();或approve.submit();/只适合于表单的提交上传文件(UploadFile)上传文件的元素操作:WebElementadFileUpload=driver.findElement(By.id(WAP-upload);StringfilePath=C:testuploadfilemedia_adstest.jpg;adFileUpload.sendKeys(filePath);,如何对页面元素进行操作四,Windows和Frames之间的切换一般来说,登录后建议是先:driver.switchTo().defaultContent();切换到某个frame:driver.switchTo().frame(leftFrame);从一个frame切换到另一个frame:driver.switchTo().frame(mainFrame);切换到某个window:driver.switchTo().window(windowName);,拖拉(DragandDrop)WebElementelement=driver.findElement(B(source);WebElementtarget=driver.findElement(B(target);(newActions(driver).dragAndDrop(element,target).perform();导航(NavigationandHistory)打开一个新的页面:driver.navigate().to();通过历史导航返回原页面:driver.navigate().forward();driver.navigate().back();,如何对页面元素进行操作五,调用JavaScriptWebdriver对JavaScript的调用是通过JavascriptExecutor来实现的,例如:JavascriptExecutorjs=(JavascriptExecutor)driver;js.executeScript(function()inventoryGridMgr.setTableFieldValue(+inventoryId+,+fieldName+,+value+);)();4.3.4Webdriver截图如果用webdriver截图是:driver=webdriver.Firefox()driver.save_screenshot(C:error.jpg),读取Cookies我们经常要对的值进行读取和设置。增加cookie:Cookiecookie=newCookie(key,value);driver.manage().addCookie(cookie);获取cookie的值:SetallCookies=driver.manage().getCookies();for(CookieloadedCookie:allCookies)System.out.println(String.format(%s-%s,loadedCookie.getName(),loadedCookie.getValue();根据某个cookie的name获取cookie的值:driver.manage().getCookieNamed(mmsid);删除cookie:driver.manage().deleteCookieNamed(CookieName);/ByCookiedriver.manage().deleteCookie(loadedCookie);/Orallofthemdriver.manage().deleteAllCookies();,如何对页面元素进行操作六,页面等待因为Load页面需要一段时间,如果页面还没加载完就查找元素,必然是查找不到的。最好的方式,就是设置一个默认等待时间,在查找页面元素的时候如果找不到就等待一段时间再找,直到超时。Webdriver提供两种方法,一种是显性等待,另一种是隐性等待。显性等待:WebDriverdriver=newFirefoxDriver();driver.get(http:/somedomain/url_that_delays_loading);WebElementmyDynamicElement=(newWebDriverWait(driver,10).until(newExpectedCondition()OverridepublicWebElementapply(WebDriverd)returnd.findElement(By.id(myDynamicElement););隐性等待:WebDriverdriver=newFirefoxDriver();driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS);driver.get(http:/somedomain/url_that_delays_loading);WebElementmyDynamicElement=driver.findElement(By.id(myDynamicElement);,元素实现的方法,给元素新增一个方法的流程,元素方法的具体实现,特殊Selectlist的处理,特殊Selectlist的处理二,对日期控件的处理,webdriver如何处理时间控件:1、使用比较普遍,也很通俗的方法先切换到时间控件的frame,再在frame中实现所要点击时间的操作2、使用js,实现把时间标签中的value属性赋值,这个值就是你想要选择的时间,注意时间格式;若改时间标签为只读,需要把只读限制去掉以下为代码:JavascriptExecutorremoveAttribute=(JavascriptExecutor)driver;/removereadonlyattributeremoveAttribute.executeScript(varsetDate=document.getElementById(train_date);setDate.removeAttribute(readonly););WebElementsetDatElement=driver.findElement(By.xpath(/inputid=train_date);setDatElement.clear();setDatElement.sendKeys(2015-02-18);,一些经验1,Frame处理:frame=ControllerChoose.getSpecificController().getSelectList(Finder.cssSelector,#iframeiframe);Objectframedriver=frame.switchToFrame();ReleasePoint=ControllerChoose.getSpecificController().getTextField(Finder.xpath,/tableclass=InputTB/tbody/tr1/td2/span/input1,framedriver);日历格处理:在page中定义Element为Date类型Plandate在case中引用该Element的方法:BacicInfo.getInstance().plandate.DateValueUIC1_executeJScript(2014-10-10);,一些经验2,3.打开多个Tab,返回到初始的driverSethandles=InitDriver.getWindowHandles();4.返回到指定url的driverInitDriver.SwitchToWindowByUrl(30/ropv2/ld_window/);5.Alert处理alert=ControllerChoose.getSpecificController().getAlertDialogue();/page中定义RollBackOperation.getInstance().alert.clickOK();/case中调用方法6.Select框处理VersionSelect=ControllerChoose.getSpecificController().getSelectList(Finder.id,“ContentPlaceHolder1_rptAppList_ddlVersion_0”);/page中定义RollBackOperation.getInstance().VersionSelect.selectValue(“v2”);/case中调用,一些经验3,WebDriver每次启动一个Firefox的实例时,会生成一个匿名的profile,并不会使用当前Firefox的profile。这点一定要注意。比如如果访问被测试的web服务需要通过代理,你想直接设置Firefox的代理是行不通的,因为WebDriver启动的Firefox实例并不会使用你这个profile,正确的做法是通过FirefoxProfile来设置。publicWebDrivercreate()FirefoxProfilefirefoxProfile=newFirefoxProfile();firefoxProfile.setPreference(xy.type,1);firefoxProfile.setPreference(xy.http,yourProxy);firefoxProfile.setPreference(xy.http_port,yourPort);firefoxProfile.setPreference(xy.no_proxies_on,);returnnewFirefoxDriver(firefoxProfile);通过FirefoProfile也可以设置Firefox其它各种配置。如果要默认给Firefox安装插件的话,可以将插件放置到Firefox安装目录下的默认的plugin文件夹中,这样即使是使用一个全新的profile也可以应用此plugin,一些经验4,使用WebDriver点击界面上Button元素时,如果当前Button元素被界面上其他元素遮住了,或没出现在界面中(比如Button在页面底部,但是屏幕只能显示页面上半部分),使用默认的WebElement.Click()可能会触发不了Click事件。修正方案是找到该页面元素后直接发送一条Click的JavaScript指令。(JavascriptExecutor)webDriver).executeScript(arguments0.click();,webElement);如果网站使用了JQuery的动画效果,我们在运行测试的时候其实可以disableJQuery的animation,一方面可以加快测试的速度,另一方面可以加强测试的稳定性(如果启用了Animation,使用WebDriver驱动浏览器时可能会出现一些无法预料的异常)。(JavascriptExecutor)driver).executeScript(jQuery.fx.off=true);由于WebDriver要驱动浏览器,所以测试运行的时间比较长,我们可以并行跑测试以节省时间。如果你使用的是maven构建工具,可以配置surefireplugin时,在configruation节点加入以下配置。classes3false,一些经验5,当进行了一些操作发生页面跳转时,最好加一个Wait方法等待pageload完成再进行后续操作。方法是在某个时间段内判断document.readyState是不是tectedFunctionisPageLoaded()returnnewFunction()OverridepublicBooleanapply(WebDriverdriver)return(JavascriptExecutor)driver).executeScript(returndocument.readyState).equals(complete);publicvoidwaitForPageLoad()WebDriverWaitwait=newWebDriverWait(webDriver,30);wait.until(isPageLoaded();,一些经验6,如果页面有Ajax操作,需要写一个Wait方法等待Ajax操作完成。方式与上一条中的基本相同。比如一个Ajax操作是用于向DropDownList中填充数据,则写一个方法判断该DropDownList中元素是否多余0个。privateFunctionhaveMoreThanOneOption(fi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 企业员工培训需求分析与计划制定
- 小学生朗读技巧培养方案设计
- 办公室常用合同文书模板合集
- 电气工程常用设备选型手册
- 道路运输驾驶员岗位安全知识考试题
- 三年级主题语文教案设计-海底世界专题
- 企业员工年度工作总结模板及范文
- 零售行业库存管理信息系统使用指南
- 宠物医院管理运营实务指南
- 企业内部控制制度建设及执行手册
- 律师调查报告委托合同9篇
- 2026年高考作文备考训练之“自我接纳-自我认知-自我超越”作文讲评
- 2025年河北石家庄交通投资发展集团有限责任公司公开招聘操作类工作人员336人考试参考题库及答案解析
- 幼儿园大班数学《小熊种玉米》课件
- 公交车广告承包合同5篇
- 2025年秋新北师大版数学3年级上册全册同步教案
- 公共营养师考试题库(附答案)四级真题及答案
- 基础观感验收自评报告
- 班级管理(第3版)教学课件汇总全套电子教案(完整版)
- 公路桥梁工程施工安全专项风险评估报告
- T∕ACSC 02-2022 中医医院建筑设计规范
评论
0/150
提交评论