环境搭建
1.python
下载地址
根据自己的操作系统32/64 位,选择相应的版本。
2.配置环境变量
修改我的电脑->属性->高级->环境变量->系统变量中的PATH为:
变量名:PATH
变量值:;C:\Python35;C:\Python35\Scripts;
3、安装selenium
3.1、通过pip 安装
C:\Users\fnngj>python3 -m pip install selenium
3.2、通过下载包安装
或者直接下载selenium包:
解压,cmd进入目录:
C:\selenium\selenium2.53.5> python3 setup.py install
三. 安装三大浏览器驱动driver
1.chromedriver 下载地址:
https://code.google.com/p/chromedriver/downloads/list
2.Firefox的驱动geckodriver 下载地址:
https://github.com/mozilla/geckodriver/releases/
3.IE的驱动IEdriver 下载地址:
http://www.nuget.org/packages/Selenium.WebDriver.IEDriver/
geckodriver
这是因为在Firefox高版本需要使用 geckodriver 来驱动,
不再使用Seleniu默认自带的Firefox webdriver。
python -m pip install PyMySQL
表示chrome浏览器版本为54.0.2840.99,但是chromedriver版本为2.9.248315。版本不兼容
网上找了遇到相同问题的解决办法 http://blog.youkuaiyun.com/u012246342/article/details/52860949
下载v2.24版本的chromedriver.exe替换原有的chromedriver.exe(下载地址: http://chromedriver.storage.googleapis.com/index.html?path=2.24/ )
重新运行脚本,第一次运行较慢,最终超时失败,第二次运行成功!!
初级
from selenium import webdriver # 导入webdriver包
driver = webdriver.Firefox() # 初始化一个火狐浏览器实例:driver
driver = webdriver.Chrome()
driver = webdriver.Ie()
driver.maximize_window() # 最大化浏览器
driver.implicitly_wait(8) # 设置隐式时间等待
driver.maximize_window() # 最大化浏览器
driver.get("https://www.baidu.com") # 通过get()方法,打开一个url站点
driver.quit() #关闭并退出浏览器
xpath
driver.find_element_by_xpath("//*[@id='kw']").send_keys("selenium") # 搜索输入框输入Selenium
driver.find_element_by_xpath("//*[@id='su']").click() #点击百度一下按钮
driver.find_element_by_id(
"kw"
)
driver.find_element_by_tag_name(
"form"
)
driver.find_element_by_link_text(
"新闻"
)
driver.find_element_by_partial_link_text(
"主页"
).click()
driver.find_element_by_class_name(
"s_ipt"
)
driver.find_element_by_name(
"wd"
)
driver.find_element_by_css_selector(
"#su"
)
driver.find_element_by_id(
"kw"
).send_keys(
"Selenium"
)
driver.find_element_by_id(
"kw"
).clear()
driver.refresh()
elem_news.click()
driver.back()
driver.forward()
driver.capabilities[
'version'
]
driver.current_url
driver.title
time.sleep(1)
driver.find_element_by_tag_name('body').send_keys(Keys.CONTROL + 't') # 触发ctrl + t
for i in driver.find_elements_by_xpath("//*/input[@type='radio']"):
i.click()
driver.find_element_by_xpath(
"//*[@name='memberPass']"
).click()
driver.set_window_size(1280,800)
是否选中
driver.find_element_by_xpath(
"//*[@id='news']"
).is_selected()
控件尺寸
search_btn = driver.find_element_by_id(
'su'
)
search_btn.size
全选
element = driver.find_element_by_tag_name(
'body'
)
element.send_keys(Keys.CONTROL +
'a'
)
退格删除
element = driver.find_element_by_id(
'kw'
)
element.send_keys(
"Selenium automation"
)
time.sleep(1)
element.send_keys(Keys.CONTROL+
'a'
)
element.send_keys(Keys.BACKSPACE)
element = driver.find_element_by_xpath(
"//*[@id='lg']/img"
)
actionChains = ActionChains(driver)
actionChains.context_click(element).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform()
执行js
driver.execute_script(
"window.alert('这是一个alert弹框。');"
)
切换窗口
driver.find_element_by_xpath(
"//*[@id='pane-news']/div/ul/li[1]/strong/a"
).click()
print
driver.current_window_handle
# 输出当前窗口句柄
handles = driver.window_handles
# 获取当前全部窗口句柄集合
print
handles
# 输出句柄集合
for
handle
in
handles:
# 切换窗口
if
handle != driver.current_window_handle:
print
'switch to second window'
,handle
driver.close()
# 关闭第一个窗口
driver.switch_to.window(handle)
#切换到第二个窗口
iframe切换
driver.switch_to.frame(
"iframe1"
)
alert弹窗
driver.switch_to_alert().accept()
# 点击弹出里面的确定按钮
#driver.switch_to_alert().dismiss() # 点击弹出上面的X按钮
获取全部图片信息
for
image
in
driver.find_elements_by_tag_name(
"img"
):
print
(image.text)
print
(image.size)
print
(image.tag_name)
获取href属性
for
link
in
driver.find_elements_by_xpath(
"//*[@href]"
):
print
(link.get_attribute(
'href'
))
保存截图
driver.get_screenshot_as_file(
"C:\\Users\\你的账户名\\Desktop\\baidu.png"
)
中级
类、函数、模快调用
1. 类的定义,class开头的就表示这是一个类,小括号里面的,表示这个类的父类,涉及到继承,默认object是所有类的父类。python中定义类,小括号内主要有三种:
1. 具体一个父类,2. object 3. 空白
2. 函数或方法的定义, def开头就表示定义一个函数,方法包括,实例方法,
类方法,静态方法,
注意看
类方法和静态方法定义的时候上面有一个@标记。
3. 对象调用方法和类调用方法的使用。
示例:
class ClassA(object):
string1 = "这是一个字符串。"
def instancefunc(self):
print ('这是一个实例方法。')
print (self)
@classmethod
def classfunc(cls):
print ('这是一个类方法。')
print (cls)
@staticmethod
def staticfun():
print ('这是一个静态方法。')
test = ClassA() # 初始化一个ClasssA的对象,test是类ClassA的实例对象
test.instancefunc() # 对象调用实例方法
test.staticfun() # 对象调用静态方法
test.classfunc() # 对象调用类方法
print test.string1 # 对象调用类变量
ClassA.instancefunc(test) # 类调用实例方法,需要带参数,这里的test是一个对象参数
ClassA.instancefunc(ClassA) # 类调用实例方法,需要带参数,这里的ClassA是一个类参数
ClassA.staticfun() # 类调用静态方法
ClassA.classfunc() # 类调用类方法
super用来执行父类中的函数
命名规则
python中默认规则,包名和文件名都是小写,类名称单词首字母大写,函数名称小写,多个字母下划线隔开。
入口函数
if
__name__ ==
'__main__'
:
构造函数
__init_
读取配置文件
import
ConfigParser
config = ConfigParser.ConfigParser()
file_path = os.path.dirname(os.path.abspath('.')) + '/config/config.ini'
config.read(file_path)
browser = config.get("browserType", "browserName")
url = config.get("testServer", "URL")
获取时间
time.time()
time.localtime()
time.strftime(
'%Y-%m-%d %H:%M:%S'
, time.localtime(
字符串切割
search_result_string.split(
'约'
)[1]
日志
- 指定保存日志的文件路径,日志级别,以及调用文件
- 将日志存入到指定的文件中
- :param logger:
- """
- # 创建一个logger
- self.logger = logging.getLogger(logger)
- self.logger.setLevel(logging.DEBUG)
- # 创建一个handler,用于写入日志文件
- rq = time.strftime('%Y%m%d%H%M', time.localtime(time.time()))
- log_path = os.path.dirname(os.getcwd()) + '/Logs/'
- log_name = log_path + rq + '.log'
- fh = logging.FileHandler(log_name)
- fh.setLevel(logging.INFO)
- # 再创建一个handler,用于输出到控制台
- ch = logging.StreamHandler()
- ch.setLevel(logging.INFO)
- # 定义handler的输出格式
- formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
- fh.setFormatter(formatter)
- ch.setFormatter(formatter)
- # 给logger添加handler
- self.logger.addHandler(fh)
- self.logger.addHandler(ch)
继承
class
ClassB(ClassA):
unittest测试单元
所有的测试函数都要test开头
测试固件(test fixture)
一个测试固件包括两部分,执行测试代码之前的准备部分和测试结束之后的清扫代码。这两部分一般用函数setUp()和tearDown()表示。
测试用例(test case)
一个测试用例,包括测试固件,和具体测试业务的函数或者方法
测试套件 (test suite)
就是很多测试用例的集合
测试执行器 (test runner)
用来执行加载测试用例,并执行用例,且提供测试输出的一个组建
runner=unittest.TextTestRunner()
runner.run(suite
POM 页面与逻辑分离(基类+业务类+测试类)
加载测试用例到测试套件
suite = unittest.TestSuite()
suite.addTest(BaiduSearch(
'test_baidu_search'
))
一次性加载一个类文件下所有测试用例到suite中
suite = unittest.TestSuite(unittest.makeSuite(BaiduSearch))
加载指定包下的所有用例
suite = unittest.TestLoader().discover(
"testsuites"
)
生成测试报告HTMLTestRunner