入门
简单用法
如果已经具备了Selenium&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
示例解释
selenium.webdriver 模块提供了WebDriver全部实现。目前支持WebDriver实现的是Firefox、Chrome、IE和Remote. Keys类提供键盘操作比如RETURN, F1,ALT等。 from selenium import webdriver form selenium.webdriver.common.keys import keys
接下来,火狐的WebDriver实例被创建。
driver = webdriver.Firefox()
driver.get方法会导航到url指定的页面。webdriver会等待页面完全加载后,把控制权还给test脚本。需要注意的是,如果页面中使用了大量的AJAX负载过大,webdriver可能不知道什么时间加载完成。
driver.get("http://www.python.org")
下一行断言确认包含"Python"字母在里面:
assert "Python" in driver.title
webdriver 提供一些如find_element_by_*的方法用于定位元素。例如,输入文本元素可以通过find_element_by_name方法使用名称属性来定位。定位方法会在后续进行详细解释。
elem = driver.find_element_by_name("q")
接下来,是发送关键信息,比较像从键盘输入。特殊关键信息可以通过selenium.webdriver.common.keys中的Keys 类实现。安全考虑,首先要确认输入区没有其他信息(如“搜索框”),以免影响搜索结果:
elem.clear()
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
提交页面后,可以看到搜索结果或没有找到。为了确保找到了一些结果,我们需要做一些断言:
assert "No results found." not in driver.page_source
最后,要关闭浏览器窗口。还可以通过调用quit方法去关闭。quit方法会退出整个浏览器,close会关闭一个标签页,默认情况下,大部分浏览器会关闭整个浏览器:
driver.close()
sample1: 测试百度首页的查询功能: 百度搜索框“” code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #!/bin/bash/env python
# -*- coding: utf-8 -*-
import sys
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
reload(sys)
sys.setdefaultencoding('utf8')
driver = webdriver.Firefox()
driver.get("https://www.baidu.com/")
assert "百度一下,你就知道" in driver.title
#elem = driver.find_element_by_name("wd") #locate by name
##elem = driver.find_element_by_id("kw") #locate by id
elem = driver.find_element_by_xpath("//*[@id='kw']") # locate by xpath
elem.clear() #
elem.send_keys("isoft")
elem.send_keys(Keys.RETURN)
driver.implicitly_wait(100)
assert "No results found." not in driver.page_source
time.sleep(10)
driver.close()
|
使用Selenium编写测试
Selenium 大部分情况下都是用来编写测试用例的。Selenium本身是不提供测试工具或框架的。可以通过Python的unittest 模块去编写case,另外还可以通过pt.test或nose框架。
下面是一个使用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()
可以运行以下命令进行验证:
python test_python_org_search.py
示例解析
最初,基本模块需要导入。unittest基于java的junit的内嵌模块。该模块提供了测试组织的框架。selenium.webdriver模块提供了WebDriver的所有实现。目前支持的是firefox chrome ie remote。Keys类提供了键盘输入如RETURN F1 ALT等.
import unittest
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
测试用例类继承自unittest.TestCase,通过这个方式说明这是一个测试用例:
class PythonOrgSearch(unittest.TestCase):
Setup是初始化的一部分,这个方法在进行编写测试用例之前被每个测试方法调用。这里以firfox webdriver为例。
def setUp(self):
self.driver = webdriver.Firefox()
这是一个测试用例的方法。这个测试用例方法总是characters 测试开始。第一行是创建一个本地driver,来源于setUp方法。
def test_search_in_python_org(self):
driver = self.driver
driver.get 方法会导航到URL指定的页面。Webdriver会等待页面加载完成。需要注意的是,如果页面中使用了大量的AJAX负载过大,webdriver可能不知道什么时间加载完成。
driver.get("http://www.python.org")
下一行断言确认包含"Python"字母在里面:
assert "Python" in driver.title
webdriver 提供一些如find_element_by_*的方法用于定位元素。例如,输入文本元素可以通过find_element_by_name方法使用名称属性来定位。定位方法会在后续进行详细解释。
elem = driver.find_element_by_name("q")
接下来,是发送关键信息,比较像从键盘输入。特殊关键信息可以通过selenium.webdriver.common.keys中的Keys 类实现。安全考虑,首先要确认输入区没有其他信息(如“搜索框”),以免影响搜索结果:
elem.clear()
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
提交页面后,可以看到搜索结果或没有找到。为了确保找到了一些结果,我们需要做一些断言:
assert "No results found." not in driver.page_source
tearDown方法每个测试方法之后都会调用。这是用来清理动作的地方。当前这个方法,实现了浏览器的关闭。同样可以调用quit方法替换close.quit方法有些地方是关闭一个标签页,默认情况下是关闭整个浏览器。
def tearDown(self):
self.driver.close()
最后是标准代码用于执行测试:
if __name__ == "__main__"
unittest.main()
sample 测试百度搜索 code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #!/bin/bash/env python
# -*- coding: utf-8 -*-
import sys
import unittest
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
reload(sys)
sys.setdefaultencoding('utf8')
class BaiduSearch(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Firefox()
def test_search_in_baidu(self):
driver = self.driver
driver.get("https://www.baidu.com")
self.assertIn("百度一下,你就知道", driver.title)
elem = driver.find_element_by_id("kw")
elem.clear()
elem.send_keys("isoft")
elem.send_keys(Keys.RETURN)
assert "No result found." not in driver.page_source
def tearDown(self):
self.driver.close()
if __name__ == "__main__":
unittest.main()
|
使用Selenium remote WebDriver
使用remote WebDriver之前需确保Selenium server在运行。启动该server命令:
java -jar selenium-server-standalone-2.x.x.jar
运行Selenium server时,会返回以下信息: 15:43:08.541 INFO - RemoteWebDriver instances should connect to: http://127.0.0.1:4444/wd/hub
上面的反馈信息说明可以使用这个URL连接到remote WebDriver.示例如下:
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapbilities
driver = webdriver.Remote(
command_executor='http://127.0.0.1:4444/wd/hub',
desired_capabilities=DesiredCapbilities.CHROME)
driver = webdriver.Remote(
command_executor='http://127.0.0.1:4444/wd/hub',
desired_capabilities=DesiredCapbilities.OPERA)
driver = webdriver.Remote(
command_executor='http://127.0.0.1:4444/wd/hub',
desired_capabilities=DesiredCapabilities.HTMLUNITWITHJS)
功能是个字典结构,可以通过字典来明确指定这些值:
driver = webdriver.Remote(
command_executor='http://127.0.0.1:4444/wd/hub',
desired_capabilities={'browserName': 'htmlunit',
'version':'2',
'javascriptEnabled': True})
Top^
上一篇Selenium主题1 下一篇Selenium主题3