软件测试项目实战第5版 课件 第六章自动化测试_第1页
软件测试项目实战第5版 课件 第六章自动化测试_第2页
软件测试项目实战第5版 课件 第六章自动化测试_第3页
软件测试项目实战第5版 课件 第六章自动化测试_第4页
软件测试项目实战第5版 课件 第六章自动化测试_第5页
已阅读5页,还剩105页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第六章自动化测试全面掌握Selenium自动化测试于艳华长春职业技术大学工作任务6.1知识储备自动化测试,顾名思义,就是利用一些工具或编程语言,通过录制或编程的方法,设定特定的测试场景,模拟用户业务使用流程,自动寻找缺陷。目前业内较为流行的商用自动化测试工具代表有HP公司的UnifiedFunctionTesting与IBM公司的RFT,开源自动化测试工具则以Selenium、Jmeter、Appium为代表。认识自动化测试的基本概念工作任务6.1知识储备工作任务6.1知识储备UnifiedFunctionTesting,简称UFT,提供符合所有主要应用软件环境的功能测试和回归测试的自动化测试,采用关键字驱动的理念简化测试用例创建和维护屏幕上的操作流程,自动生成功能测试或者回归测试用例。专业的测试者也。用户可直接录制可以通过提供的内置VBScript脚本和调试环境来自定义脚本执行过程。IBMRationalFunctionalTester,简称RFT,是一款先进的、自动化的功能和回归测试工具,适用于测试工程师和GUI开发工程师。测试新手可以简化复杂的测试任务,很快上手,测试专家能够通过选择工业标准化的脚本语言,实现各种高级定制功能。工作任务6.1知识储备Selenium,业内流行的开源Web自动化测试工具,直接运行在浏览器中,就像真正的用户在操作一样,支持的浏览器包括IE、Firefox、Chrome等。自动化测试的优点是能够快速回归、脚本重用,从而替代人的重复活动。回归测试阶段,可利用自动化测试工具进行,无须大量测试工程师手动执行测试用例,极大地提高了工作效率。当然,自动化测试的缺点也很明显,它们只能检查一些比较重要的问题,如崩溃、死机,却无法发现新的错误。另外,自动测试编写测试脚本工作量也很大,有时候该工作量甚至超过了手动测试的工作量。自动化测试不仅仅运用在系统测试层面,在单元测试、集成测试阶段同样可以使用自动化测试方法进行测试。此章节所述的自动化主要是指UI层面的自动化。工作任务6.1知识储备自动化测试在企业中基本是由专业的团队来实施的,自动化测试团队成员的技能要求一般要比普通的手工测试工程师的要求高,主要技能如下:①基本软件测试基本理论、设计方法、测试方法,熟悉软件测试流程。②熟悉相关编程语言。具体语言与工具有关,如UFT需要掌握VBScript,Selenium需要掌握Java或Python语言。③掌握一个比较流行的自动化测试工具,虽然掌握一个自动化工具不是必需的,但是建议初学者还是从一个工具入手。④熟悉被测对象的架构模型,了解数据库、接口、网络协议等方面的知识。⑤熟悉一些常见的自动化测试框架,比如数据驱动、关键字驱动。敏捷开发团队中要求测试工程师必须具备上述技能要求。工作任务6.2Selenium简介工作任务6.2Selenium简介1.简介Selenium是一个Web应用的自动化框架,主要应用于Web应用程序的自动化测试。通过它,测试工程师可以写出自动化程序,模拟人在浏览器里操作Web界面的过程。比如单击“界面”按钮、在文本框中输入文字等操作。2.Selenium的特点(1)开源免费:基于这点,能够吸引大部分公司愿意使用它来作为自动化测试的框架。(2)多浏览器支持:支持Chrome、Firefox、IE、Edge、Safari等浏览器。(3)多平台支持:支持Linux、Windows、Mac系统平台。(4)多语言支持:支持Java、Python、Ruby、JavaScript、C++等开发语言。(5)对Web页面有良好的支持。(6)简单、灵活:使用时调用的API简单,只需要使用开发语言导入调用即可。(7)支持分布式测试:使用SeleniumGrid。(8)支持录制、回放与脚本生成:使用SeleniumIDE。

工作任务6.2Selenium简介3.Selenium的历史版本Selenium经历了3个版本,Selenium1.X、Selenium2.X及目前的Selenium3.X。其中Selenium1.X与Selenium2.X最大的区别在于WebDriver。WebDriver曾经是Selenium的竞争对手,能弥补Selenium1.X存在的不足。而Selenium2.X则是Selenium与WebDriver两个项目的合并,也就是说,Selenium2.X=Selenium1.X+WebDriver。现在,使用最为广泛的是Selenium3.X,它最大的变化在于去掉了SeleniumRC。

