logo资料库

selenium-python中文文档.pdf

第1页 / 共44页
第2页 / 共44页
第3页 / 共44页
第4页 / 共44页
第5页 / 共44页
第6页 / 共44页
第7页 / 共44页
第8页 / 共44页
资料共44页,剩余部分请下载后查看
1.安装
介绍
下载python的selenium安装包
windows用户的详细说明
下载Selenium server
2.开始
简单的使用
实例分析
使用Selenium测试
实例分析
使用Selenium 的 remote WebDriver
3.导航
页面交互
填充表单
拖放
在窗口(window)和框架(frame)间移动
弹出对话框
导航:历史记录和定位
Cookies
4.元素定位
根据Id定位
根据 Name 定位
XPath定位
用链接文本定位超链接
标签名定位
class定位
css选择器定位
5.等待事件
显式Waits
预期条件
隐式Waits
6.页面对象
测试案例
页面对象类
页面元素
定位器
7.1异常
7.2行为链
7.3警告框
7.4特殊字符
7.5用By类定位
期望的功能
实用工具
7.6浏览器驱动
Firefox WebDriver
Chrome WebDriver
Remote WebDriver
页面元素
UI支持
颜色支持
预期条件支持
7.WebDriver API
推荐的引入风格
API的常规使用
8.附录:FAQ
怎样使用 ChromeDriver
Selenium 2 支持 XPath 2.0 吗?
怎么滚动到页面的底部?
怎样使用定制的 Firefox profile自动保存文件
怎么向文件上传表单上传文件?
如何使用firebug?
怎样给当前窗口截图?
1.安装 介绍 Selenium Python 提供了一个简单的 API 便于我们使用 Selenium WebDriver 编写 功能/验收测试。 通过 Selenium Python 的 API,你可以直观地使用所有的 Selenium WebDriver 功能 Selenium Python 提供了一个很方便的接口来驱动 Selenium WebDriver ,例如 Firefox、Chrome、Ie,以及 Remote ,目前支持的 python 版本有 2.7, 3.2, 3.3 和 3.4. 下载 python 的 selenium 安装包 你可以从这里 下载 python 的 selenium 安装包,但是更好的办法是用 pip 来安装。 Python3.4 的标准 库里就有现成的 pip 工具,可以用 pip 安装 selenium: pip install selenium 你可能会想用虚拟机来安装一个独立的 Python 环境,Python 的 pyvenc 功能和虚拟机基本上是一样的。 windows 用户的详细说明 注意:你需要联网来完成这个安装 1. 2. 安装 python3.4 安装地址 用 cmd.exe 开启命令行,并用下面的命令安装 selenium C:\Python34\Scripts\pip.exe install selenium 现在你可以用 python 来运行你的测试脚本了。例如,如果你创建了一个 Selenium 脚本然后保存到文 件 C:\my_selenium_script.py,然后运行它: C:\Python34\python.exe C:\my_selenium_script.py 下载 Selenium server 注意:如果你想要使用 Remote WebDriver,必须要安装 Selenium server,更多的细节可以 看这里。 如果你刚开始学 Selenium,你可以跳过这一块从下一章节开始。 Selenium server 是个 Java 程序,推荐使用 1.6 及以上的 JRE 来运行 Selenium server。 你可以从这里下载 2.x 的 Selenium server,文件名看起来应该类似于这样 selenium-server-standalone-2.x.x.jar 什么时候你都 可以下载到最新的 2.x Selenium server
如果你的机器没有安装 JRE,你可以从 JRE from the Oracle website 下载一个。如果你使用的是 GNU/Linux 系统并且有 ROOT 权限的话,你也可以使用系统命令来安装 JRE。 如果你的 PATH(环境变量) 里 java 命令是可用的话,你可以用这个命令来开启 Selenium server: java -jar selenium-server-standalone-2.x.x.jar 把 2.x.x 替换成你从网下下载的版本。 如果是一个非 ROOT 用户安装的 JRE,或者环境变量里 java 命令 不可用,你可以输入 java 命令的相对路径或者绝对路径,同样你也可以提供 Selenium server 的相对路 径或者绝对路径: /path/to/java -jar /path/to/selenium-server-standalone-2.x.x.jar 2.开始 简单的使用 如果你已经安装好 Python 和 Selenium,可以这样开始使用: from selenium import webdriverfrom selenium.webdriver.common.keys import Keys driver = webdriver.Firefox() driver.get("http://www.python.org")assert "Python" in driver.title elem = driver.find_element_by_name("q") elem.send_keys("pycon") elem.send_keys(Keys.RETURN)assert "No results found." not in driver.page_source driver.close() 把上面的脚本保存到文件(例:python_org_search.py),然后就可以这样运行它了: python python_org_search.py 运行的 python 需要安装 selenium 模块 实例分析 selenium.webdriver 模块提供了所有 WebDriver 的实现,现在支持的 WebDriver 的实现有 Firefox,Ie,Chrome,Remote,Keys 类提供了键盘的代码(回车,ALT,F1 等等) from selenium import webdriverfrom selenium.webdriver.common.keys import Keys 然后我们创建一个 Firefox 的实例: driver = webdriver.Firefox() driver.get 方法会导向给定的 URL 的页面,WebDriver 会等待页面完全加载完(就是 onload 函数被触发 了),才把程序的控制权交给你的测试或者脚本。 但是如果你的页面用了太多的 AJAX,那么这个机制 就没什么卵用了,因为它不知道页面到底是什么时候加载完。
driver.get("http://www.python.org") WebDrive 提供了一系统类似于 find_element_by_*的方法来寻找页面元素,例如,我们利用 find_element_by_name 方法,通过元素的 name 属性来定位一个文本输入框元素。 更详细的寻找元素的方 法可以参阅 第四章-元素定位: elem = driver.find_element_by_name("q") 接着我们发送了一些字符,类似于用键盘直接输入。特殊的键盘符我们可以导入 selenium.webdriver.common.keys,然后用 Keys 类来表示: elem.send_keys("pycon") elem.send_keys(Keys.RETURN) 提交页面之后我们应该确认一下是否有返回,为了确定有东西返回,我们在这里下一个断言: assert "No results found." not in driver.page_source 最后浏览器窗口被关闭了,你也可以调用 quit 方法来代替 close,区别在于 quit 会退出整个浏览器, 而 close 只会关闭一个标签,但是如果浏览器只有一个标签,那么这两个方法完全一样,都会关闭整 个浏览器。 driver.close() 使用 Selenium 测试 Selenium 经常被用来写测试用例,它本身的包不提供测试的工具或者框架。我们可以用 Python 的单 元测试模块来编写测试用例。 另一个工具/框架的选择是??? (原文:The other options for a tool/framework are py.test and nose.) 在本章节我们使用 unittest 做框架,下面是一个用 unittest 模 块改进后的例子,是对 python.org 函数搜索功能的测试: import unittestfrom selenium import webdriverfrom selenium.webdriver.common.keys import Keys class PythonOrgSearch(unittest.TestCase): def setUp(self): self.driver = webdriver.Firefox() def test_search_in_python_org(self): driver = self.driver driver.get("http://www.python.org") self.assertIn("Python", driver.title) elem = driver.find_element_by_name("q") elem.send_keys("pycon") elem.send_keys(Keys.RETURN) assert "No results found." not in driver.page_source def tearDown(self): self.driver.close()
if __name__ == "__main__": unittest.main() 你可以在 shell 里运行这个测试用例: python test_python_org_search.py . ---------------------------------------------------------------------- Ran 1 test in 15.566s OK 上面的结果表明我们的测试用例成功执行了 实例分析 脚本的开头我们引入了所有需要的模块,单元测试是 python 内置的基于 Java's JUnit 的模块,提供了 组织单元测试的框架。 selenium.webdriver 模块提供了 WebDriver 的所有实现: Firefox,Ie,Chrome,Remote,Keys 类提供了键盘的代码(回车,ALT,F1 等等): import unittestfrom selenium import webdriverfrom selenium.webdriver.common.keys import Keys 测试用例类继承了 unittest.TestCase 类,这表明这个类是一个测试用例: class PythonOrgSearch(unittest.TestCase): setUp 函数进行了初始化,你将要在这个类里编写的所有测试方法都要先调用这个方法,接着我们创 建了一个 Firefox WebDriver 实例: def setUp(self): self.driver = webdriver.Firefox() 接下来是测试用例的方法,它应该总是以字符'test'开始. 方法的第一行 本地引用了 setUp 方法中创建 的 driver 对象: def test_search_in_python_org(self): driver = self.driver driver.get 方法会导向给定的 URL 的页面,WebDriver 会等待页面完全加载完(就是 onload 函数被触发 了),才把程序的控制权交给你的测试或者脚本。 但是如果你的页面用了太多的 AJAX,那么这个机制 就没什么卵用了,因为它不知道页面到底是什么时候加载完。 driver.get("http://www.python.org") 下一行是个断言,确认页面标题里是否有'Python'这个单词: self.assertIn("Python", driver.title) WebDrive 提供了一系统类似于 find_element_by_*的方法来寻找页面元素,例如,我们利用 find_element_by_name 方法,通过元素的 name 属性来定位一个文本输入框元素。 更详细的寻找元素的方 法可以参阅 第四章-元素定位:
elem = driver.find_element_by_name("q") 接着我们发送了一些字符,类似于用键盘直接输入。特殊的键盘符我们可以导入 selenium.webdriver.common.keys,然后用 Keys 类来表示: elem.send_keys("pycon") elem.send_keys(Keys.RETURN) 提交页面之后我们应该确认一下是否有返回,为了确定有东西返回,我们在这里下一个断言: assert "No results found." not in driver.page_source 最后浏览器窗口被关闭了,你也可以调用 quit 方法来代替 close,区别在于 quit 会退出整个浏览器, 而 close 只会关闭一个标签,但是如果浏览器只有一个标签,那么这两个方法完全一样,都会关闭整 个浏览器。 driver.close() Final lines are some boiler plate code to run the test suite: if __name__ == "__main__": unittest.main() 使用 Selenium 的 remote WebDriver 要使用 remote WebDriver,你先要运行 Selenium server,用下面这个命令: java -jar selenium-server-standalone-2.x.x.jar 运行 Selenium server 时,你可以看到类似这样一条信息: 15:43:07.541 INFO - RemoteWebDriver instances should connect to: http://127.0.0.1:4444/wd/hub 意思是说你可以用这个 URL 连接到 remote WebDriver,下面是一些例子: from selenium import webdriverfrom selenium.webdriver.common.desired_capabilities import DesiredCapabilities driver = webdriver.Remote( command_executor='http://127.0.0.1:4444/wd/hub', desired_capabilities=DesiredCapabilities.CHROME) driver = webdriver.Remote( command_executor='http://127.0.0.1:4444/wd/hub', desired_capabilities=DesiredCapabilities.OPERA) driver = webdriver.Remote( command_executor='http://127.0.0.1:4444/wd/hub', desired_capabilities=DesiredCapabilities.HTMLUNITWITHJS) desired_capabilities 是一个 dict,如果你不使用默认的 dict,你可以自己指定值: driver = webdriver.Remote(
command_executor='http://127.0.0.1:4444/wd/hub', desired_capabilities={'browserName': 'htmlunit', 'version': '2', 'javascriptEnabled': True}) 3.导航 你用 WebDriver 要做的第一件事就是指定一个链接,一般我们使用 get 方法: driver.get("http://www.google.com") WebDriver 会等待页面完全加载完(就是 onload 函数被触发了),才把程序的控制权交给你的测试或者脚 本。 但是如果你的页面用了太多的 AJAX,那么这个机制就没什么卵用了,因为它不知道页面到底 是什么时候加载完。如果你需要确定页面完全加载完了,你可以使用 waits 页面交互 我们比较喜欢做的事情就是和页面交互,准确的说,是和页面里的 HTML 元素交互。首先,我们要 找到一个元素,WebDrive 提供了许多方法查找元素,例如,给定一个这样的元素: 你可以用下列任意方法找到它: element = driver.find_element_by_id("passwd-id") element = driver.find_element_by_name("passwd") element = driver.find_element_by_xpath("//input[@id='passwd-id']") 你也可以通过文本信息来找到一个链接,但是要注意,文本必须要完全匹配。 在使用 XPATH 的时候也 要注意,如果有多个元素匹配,只会返回第一个。如果匹配不到任何元素,会抛出一个 NoSuchElementException 异常。 WebDriver 有一个 基于对象的 API,我们可以通过同一个接口代表所有类型的元素,这意味着当你 敲击你 IDE 的自动补全组合键的时候,虽然你会看到你可以调用很多方法,但不是所有的方法都行得 通。不过不要担心!WebDriver 会自己尝试做正确的选择。并且如果你调用一个没用的方法(例如在 一个 meta 标签上调用 setSelected()),WebDriver 会抛出一个异常 那么,当你获取到一个元素之后,你可以做些什么呢?首先,你可能会想输入一些文本到一个文本区 域: element.send_keys("some text") 你可以使用 Keys 类来模拟输入方向键: element.send_keys(" and some", Keys.ARROW_DOWN) 理论上任意的元素都可以调用 send_keys 方法,就是说我们可以测试例如 Gmail 的键盘快捷键。send_keys 的副作用就是输入文本到文本域不会自动清除,而是会附加到原有的文本后面,我们可以使用 clear 方法来很方便的清除文本框或者文本域的内容:
element.clear() 填充表单 我们已经知道怎么向一个文本框和文本域输入内容,但是其他元素我们要怎么处理? 你可以触发下 拉选框,并且用 setSelected 方法来让一个选项被选中,处理选择框不会很困难: element = driver.find_element_by_xpath("//select[@name='name']") all_options = element.find_elements_by_tag_name("option")for option in all_options: print("Value is: %s") % option.get_attribute("value") option.click() 这段代码会找到页面的第一个选择框元素,然后遍历每个选项,输出他们的值,并且依次选中。 你可以看到,这种方式处理选择框不太高效,WebDriver 支持许多类,其中包括一个 Select 的类,给 我们提供了许多有用的方法: from selenium.webdriver.support.ui import Select select = Select(driver.find_element_by_name('name')) select.selct_by_index(index) select.select_by_visible_text("text") select.select_by_value(value) WebDriver 也提供了取消选中选项的方法: select = Select(driver.find_element_by_id('id')) select.deselect_all() 上面的代码会取消页面第一个选择框的所有选中项。 假设测试中,我们需要所有默认选中项的列表,Select 类提供了一个属性: select = Select(driver.find_element_by_xpath("xpath")) all_selected_options = select.all_selected.options 获取所有可用的选项: options = select.options 一旦你填写完表单,一般就要提交表单,一个方法是找到提交按钮然后点击它: # Assume the button has the ID "submit" :) driver.find_element_by_id("submit").click() WebDriver 对每个元素都提供一个 submit 方法,如果在一个表单内的元素上调用,WebDriver 会沿着 DOM 树往上一直寻找,直到找到一个闭合的表单为止,然后调用 submit 方法;如果元素不在表单内, 那么会抛出一个 NoSuchElementException 异常。 拖放
你可以使用拖放功能,移动确定数量的元素,或者拖到另一个元素上面: element = driver.find_element_by_name("source") target = driver.find_element_by_name("target") from selenium.webdriver import ActionChains action_chains = ActionChains(driver) action_chains.drag_and_drop(element,target).perform() 可以看这个页面的演示 在窗口(window)和框架(frame)间移动 现在的网页应用里没有页面框架或者只用一个窗口就包含了所有内容的已经很少了。WebDriver 支 持在指定的窗口间移动,方法为 switch_to_window: driver.switch_to_window("windowName") 现在所有的 driver 的调用都会指向这个给定的窗口,但是我们怎么知道窗口的名字是什么呢?可以看 一看打开这个窗口的 javascript 脚本或者 link 链接: Click here to open a new window 或者,你可以传一个 window handle 给 switch_to_window()方法,它就可以像这样迭代每一个打开的窗口: for handle in driver.window_handles: driver.switch_to_window(handle) 你也可以在框架和框架之间切换 (or into iframes): driver.switch_to_frame("frameName") 我们可以用.分离路径来访问子框架,并且可以指定它的索引: driver.switch_to_frame("frameName.0.child") 这会跳到'frameName'框架内第一个名为'child'的子框架。All frames are evaluated as if from top. 一旦我们操作完了框架,我们可以通过下面的操作回到父框架: driver.switch_to_default_content() 弹出对话框 Selenium 内置支持处理弹出对话框,当你触发了弹框操作,你可以用下面的方法获得对话框元素: alert = driver.switch_to_alert() 上述代码返回当前打开的对话框对象,有了这个对象 我们可以做确定、忽略、阅读提示文本或者甚 至输入 prompt,这个接口可以很好的操作 alerts、confirms、prompts 等对话框。更多内容参阅 API 文档
分享到:
收藏