2. 入门
2.1. 简单用法
如果你已经安装了Selenium Python库,你可以像这样从Python开始使用它。
from selenium import webdriver
from 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.clear()
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库
2.2. 示例说明
selenium.webdriver模块提供了所有WebDriver实现。 目前支持的WebDriver实现是Firefox,Chrome,IE和Remote。 Keys类提供键盘中的键,如RETURN,F1,ALT等。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
接下来,创建一个 Firefox WebDriver .实例
driver = webdriver.Firefox()
driver.get方法将导航到URL给出的页面。 在将控件返回到测试或脚本之前,WebDriver将等待页面完全加载(即“onload”事件已触发)。 值得注意的是,如果你的页面在加载时使用了大量的AJAX,那么WebDriver可能不知道它何时完全加载:
driver.get("http://www.python.org") --- 加载URL页面
下一行是断言,确认标题中有“Python”字样:
assert "Python" in driver.title
WebDriver提供了许多使用其中一个find_element_by_ *方法查找元素的方法。 例如,可以使用find_element_by_name方法通过其name属性定位输入文本元素。 有关查找元素的详细说明,请参阅“定位元素”一章:
elem = driver.find_element_by_name("q")
接下来,我们发送指令,这类似于使用键盘输入指令。 可以使用从selenium.webdriver.common.keys导入的Keys类发送特殊键。 为安全起见,我们首先清除输入字段中的任何预先填充的文本(例如“搜索”),这样就不会影响我们的搜索结果:
elem.clear()
elem.send_keys("pycon") -- 键入“pycon”
elem.send_keys(Keys.RETURN) -- 回车键
提交页面后,如果有响应内容,就会得到对应内容。 为确保找到对应的响应内容,使用assert断言
assert "No results found." not in driver.page_source
最后,关闭浏览器窗口。 也可以调用quit方法而不是关闭。 quit将退出整个浏览器,而close`将关闭一个选项卡,但如果只打开一个选项卡,默认情况下大多数浏览器将完全退出:
driver.close()
2.3. 使用Selenium编写测试
Selenium主要用于编写测试用例。 selenium包本身不提供测试工具/框架。 您可以使用Python的unittest模块编写测试用例。 其他工具/框架的选项是py.test和nose。
在本章中,我们使用unittest框架。 这是使用unittest模块的修改示例。 这是对python.org搜索功能的测试:
import unittest
from selenium import webdriver
from 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中运行上面的testcase.
python test_python_org_search.py
.
----------------------------------------------------------------------
Ran 1 test in 15.566s
OK
以上结果表明测试已成功完成。
2.4. 解释一下这个例子
最初,导入所需的所有基本模块。 unittest模块是基于Java的JUnit的内置Python。 该模块提供了测试用例的框架。 selenium.webdriver模块提供了所有WebDriver实现。 目前支持的WebDriver实现是Firefox,Chrome,Ie和Remote。 Keys类提供键盘中的键,如RETURN,F1,ALT等。
import unittest
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
测试用例类
PythonOrgSearch
继承自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,那么WebDriver可能不知道它何时完全加载:
driver.get("http://www.python.org")
下一行是断言,确认标题中有“Python”字样:
self.assertIn("Python", driver.title)
WebDriver提供了许多使用其中一个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
每个测试方法后都会调用tearDown方法。 这是一个执行所有清理操作的地方。 在当前方法中,浏览器窗口关闭。 您也可以调用quit方法而不是close。 退出将退出整个浏览器,而close将关闭一个选项卡,但如果它是唯一打开的选项卡,默认情况下大多数浏览器将完全退出:
def tearDown(self):
self.driver.close()
最后一行是运行测试套件的一些样板代码:
if __name__ == "__main__":
unittest.main()