1.1.2 PyCharm
提及Python的集成开发环境(Integrated Development Environment,IDE),市面上有很多成熟、好用的产品,如PyCharm、Atom等。如果读者喜欢轻量级的产品,可以选择Sublime Text或者Atom。如果读者习惯了Eclipse的工作方式,可以选择使用PyDev。如果读者习惯使用Vim,可以通过一定的方法把Vim打造成Python的IDE。
读者可以选择一款自己喜爱的编辑器使用,而本书选择目前非常流行的PyCharm。如果用户已经在使用它了,那么可跳过本节内容。
PyCharm提供了代码分析、代码智能提示、代码调试、版本控制集成等众多实用功能,其分为专业收费版本和社区免费版本。对于使用Selenium进行自动化测试来说,采用社区免费版本即可。读者可以到JetBrains官方网站下载最新版本的PyCharm IDE客户端,如图1.10所示。
图1.10 PyCharm官方下载页面
需要特别注意的地方是,在PyCharm下载页面中,Professional是指专业收费版本,而Community则是指社区免费版本。用户可按个人的需求下载相应的版本,企业级专业用户建议使用专业收费版本。
限于篇幅,安装PyCharm的过程不再具体阐述了。等安装完PyCharm以后,用户就可以使用并创建新项目了。
如果用户的系统上安装了多个Python环境,那么PyCharm在用户创建项目的时候需要指定一个合适的Python版本(见图?1.11)。当然,如果用户使用了Virtualenv创建的Python虚拟环境,也需要记得在此处切换到用户已经创建的Python环境。在创建项目之后,可以编写一个基础的脚本来验证一下PyCharm的运行环境是否正常、Python脚本是否运行正常。
图1.11 选择Python版本
注意,如图1.11所示,Interpreter下拉列表中会出现所有用户已经安装好的不同版本的Python环境(Python 2和Python 3在语法上有一定的区别),用户可根据实际需要选择相应版本。
如图1.12所示,首先,在项目根目录中新建一个Python文件。
图1.12 在项目根目录中新建Python文件
然后,在弹出的New Python file对话框中输入相应的文件名,如图1.13所示。输入相应的文件名后,单击OK按钮。此时,第一个Python文件就创建好了。
下面可以尝试输入以下脚本。
print('hello?selenium') |
接下来,在demo文件上右击,在弹出的快捷菜单中选择Run 'demo'命令即可运行脚本,如图1.14所示。
图1.13 输入Python文件名
图1.14 执行Python项目
在上述脚本运行后,可以看到PyCharm的运行日志成功输出了“hello selenium”消息,如图1.15所示。
图1.15 脚本运行结果
如果读者进行到这一步且没有出现任何问题,说明已经成功完成了?Python IDE的准备工作,可以进入下一环节了。
1.1.3 UI自动化测试的延续—Selenium WebDriver
熟悉QTP/UFT的读者一定对Mercury Tours网站不陌生。该网站提供了一个模拟飞机订票的实例,很适合新手进行自动化测试实践。下面先从一段经典的脚本实例开始介绍这个实例。
from selenium import?webdriver driver = webdriver.Firefox() driver.get("Mercury?Tours网站网址") assert?"Mercury Tours"?in?driver.title username_edit = driver.find_element_by_name("userName") password_edit=driver.find_element_by_name("password") login_button=driver.find_element_by_name("login") username_edit.send_keys("mercury") password_edit.send_keys("mercury") login_button.click() assert "Find a Flight"?in?driver.title driver.close() |
下面对上述脚本进行解释。
from selenium import webdriver |
有Python基础的读者一看就明白,这一行代码的作用是导入Selenium的WebDriver模块。
driver = webdriver.Firefox() |
通过webdriver.Firefox()创建一个Firefox浏览器的webdriver实例,并返回给变量driver。
driver.get("Mercury Tours网站网址") |
这行代码表示跳转到飞机订票系统的页面。需要注意的是,此处的 driver.get()方法实际上会自动等待页面加载完毕再继续执行后续的方法。当然,如果页面中存在许多?AJAX加载形式,则此方法是无法智能地进行自动等待的,后面的章节会介绍如何处理这类情况。
assert "Mercury Tours" in driver.title |
这行代码的作用是验证打开页面后的title是否包含“Mercury Tours”这个字符串。需要注意的是,如果验证失败,脚本会自动停止,后续脚本不会继续执行。
username_edit = driver.find_element_by_name("userName") password_edit = driver.find_element_by_name("password") login_button = driver.find_element_by_name("login") |
Selenium提供了许多方式来识别对象,多数情况下以find_element_by开头,在by后面可以跟id、name、xpath和tag_name等。这个实例中使用的是find_element_by_name,从字面意思就可以理解,它根据对象的name属性进行识别,获取对象后自动返回给username_edit、password_edit和login_button变量。
如何才能获取这个name属性值呢?对此问题,此处先不展开说明,后续章节会详细讲解如何抓取这些控件的属性值,并介绍更多的对象识别方式。
username_edit.send_keys("mercury") password_edit.send_keys("mercury") login_button.click() |
识别到对象后,就可以直接与对象进行一些交互了,如单击、输入文本和选择下拉列表等。在本例中,输入的用户名和密码均是字符串mercury,最后单击login(登录)按钮进行登录。
assert "Find a Flight" in driver.title |
在登录之后,出现的结果无非是两种情况,即登录成功或者登录失败。因此,需要验证登录成功后的页面标题是否包含“Find a Flight”字样。
driver.close() |
最后这行代码的作用是关闭浏览器窗口。其实可以使用两种方式关闭浏览器窗口,除了driver.close以外,还可以使用driver.quit来关闭浏览器。区别在于,driver.close的作用是关闭浏览器当前的标签页,如果当前仅有一个标签页,那么就会关闭当前浏览器,而driver.quit会直接关闭整个浏览器,无论当前有多少个标签页。
版权声明:51Testing软件测试网获得人民邮电出版社和作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。