工作任务6.2Selenium简介3.Selenium的历史版本Selenium经历了3个版本,Selenium1.X、Selenium2.X及目前的Selenium3.X。其中Selenium1.X与Selenium2.X最大的区别在于WebDriver。WebDriver曾经是Selenium的竞争对手,能弥补Selenium1.X存在的不足。而Selenium2.X则是Selenium与WebDriver两个项目的合并,也就是说,Selenium2.X=Selenium1.X+WebDriver。seleniumclient(Java等语言编写的自动化测试脚本)初始化一个Service服务,通过WebDriver启动浏览器驱动程序。通过RemoteWebDriver向浏览器驱动程序发送HTTP请求,浏览器驱动程序解析请求,打开浏览器,并获得SESSIONID,如果再次对浏览器操作需携带此id。打开浏览器,绑定特定的端口,把启动后的浏览器作为WebDriver的RemoteServer。打开浏览器后,所有的Selenium的操作(访问地址、查找元素等)均通过RemoteConnection链接到RemoteServer,然后使用execute调用_request方法通过urlib3向RemoteServer发送请求。工作任务6.2Selenium简介

浏览器通过请求的内容执行对应动作。浏览器再把执行的动作结果通过浏览器驱动程序返回给测试脚本。自动化脚本需要调用客户端库,在Python环境中安装Selenium库非常简单,使用pip安装Selenium即可。

现在,使用最为广泛的是Selenium3.X,它最大的变化在于去掉了SeleniumRC。脚本程序的自动化请求,都是通过客户端库里的API发送给浏览器驱动—WebDriver,再由WebDriver的,来实际执行浏览器的操作。比如,模拟用户单击“界面”按钮,自动化脚本作为客户端,调用客户端库内click()的方法,将“点击元素”的请求送到指定的浏览器驱动WebDriver,再由WebDriver将这个请求转发给浏览器。工作任务6.3环境搭建工作任务6.3环境搭建一、安装Python(1)双击下载的exe安装文件进行安装,如图6-2所示。按照图中加框区域进行设置,切记要勾选打钩的选项,如果不勾选,需要自己配置环境变量,勾选后自动配置环境变量。然后再单击“Customizeinstallation”(自定义安装)按钮进入下一步。工作任务6.3环境搭建(2)自定义安装后弹出如图6-3所示的安装界面,勾选所有的复选框,单击“Next”按钮。工作任务6.3环境搭建(3)弹出新的安装界面,如图6-4所示。界面中只勾选图中显示的复选框即可,我们可以通过单击“Browse”按钮进行自定义安装路径,也可以直接单击“Install”按钮进行安装。工作任务6.3环境搭建(4)安装完成后为了检查Python是否安装成功,可以在cmd命令窗口中输入Python进行查询,如果出现如图6-5所示的信息,则表示安装成功了。工作任务6.3环境搭建二、安装Selenium方法1:将下载好的文件进行解压,然后放置在Python安装目录下的\Lib\site-packages中方可使用。方法2:使用cmd命令进行在线安装Selenium,如图6-6所示。命令:pipinstallselenium==版本号说明:如果命令后面不加版本号,则默认下载最新的版本。工作任务6.3环境搭建安装完成如下命令后检查是否安装成功,如图6-7示。命令:pipshowselenium图6-7检查是否安装成功工作任务6.3环境搭建三、安装PyCharm(1)双击PyCharm安装包,弹出如图6-8所示界面,之后单击“Next”按钮。工作任务6.3环境搭建(2)选择安装路径(也可以使用默认路径),选择完成后,单击“Next”按钮,如图6-9所示。工作任务6.3环境搭建(3)选择相对应的系统和文件后缀名之后单击“Next”按钮工作任务6.3环境搭建(4)在开始安装界面单击“Install”按钮,进行安装工作任务6.3环境搭建(5)安装成功之后勾选复选框,单击“Finish”按钮,表示安装完成并运行PyCharm工作任务6.3环境搭建四、安装浏览器及相关驱动安装谷歌浏览器,并将谷歌浏览器驱动放置在Python安装文件的根目录下,如图所示。工作任务6.3环境搭建如图找到PyCharmCommunityEdition2022.2.2文件夹下的bin目录,运行pycharm64.exe打开PyCharm。工作任务6.3环境搭建进入到PyCharm后,点击NewProject创建一个新的工程,点击Previouslyconfiguredinterperte配置python指示器,点击AddInterpreter新建python指示器。工作任务6.3环境搭建在新弹出的页面选择Existing(现有的),点击路径打开选择py下的python.exe配置完成。选择完成后回到刚才的页面点击Create创建工程。

工作任务6.3环境搭建

进入到创建的工程中右键工程名,点击New,选择PythonFile创建一个新的python文件,接下来就可以编写第一个脚本了。

工作任务6.3环境搭建目前市面上主流的浏览器有Chrome、IE及Firefox等,本书使用Chrome作为测试浏览器。在学习如何使用Selenium开展Web自动化测试前,先熟悉下Selenium应用的基础知识。1.第一个脚本

fromtimeimportsleep

#从Selenium中引入WebDriver

fromseleniumimportwebdriver

#打开谷歌浏览器

driver=webdriver.Chrome()

#窗口最大化

driver.maximize_window()

#强制等待3秒

