自动化测试培训.ppt_第1页
自动化测试培训.ppt_第2页
自动化测试培训.ppt_第3页
自动化测试培训.ppt_第4页
自动化测试培训.ppt_第5页
已阅读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语句后面输入 or1 1 就可以不输入任何password进行攻击SELECTcount FROMusersWHEREusername a or a a ANDpassword a or a a 解决方案 1 转义敏感字符及字符串 SQL的敏感字符包括 Union cmd 0 x 和 空格 2 屏蔽出错信息 阻止攻击者知道攻击的结果3 在服务端正式处理之前提交数据的合法性 数据类型 数据长度 敏感字符的校验 从测试人员的角度来讲 在程序开发前 即需求阶段 我们就应该有意识的将安全性检查应用到需求测试中 例如对一个表单需求进行检查时 我们一般检验以下几项安全性问题 1 需求中应说明表单中某一FIELD的类型 长度 以及取值范围 主要作用就是禁止输入敏感字符 2 需求中应说明如果超出表单规定的类型 长度 以及取值范围的 应用程序应给出不包含任何代码或数据库信息的错误提示 目录遍历 举例 那现在把这个 改装一下 限制Web应用在服务器上的运行 格设定WEB服务器的目录访问权限 进行严格的输入验证 控制用户输入非法路径 如在每个目录访问时有index htm 缓冲区溢出 缓存溢出 Bufferoverflow 是指在存在缓存溢出安全漏洞的计算机中 攻击者可以用超出常规长度的字符数来填满一个域 通常是内存区地址 在某些情况下 这些过量的字符能够作为 可执行 代码来运行 从而使得攻击者可以不受安全措施的约束来控制被攻击的计算机 用户使用缓冲区溢出来破坏web应用程序的栈 通过发送特别编写的代码到web程序中 攻击者可以让web应用程序来执行任意代码WEB服务器没有对用户提交的超长请求没有进行合适的处理 这种请求可能包括超长URL 超长HTTPHeader域 或者是其它超长的数据不安全的存储 上传没有做过滤如何测试 没有加密关键数据例 view source http地址可以查看源代码在页面输入密码 页面显示的是 右键 查看源不恰当的异常处理分析 程序在抛出异常的时候给出了比较详细的内部错误信息 暴露了不应该显示的执行细节 网站存在潜在漏洞 文件就可以看见刚才输入的密码 APPScan配置要求 IBMAPPScan APPScan安装破解 由于新版7 8以前的产品的旧格式 lic 许可证可以继续用于新版本的APPSCAN所以可以使用以下方法进行破解 解压AppScan7 8破解 rar你会看到 patch exekeygen exe如果没有看到keygen exe那肯定被你的杀毒软件给干了 解压之前一定要关掉所有杀毒的 包括关闭自动防护 第一步 打开patch exe 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 lib dt jar JAVA HOME lib tools jarJAVA HOME C ProgramFiles Java jdk1 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 ProgramFiles MozillaFirefox firefox exe WebDriverdr newFirefoxDriver 打开指定路径的firefox 方法2FilepathToFirefoxBinary newFile D ProgramFiles MozillaFirefox firefox exe FirefoxBinaryfirefoxbin newFirefoxBinary pathToFirefoxBinary WebDriverdriver1 newFirefoxDriver firefoxbin null B ie 打开ieWebDriverie driver newInternetExplorerDriver C chrome因为ChromeDriver是Chromium项目自己支持和维护的 所以你必需另外下载chromedriver exe 放在目录下C WINDOWS system32下载地址 打开chromeWebDriverdriver newChromeDriver 另一种启动chrome的方法wiki介绍 打开chromeSystem setProperty webdriver chrome driver D chromedriver exe System setProperty webdriver chrome bin C DocumentsandSettings fy LocalSettings ApplicationData Google Chrome Application chrome 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 By name passwd 4 1 3ByXPATH或通过xpath查找 WebElementelement driver findElement By xpath input id 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 test uploadfile media ads test 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 By name source WebElementtarget driver findElement By name 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 input id 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 table class InputTB tbody tr 1 td 2 span input 1 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 http 192 168 83 130 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 network proxy type 1 firefoxProfile setPreference network proxy http yourProxy firefoxProfile setPreference network proxy http port yourPort firefoxProfile setPreference network proxy 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 arguments 0 click webElement 如果网站使用了JQuery的动画效果 我们在运行测试的时候其实可以disableJQuery的animation 一方面可以加快测试的速度 另一方面可以加强测试的稳定性 如果启用了Animation 使用WebDriver驱动浏览器时可能会出现一些无法预料的异常 JavascriptExecutor driver executeScript jQuery fx off true 由于WebDriver要驱动浏览器 所以测试运行的时间比较长 我们可以并行跑测试以节省时间 如果你使用的是maven构建工具 可以配置surefireplugin时 在configruation节点加入以下配置 classes3false 一些经验5 当进行了一些操作发生页面跳转时 最好加一个Wait方法等待pageload完成再进行后续操作 方法是在某个时间段内判断document readyState是不是complete protectedFunctionisPageLoaded returnnewFunction OverridepublicBooleanapply WebDriverdriver return JavascriptExecutor driver executeScript returndocument readyState equals complete publicvoidwaitForPageLoad WebDriverWaitwait newWebDriverWait webDriver 30 wait until isPageLoaded 一些经验6 如果页面有Ajax操作 需要写一个Wait方法等待Ajax操作完成 方式与上一条中的基本相同 比如一个Ajax操作是用于

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论