sleep(3)

#退出浏览器

driver.quit()工作任务6.3环境搭建2.浏览器常用操作(1)设置窗口大小如果打开的窗口不是全屏的,或者需要将窗口设为特定的大小,则可以使用maximize_window()和setwindow_size()进行调整。

#设置全屏

driver.maximize_window()

#设置固定分辨率大小

driver.set_window_size(800,600)工作任务6.3环境搭建(2)强制睡眠强制睡眠即强制等待,执行到该脚本时会等待几秒再继续执行脚本,强制等待需要先引入time下的sleep方法。

fromtimeimportsleep

sleep(3)工作任务6.3环境搭建(3)页面截屏测试执行过程中发现缺陷,需要截屏时,可利用get_screenshot_as_file()方法进行截屏,如:

driver.get_screenshot_as_file("d"\\test.jpg")工作任务6.3环境搭建((4)关闭窗口关闭窗口有两种方法:close、quit,当对象操作完成需要关闭窗口时,可使用close和quit。close:关闭当前窗口,可用于关闭某个具体窗口。

driver.close()quit:关闭所有与当前操作有关联的窗口,并退出驱动。需要释放资源时可使用此方法

driver.quit()工作任务6.4Web元素定位工作任务6.4Web元素定位6.4.1Web元素定位—id定位对于Web页面,id定位是最理想的定位方式,一般前端HTML代码都会尽量保证id的唯一性,如图6-14所示。

工作任务6.4Web元素定位find_element_by_id应用如下:

#find_element_by_id定位百度输入框

fromseleniumimportwebdriver#导入webdriver模块

fromtimeimportsleep#导入sleep模块,可以使程序强制休眠

driver=webdriver.Chrome()#打开Chrome浏览器

driver.get('')#打开百度网站

kw_element=driver.find_element_by_id("kw")#通过id属性定位到输入框

kw_element.send_keys("selenium")#向输入框输入"selenium"

sleep(3)#强制休眠3秒

driver.quit()#关闭浏览器

#find_element_by_id定位bing的搜索输入框

driver=webdriver.Chrome()#打开Chrome浏览器

driver.get('/')#打开bing

search_element=driver.find_element_by_id("sb_form_q")#通过id属性定位到搜索输入框

search_element.send_keys("自动化测试")#输入内容

sleep(3)#强制休眠3秒

driver.quit()#关闭浏览器

工作任务6.4Web元素定位6.4.2Web元素定位—name定位通过HTML代码中的name属性来定位元素。name属性的值有可能不是唯一的,这时,会找到多个元素,遇到此类情况,程序会优先选择第一个定位元素。find_element_by_name应用如下

#find_element_by_name定位百度输入框

fromseleniumimportwebdriver#导入webdriver模块

fromtimeimportsleep#导入sleep模块,可以使程序强制休眠

driver=webdriver.Chrome()#调用Chrome浏览器

driver.get('')#打开百度网站

kw_element=driver.find_element_by_name("wd")#通过name属性定位输入框

kw_element.send_keys("selenium")#向输入框输入"selenium"

sleep(3)#强制休眠3秒

driver.quit()#关闭浏览器

#find_element_by_name定位bing搜索输入框

driver=webdriver.Chrome()#调用Chrome浏览器

driver.get('/')#打开bing

driver.find_element_by_name("q").send_keys("python")#通过name属性定位必应搜索输入框,输入“python”

sleep(3)#强制休眠3秒

driver.quit()#关闭浏览器

工作任务6.4Web元素定位工作任务6.4Web元素定位6.4.2Web元素定位—name定位通过HTML代码中的name属性来定位元素。name属性的值有可能不是唯一的,这时,会找到多个元素,遇到此类情况,程序会优先选择第一个定位元素。find_element_by_name应用如下

#find_element_by_name定位百度输入框

fromseleniumimportwebdriver#导入webdriver模块

fromtimeimportsleep#导入sleep模块,可以使程序强制休眠

driver=webdriver.Chrome()#调用Chrome浏览器

driver.get('')#打开百度网站

kw_element=driver.find_element_by_name("wd")#通过name属性定位输入框

kw_element.send_keys("selenium")#向输入框输入"selenium"

sleep(3)#强制休眠3秒

driver.quit()#关闭浏览器

#find_element_by_name定位bing搜索输入框

driver=webdriver.Chrome()#调用Chrome浏览器

driver.get('/')#打开bing

driver.find_element_by_name("q").send_keys("python")#通过name属性定位必应搜索输入框,输入“python”

sleep(3)#强制休眠3秒

driver.quit()#关闭浏览器

工作任务6.4Web元素定位6.4.3Web元素定位—class定位通过HTML代码中的class属性来定位元素,如图所示。工作任务6.4Web元素定位一般不建议使用此定位方式,因为●class属性一般是不唯一的。●class属性存在复合类。以下这段class属性就是一个复合类,每个类用空格分隔,如果通过全匹配定位,程序会报错,如图所示。工作任务6.4Web元素定位#以下程序会报错

driver=webdriver.Chrome()#调用Chrome浏览器

driver.get('')#打开百度网站

kw_element=driver.find_element_by_class_name("btnself-btnbgs_btn")#通过class属性定位搜索按钮

kw_element.click()#单击搜索按钮

sleep(5)#强制休眠5秒

driver.quit()#关闭浏览器

#报错信息

#mon.exceptions.NoSuchElementException:

#Message:nosuchelement:Unabletolocateelement:

#{"method":"cssselector","selector":".btnself-btnbgs_btn"}一、find_element_by_class_name应用#find_element_by_class_name定位百度输入框

fromseleniumimportwebdriver#导入webdriver模块

fromtimeimportsleep#导入sleep模块,可以使程序强制休眠

工作任务6.4Web元素定位

driver=webdriver.Chrome()#调用Chrome浏览器

driver.get('')#打开百度网站

kw_element=driver.find_element_by_class_name("s_ipt")#通过class属性定位输入框

kw_element.send_keys("selenium")#向输入框写入"selenium"

sleep(3)#强制休眠3秒

driver.quit()#关闭浏览器

#find_element_by_class_name定位bing搜索输入框

driver=webdriver.Chrome()#调用Chrome浏览器

driver.get('/')#打开bing

search_element=driver.find_element_by_class_name("sb_form_q")#通过class属性定位到搜索输入框

search_element.send_keys("自动化测试")#输入内容

sleep(3)#强制休眠3秒

driver.quit()#关闭浏览器工作任务6.4Web元素定位6.4.4Web元素定位—link_text定位此定位方法只针对HTML中的“<a>…</a>”标签使用,一般会对应一个可跳转的链接,通过<a>标签中的内容定位元素,如图所示。

工作任务6.4Web元素定位find_element_by_link_text应用如下:#find_element_by_link_text单击“hao123”,跳转值hao123页面

fromseleniumimportwebdriver#导入WebDriver模块

fromtimeimportsleep#导入sleep模块,可以使程序强制休眠

driver=webdriver.Chrome()#调用Chrome浏览器

driver.get('')#打开百度网站

element=driver.find_element_by_link_text("hao123")#通过link_text定位

element.click()#点击

sleep(5)#强制休眠5秒

driver.quit()#关闭浏览器

#find_element_by_link_text单击豆瓣首页的“豆瓣同城”

driver=webdriver.Chrome()#调用Chrome浏览器

driver.get('/')#打开豆瓣

element1=driver.find_element_by_link_text("豆瓣同城")#通过link_text定位

element1.click()#单击

sleep(5)#强制休眠5秒

driver.quit()#关闭浏览器工作任务6.4Web元素定位6.4.5Web元素定位—partial_link_text定位partial_link_text同样也是针对HTML中的“<a>…</a>”标签使用的,与find_element_by_link_text的区别就是,它支持部分文字匹配,但必须是连续的文字,不能是间隔的文字。find_element_by_partial_link_text应用如下:

#find_element_by_partial_link_text单击“hao123”,跳转值hao123页面

fromseleniumimportwebdriver#导入WebDriver模块

fromtimeimportsleep#导入sleep模块,可以使程序强制休眠

driver=webdriver.Chrome()#调用Chrome浏览器

driver.get('')#打开百度网站

element=driver.find_element_by_partial_link_text("hao1")#通过partial_link_text定位,匹配开头

#element=driver.find_element_by_partial_link_text("ao123")#通过partial_link_text定位,匹配结尾

#element=driver.find_element_by_partial_link_text("ao12")#通过partial_link_text定位,匹配中间

element.click()#单击

sleep(5)#强制休眠5秒

#find_element_by_partial_link_text单击豆瓣首页的“豆瓣同城”

driver=webdriver.Chrome()#调用Chrome浏览器

driver.get('/')#打开豆瓣

element1=driver.find_element_by_partial_link_text("豆瓣同")#通过partial_link_text定位,匹配开头

#element1=driver.find_element_by_partial_link_text("瓣同城")#通过partial_link_text定位,匹配结尾

#element1=driver.find_element_by_partial_link_text("瓣同")#通过partial_link_text定位,匹配中间

element1.click()#单击

sleep(5)#强制休眠5秒工作任务6.4Web元素定位6.4.6Web元素定位—css_selector定位

关于页面元素定位,可以根据

id、class、name属性及link_text来定位。其中id属性是最理想的定位方式。但是,如果要定位的元素没有上述属性,或者通过上述属性可以找到多个元素,该怎么办?

Selenium提供了两种可以唯一定位的方式:find_element_by_css_selectorfind_element_by_xpathHTML中经常要为页面上的元素指定显示效果,比如前景文字颜色是红色,背景颜色是黑色,字体是微软雅黑,输入框的宽与高等。以上这一切,都是靠CSS来告诉浏览器的:要选择哪些元素,显示什么样的风格。工作任务6.4Web元素定位关于页面元下面介绍find_element_by_css_selector的应用。如图6-19所示,豆瓣首页上“登录豆瓣”按钮的显示效果,就是CSS告诉浏览器的:.account-anonymous.account-form-field-submit.btn这个按钮,背景颜色是浅绿色,高为34px等。工作任务6.4Web元素定位关于页面元其中,“.account-anonymous.account-form-field-submit.btn”就是css_selector,也称为CSS选择器。css_selector语法就是用来选择元素的。既然css_selector语法天生就是浏览器用来选择元素的,Selenium自然就可以将它运用到自动化测试中,来定位要操作的元素。只要css_selector的语法是正确的,Selenium就可以定位到指定的元素。我们可以通过Chrome浏览器直接复制css_selector。步骤一:将光标放到要选择的元素位置,右击,选择“检查”选项,如图工作任务6.4Web元素定位关于页面元步骤二:右击有蓝色阴影的代码,选择“Copy”选项,再选择“Copyselector”选项,如图fromseleniumimportwebdriver

driver=webdriver.Chrome()

driver.get("")

#根据id定位输入框并输入“python”

driver.find_element_by_id("kw").send_keys("python")

#根据CSS定位“百度一下”的按钮,并单击

driver.find_element_by_css_selector("#su").click()工作任务6.4Web元素定位关于页面元6.4.7Web元素定位—XPath定位Selenium提供的另一种能够唯一定位的方式为find_element_by_xpath。XPath(XMLPathLanguage)是由国际标准化组织W3C制定的,用来在XML和HTML文档中选择节点的语言。目前主流浏览器(Chrome、Firefox、Edge、Safari)都支持XPath语法。下面介绍find_element_by_xpath的应用。我们可以通过Chrome浏览器直接复制XPath。将光标放到要选择的元素位置,右击选择“检查”选项,如图6-20所示。右击有蓝色阴影的代码,选择“Copy”选项,再选择“CopyXPath”选项,如图所示。fromseleniumimportwebdriver

driver=webdriver.Chrome()

driver.get("")

#根据id定位输入框并输入“python”

driver.find_element_by_id("kw").send_keys("python")

#根据XPath定位“百度一下”按钮,并单击

driver.find_element_by_xpath('//*[@id="su"]').click()工作任务6.4Web元素定位关于页面元6.4.8Web元素定位—tag_name定位tag_name就是标签名,这种方法就是通过标签名进行定位的,如图所示。工作任务6.4Web元素定位关于页面元1.find_element_by_tag_name应用fromseleniumimportwebdriver

driver=webdriver.Chrome()

driver.get("/")

#根据tag_name定位输入框并输入“python”

driver.find_element_by_tag_name("input").send_keys("python")2.find_elements_by_tag_name复数应用fromseleniumimportwebdriver

driver=webdriver.Chrome()

driver.get("/")

#根据tag_name定位输入框并输入“python”,[]内从0开始,代表该页面的第几个标签,[0]就是第一个input标签

driver.find_elements_by_tag_name("input")[0].send_keys("python")工作任务6.5鼠标操作Selenium针对鼠标操作,如鼠标的单击、双击、右击、拖曳等操作,封装了ActionChains类。模拟鼠标操作时,需事先导入ActionChains类。#导入ActionChains类frommon.action_chainsimportActionChains#单击鼠标左键click(on_element=None)#单击鼠标左键,不松开click_and_hold(on_element=None)#单击鼠标右键context_click(on_element=None)#双击鼠标左键double_click(on_element=None)工作任务6.5鼠标操作#拖曳某个元素然后松开drag_and_drop(source,target)#拖曳某个坐标然后松开drag_and_drop_by_offset(source,xoffset,yoffset)#鼠标从当前位置移动到某个坐标move_by_offset(xoffset,yoffset)#鼠标移动到某个元素move_to_element(to_element)#移动到距某个元素(左上角坐标)多少距离的位置move_to_element_with_offset(to_element,xoffset,yoffset)#执行链中的所有动作perform()#在某个元素位置松开鼠标左键release(on_element=None)工作任务6.6键盘操作Selenium针对键盘操作,如键盘输入、回车、回退、空格、Ctrl等操作,封装了Keys类。模拟键盘操作时,需事先导入Keys类。#导入Keys类frommon.keysimportKeys#按下某个键盘上的键key_down(value,element=None)#松开某个键key_up(value,element=None)#发送某个键到当前焦点的元素send_keys(*keys_to_send)#发送某个键到指定元素send_keys_to_element(element,*keys_to_send)工作任务6.7Selenium3种等待方式加入等待时间,主要是考虑到网页加载需要时间,可能由于网速慢,或者使用了Ajax技术实现了异步加载等,如果程序找不到指定的页面元素,就会导致报错发生。常用的有以下3种等待方式。6.7.1强制等待使用Python自身的库time.sleep()可以实现强制等待。强制等待使用较简单,但是,当网络条件良好的时候,建议减少使用,因为如果频繁使用强制等待的方式等待元素加载,会导致整个项目的自动化时间延长。这种等待方式的使用场景主要是脚本调试。工作任务6.7Selenium3种等待方式6.7.2隐式等待隐式等待实际上是设置了一个最长的等待时间,如果在这段时间内能够定位到目标,则执行下一步操作,否则会一致等到规定时间结束,然后再执行下一步。隐式等待设置一次,对整个driver周期都能够起作用,所以,在最开始设置一次即可。注意:在同一个driver周期中遇到强制等待,可能会导致隐式等待失效。#隐式等待,京东的“新人福利”fromseleniumimportwebdriverfromtimeimportsleepdriver=webdriver.Chrome()

#打开浏览器driver.maximize_window()

#浏览器最大化driver.get("/")

#跳转至京东driver.implicitly_wait(10)

#隐式等待10秒element=driver.find_element_by_xpath("//*[@class='user_profit_lk']")

#定位元素element.click()

#单击sleep(3)driver.quit()

#关闭浏览器工作任务6.7Selenium3种等待方式6.7.3显式等待WebDriverWait是Selenium提供的显式等待的模块,使用原理是:在指定的时间范围内,等待到符合/不符合某个条件为止,导入方式为:fromselenium.webdriver.support.waitimportWebDriverWaitWebDriverWait参数如表6-1所示。

表6-1WebDriverWait参数及说明序号参数描述1driver传入的

WebDriverWait实例2timeout超时时间,等待的最长时间3poll_frequency调用

until或until_not中的方法的间隔时间(默认为0.5秒)4ignored_exceptions忽略的异常工作任务6.7Selenium3种等待方式WebDriverWait模块含有以下两种方法:untiluntil_notuntil与until_not的参数及说明如表6-2所示。

表6-2

until与until_not的参数及说明序号参数描述1method在等待期间,每隔一段时间调用这个传入的方法,直到返回值不为

FALSE2message如果超时,抛出Timeout

Exception,将message传入异常工作任务6.7Selenium3种等待方式通常情况下,WebDriverWait模块会与expected_conditions模块搭配使用,用来写入until与until_not中的参数—method。expected_conditions模块有如表6-3所示的等待条件。表6-3expected_conditions模块等待条件序号等待条件方法描述1title_is(object)判断标题是否出现2title_contains(object)判断标题是否包含某些字符3presence_of_element_located(object)--常用判断某个元素是否被加到了

dom树里,并不代表该元素一定可见4visibility_of_element_located(object)--常用判断某个元素是否被加到了

dom树里,并且可见,宽和高都大于05visibility_of(object)判断元素是否可见,如果可见则返回这个元素工作任务6.7Selenium3种等待方式6presence_of_all_elements_located(object)判断是否至少有1个元素存在dom树中7visibility_of_any_elements_located(object)判断是否至少有1个元素在页面中可见8text_to_be_present_in_element(object)判断指定的元素中是否包含了预期的字符串9text_to_be_present_in_element_value(object)判断指定元素的属性值是否包含了预期的字符串10frame_to_be_available_and_switch_to_it(object)判断该

frame是否可以切换进去11invisibility_of_element_located(object)判断某个元素是否存在与dom树中或不可见12element_to_be_clickable(object)判断某个元素中是否可见,并且是可单击的13staleness_of(object)等待某个元素从

dom树中删除14element_to_be_selected(object)判断某个元素是否被选中,一般用在下拉列表中15element_selection_state_to_be(object)判断某个元素的选中状态是否符合预期16element_located_selection_state_to_be(object)判断某个元素的选中状态是否符合预期17alert_is_present(object)判断页面上是否出现

alert弹窗工作任务6.7Selenium3种等待方式#模拟场景:单击京东首页的“新人福利”fromseleniumimportwebdriverfromtimeimportsleepfrommon.byimportByfromselenium.webdriver.support.waitimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditionsasECdriver=webdriver.Chrome()

#打开浏览器driver.maximize_window()

#浏览器最大化driver.get("/")

#跳转至京东element=WebDriverWait(driver,20,0.5).until(

EC.visibility_of_element_located((By.XPATH,"//*[@class='user_profit_lk']")))

#20秒内,直到元素在页面中可定位element.click()

#单击sleep(3)driver.quit()工作任务6.7Selenium3种等待方式显式等待虽然使用起来相比其他等待方式显得要复杂,但是它的优势在于灵活,封装后,通过简单的调用,就可以运用到自动化测试项目中。UnitTest是Python中的一个单元测试框架,类似于Java语言中的Junit。在Selenium自动化测试过程中,可以利用UnitTest进行测试管理。UnitTest包含三个部分setUp、testDown及测试主体部分,通常结构如下:importunittestimportunittestfromtimeimportsleepfromseleniumimportwebdriverfrommon.byimportByclassTestLogin(unittest.TestCase):

defsetUp(self)->None:

self.driver=webdriver.Chrome()

self.driver.maximize_window()

self.driver.implicitly_wait(5)

deftearDown(self)->None:

self.driver.quit()deftestlogin_file(self):

self.driver.get('00/login')

self.driver.find_element(By.ID,'username').send_keys("aaa")

sleep(1)工作任务6.7Selenium3种等待方式self.driver.find_element(By.ID,'password').send_keys("123456")

sleep(1)

self.driver.find_element(By.ID,'login_button').click()

sleep(2)

deftestlogin(self):

self.driver.get('00/login')

self.driver.find_element(By.ID,'username').send_keys("admin")

sleep(1)

self.driver.find_element(By.ID,'password').send_keys("123456")

sleep(1)

self.driver.find_element(By.ID,'login_button').click()

sleep(2)if__name__=='__main__':#必须顶头写,可以直接输入main,回车

unittest.main()工作任务6.10HTMLTestRunne通过UnitTest执行测试后,如果需要输出测试报告,可以调用HTMLTestRunner文件生成一个HTML格式的测试报告。HTMLTestRunner是一个第三方功能模块,因此在应用时需导入。下载好HTMLTestRunner.py文件后,直接将其复制至Python安装目录下“python\python35\lib”中或者引用在测试工程的某个目录下,在Selenium脚本中导入使用。以登录测试为例:#导入单元测试importunittest#导入webdriverfromseleniumimportwebdriver#导入ActionChains类fromselenium.webdriverimportActionChains#导入测试用例生成模板fromHTMLTestRunnerimportHTMLTestRunnerfrommon.byimportByclassTestCase1(unittest.TestCase):

defsetUp(self):

self.driver=webdriver.Chrome()

self.driver.get('00/login')工作任务6.10HTMLTestRunnedeftestsearch(self):

username=self.driver.find_element(By.ID,'username')

username.send_keys('admin')

password=self.driver.find_element(By.ID,'password')

password.send_keys('123456')

btn=self.driver.find_element(By.CLASS_NAME,"el-button")

ActionChains(self.driver).click(btn).perform()deftearDown(self):

self.driver.quit()if__name__=='__main__':

testunit=unittest.TestSuite()

testunit.addTest(unittest.makeSuite(TestCase1))

fp=open(r"D:\pytest\test\result\result.html","wb")

runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title="登录测试报告",description="用例执行情况")

runner.run(testunit)

fp.close()工作任务6.11submit()方法使用submit()方法一般使用在有form标签的表单中,它可以把form表单中的信息提交到后台。fromtimeimportsleepfromseleniumimportwebdriverfrommon.byimportBydriver=webdriver.Chrome()driver.get("")#根据id定位输入框并输入“python”driver.find_element(By.ID,"kw").send_keys("python")sleep(2)#根据XPath定位“百度一下”按钮,并提交form表单,即单击“百度一下”按钮driver.find_element(By.XPATH,'//*[@id="su"]').submit()sleep(10)driver.quit()#关闭浏览器工作任务6.12下拉框的处理针对Select标签的下拉列表,Selenium提供了Select类进行操作:Select类常用方法如表6-8所示。fromselenium.webdriver.support.selectimportSelect序号方法/属性描述1select_by_value()根据值选择2select_by_index()根据索引选择(从1开始)3select_by_visible_text()根据文本选择4deselect_by_value()根据值反选(取消选项)5deselect_by_index()根据索引反选(取消选项)6deselect_by_visible_text()根据文本反选(取消选项)7deselect_all()反选所有(取消选项)8options获取所有选项9all_selected_options获取所有选中的选项10first_selected_option获取第一个选中的选项工作任务6.12下拉框的处理6.15.1Select单选框对于Select单选框,操作比较简单,创建Select对象后,直接使用Select类中的方法选择即可。实例应用如图6-28所示。工作任务6.12下拉框的处理fromtimeimportsleep#导入sleep模块,可以使程序强制休眠fromseleniumimportwebdriver#导入webdriver模块frommon.byimportBy#导入By方法fromselenium.webdriver.support.selectimportSelect

driver=webdriver.Chrome()#打开Chrome浏览器driver.implicitly_wait(5)#智能等待5秒driver.maximize_window()#浏览器显示最大化driver.get('02/login')#访问本地ip+/logindriver.find_element(By.NAME,'username').send_keys("admin")#通过name定位输入框,并输入”admin“driver.find_element(By.NAME,'password').send_keys("123456")#通过name定位输入框,并输入”123456“driver.find_element(By.CLASS_NAME,"el-button").click()#通过class_name定位登录按钮,并点击sleep(2)工作任务6.12下拉框的处理river.find_element(By.LINK_TEXT,"专业管理").click()sleep(2)driver.find_element(By.TAG_NAME,"button").click()select=Select(driver.find_element(By.TAG_NAME,"select"))select.select_by_value("2")#根据值选择sleep(1)select.select_by_index(4)

#根据索引选择(从1开始)sleep(1)select.select_by_visible_text("文学系")

#根据系统实际存在的文本选择sleep(5)#强制等待5秒driver.quit()#关闭浏览器工作任务6.16数据驱动使用数据驱动的模式进行测试时,可以根据业务分解测试数据,只需定义变量,使用外部或者自定义的数据使其参数化,从而避免了使用之前测试脚本中固定的数据。可以将测试脚本与测试数据分离,使得测试脚本在不同数据集合下高度复用。这样不仅可以增加复杂条件场景的测试覆盖,还可以极大地减少测试脚本的编写与维护工作。下面将使用Python下的数据驱动模式(ddt)库,结合UnitTest库以数据驱动模式创建百度搜索的测试。ddt库包含一组类和方法用于实现数据驱动测试,可以将测试中的变量进行参数化。可以通过Python自带的pip命令进行下载并安装:pipinstallddt。为了创建数据驱动测试,需要在测试类上使用@ddt装饰符,在测试方法上使用@data装饰符。@data装饰符把参数当作测试数据,参数可以是单个值、列表、元组、字典。对于列表,需要用@unpack装饰符把元组和列表解析成多个参数。下面实现百度搜索测试,传入搜索关键词和期望结果,代码如下:工作任务6.16数据驱动importunittestfromseleniumimportwebdriverfrommon.byimportByfromtimeimportsleepimportddtimportcsv

#定义一个函数用于读取CSV文件中的数据defread():

#指定CSV文件的路径

path=r"C:\Users\402\Desktop\教材\data.csv"工作任务6.16数据驱动#定义一个函数用于读取CSV文件中的数据defread():

#指定CSV文件的路径

path=r"C:\Users\402\Desktop\教材\data.csv"

#打开文件

stream=open(path,'r')

#使用csv.reader读取CSV文件中的数据

data=csv.reader(stream)

list=[]

i=0

#遍历CSV文件中的每一行数据

forrowindata:

#跳过第一行(通常是标题行)

ifi!=0:

list.append(row)

print(row)

i=i+1

#返回读取的数据列表

returnlist工作任务6.16数据驱动#使用ddt装饰器,使得测试类支持数据驱动测试@ddt.ddtclassTest(unittest.TestCase):

defsetUp(self)->None:

#初始化WebDriver并打开测试页面

self.driver=webdriver.Chrome()

#访问本地IP地址对应的登录页面

self.driver.get('00/login')

#设置隐式等待时间为30秒

self.driver.implicitly_wait(30)

#最大化浏览器窗口

self.driver.maximize_window()

deftearDown(self)->None:

#测试结束后关闭WebDriver

self.driver.quit()

工作任务6.16数据驱动#从read函数中读取测试数据

info=read()

#使用ddt.data装饰器,将读取的数据作为参数传递给测试方法

@ddt.data(*info)

deftest01(self,list):

#根据数据列表中的值,填充用户名和密码字段,并点击登录按钮

self.driver.find_element(By.ID,'username').send_keys(list[0])

self.driver.find_element(By.NAME,'password').send_keys(list[1])

self.driver.find_element(By.TAG_NAME,'button').click()

#等待3秒,以便观察登录后的行为

sleep(3)if__name__=='__main__':

#运行unittest测试

unittest.main()

工作任务6.17数据断言断言用于验证自动化测试是否通过。UnitTest常用的断言方法如表6-10所示。序号UnitTest常用断言描

述1assertEqual(a,b,[msg='测试失败时打印的信息'])断言a和b是否相等,相等则测试用例通过2assertNotEqual(a,b,[msg='测试失败时打印的信息'])断言a和b是否相等,不相等则测试用例通过3assertTrue(x,[msg='测试失败时打印的信息'])断言x是否是True,是True则测试用例通过4assertFalse(x,[msg='测试失败时打印的信息'])断言x是否是False,是False则测试用例通过5assertIs(a,b,[msg='测试失败时打印的信息'])断言a是否是b,是则测试用例通过6assertNotIs(a,b,[msg='测试失败时打印的信息'])断言a是否是b,不是则测试用例通过7assertIsNone(x,[msg='测试失败时打印的信息'])断言x是否是None,是None则测试用例通过8assertIsNotNone(x,[msg='测试失败时打印的信息'])断言x是否是None,不是None则测试用例通过9assertIn(a,b,[msg='测试失败时打印的信息'])断言a是否在b中,在b中则测试用例通过10assertNotIn(a,b,[msg='测试失败时打印的信息'])断言a是否在b中,不在b中则测试用例通过11assertIsInstance(a,b,[msg='测试失败时打印的信息'])断言a是否是b的一个实例,是则测试用例通过12assertNotIsInstance(a,b,[msg='测试失败时打印的信息'])断言a是否是b的一个实例,不是则测试用例通过工作任务6.17数据断言实例:importunittestfromseleniumimportwebdriverfromtimeimportsleepfrommon.byimportByimportddtimportcsv

defread():

path=r"C:\Users\s\Desktop\data.csv"

stream=open(path,"r")

data=csv.reader(stream)

list=[]

line=0

forrowindata:

ifline!=0:

list.append(row)

print(row)

line=line+1

returnlist工作任务6.17数据断言@ddt.ddtclassTest(unittest.TestCase):

defsetUp(self)->None:

self.driver=webdriver.Chrome()

self.driver.get("00/login")

self.driver.implicitly_wait(3

温馨提示

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

评论

0/150

提交评论